jsp基本語法及內建物件的簡單介紹
JSP全稱Java Server Pages,是一種動態網頁開發技術。
jsp生命週期:
1.編譯階段:
當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個檔案。如果這個檔案沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP檔案。編譯jsp檔案的過程是把它轉換成servlet進行編譯的
2.初始化階段:
執行服務前呼叫 jspInit()方法初始化,可以複寫以實現自己想要的功能。
3.執行階段:
完成初始化後,JSP引擎將會呼叫 _jspService()方法。這一階段描述了JSP生命週期中一切與請求相關的互動行為,直到被銷燬。
4.銷燬階段:
呼叫與JSP對應的servlet例項的銷燬方法,然後銷燬servlet例項
jsp基本語法:
1.註釋:
第一種:<%-- 註釋 --%> JSP註釋,註釋內容不會被髮送至瀏覽器甚至不會被編譯
第二種:< !-- 註釋 --> HTML註釋,通過瀏覽器檢視網頁原始碼時可以看見註釋內容
2.宣告:
在jsp中宣告格式:<%! 宣告的變數、函式等 %>
例如:
<%!
int a = 0;
public void add(int a,int b){}
%>
3.表示式:
<%=expression%>
今天是:<%=(new java.util.Date()).toLocaleString()% >
4.程式段:
jsp程式段是包含在<%%>之間的
形如<%程式段%>
5.jsp指令:
&& page指令
置於最頂端,例如:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
language 預設是java
import 用於匯入相應的包,當需要匯入多個包時,中間應用逗號隔開
示例:import="java.io.*,java.util.*"
session=”true(false)”
buffer=”none|8kb|sizekb”,用於指定輸出緩衝。該值不為none時,意為需要輸出緩衝,此時伺服器不會直接輸出內容到瀏覽器,而是等待快取滿或者指令碼執行完畢才會輸出顯示。該設定預設值為8kb。
antoflush=”true|false”,指明快取是否自動清除。預設為true,若手動設定為false,快取溢位會丟擲異常。
errorPage=”URL”,用於指定當前頁面產生異常後,重定向的頁面。
isErrorPage=”true|false”,用於指定當前頁面可否用作其他頁面的錯誤處理頁面。預設值為false。
&& include指令
用於包含另一.jsp檔案,被包含的檔案和當前的檔案形成一個整體。include包含的檔案會在編譯的時候被引入,不管是當前檔案或者是include檔案有更改都會重新編譯。
基本語法:
<%@ include file=" "%>
很簡單的示例:
date.jsp
<%
Date date = new Date();
%>
<%=date.toString() %>
includeTest.jsp
今天是:<%@ include file = "date.jsp" %>
結果:
注意: 原始檔和包含檔案的變數和方法等不能重名,因為二者最後是生成同一個檔案。
&& taglib指令
<%@ taglib … %> 引入標籤庫的定義,可以是自定義標籤
6.jsp動作指令
動作指令是在jsp被客戶端請求時動態執行的,其基本語法為:<jsp:action_name attribute="value" />
語法 | 描述 |
---|---|
jsp:include | 用於在當前頁面中包含靜態或動態資源 |
jsp:useBean | 尋找和初始化一個JavaBean元件 |
jsp:setProperty | 設定 JavaBean元件的值 |
jsp:getProperty | 將 JavaBean元件的值插入到 output中 |
jsp:forward | 從一個JSP檔案向另一個檔案傳遞一個包含使用者請求的request物件 |
jsp:plugin | 用於在生成的HTML頁面中包含Applet和JavaBean物件 |
jsp:element | 動態建立一個XML元素 |
jsp:attribute | 定義動態建立的XML元素的屬性 |
jsp:body | 定義動態建立的XML元素的主體 |
jsp:text | 用於封裝模板資料 |
常用動作指令簡析:
&& jsp:include
基礎語法:<jsp:include page=" " />
page是包含在頁面中的相對URL地址。這裡的page是一個屬性,要區別於page指令
注意: 這裡的動作指令include和剛才的是兩回事,具體來說就是,include指令是包含另一個檔案,二者最終形成的是一個 .java檔案,而include動作指令編譯時會生成兩個 .java檔案,是動態包含,即include動作指令可以對動態資源進行包含 ,如果被包含的檔案中匯入了某個包,那麼在此檔案中也要匯入那個包。
&& jsp:forward
該指令的作用是:從該指令處停止當前頁面的繼續執行,而轉向其他的一個JSP頁面。
&& jsp:param 經常與jsp:forward一起使用。
基本語法:<jsp:param name="" value="" />
jsp內建物件:
物件 | 描述 |
---|---|
request | HttpServletRequest類的例項 |
response | HttpServletResponse類的例項 |
out | PrintWriter類的例項,用於把結果輸出至網頁上 |
session | HttpSession類的例項 |
application | ServletContext類的例項,與應用上下文有關 |
config | ServletConfig類的例項 |
pageContext | PageContext類的例項,提供對JSP頁面所有物件以及名稱空間的訪問 |
page | 類似於Java類中的this關鍵字 |
Exception | Exception類的物件,代表發生錯誤的JSP頁面中對應的異常物件 |
還可以用這張圖進行簡單解釋:
&& request內建物件
客戶端的請求資訊被封裝在request物件中,通過它才能瞭解到客戶的需求,然後做出響應。它是HttpServletRequest類的例項。request物件具有請求域,即完成客戶端的請求之前,該物件一直有效。常用方法如下:
常用方法 | 方法介紹 |
---|---|
String getParameter(String name) | 返回name指定引數的引數值? |
String[] getParameterValues(String name) | 返回包含引數name的所有值的陣列 |
void setAttribute(String,Object) | 儲存此請求中的屬性 |
Object getAttribute(String name) | 返回指定屬性的屬性值 |
String getContentType() | 得到請求體的MIME型別 |
String getProtocol() | 返回請求用的協議型別及版本號 |
String getServerName() | 返回接受請求的伺服器主機名 |
int getServerPort() | 返回伺服器接受此請求所用的埠號 |
String getCharacterEncoding() | 返回字元編碼方式 |
void setCharacterEncoding() | 設定請求的字元編碼方式 |
int getContentLength() | 返回請求體的長度(以位元組數) |
String getRemoteAddr() | 返回傳送此請求的客戶端IP地址 |
String getRealPath(String path) | 返回一虛擬路徑的真實路徑 |
String request.getContextPath() | 返回上下文路徑 |
參照慕課往網上的request示例如下
登錄檔單頁面:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>request內建物件</title>
</head>
<body>
<h1>註冊頁面</h1>
<hr>
<form name="requestForm" action="reg1.jsp" method="post">
<table>
<tr>
<td>
使用者名稱:
</td>
<td>
<input type="text" name="username"/>
</td>
</tr>
<tr>
<td>
密碼:
</td>
<td>
<input type="checkbox" name="favorite" value="read"/>讀書
<input type="checkbox" name="favorite" value="music"/>音樂
<input type="checkbox" name="favorite" value="travel"/>旅遊
<input type="checkbox" name="favorite" value="internet"/>上網
</td>
</tr>
<tr>
<td cospan="2" ><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</html>
註冊成功頁面:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>註冊成功頁面</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
<h1>註冊成功,歡迎您 <%=request.getParameter("username") %></h1>
<hr>
<%
request.setAttribute("password","123456");
%>
使用者名稱:<%=request.getParameter("username") %><br>
愛好:<%
if(request.getParameterValues("favorite") != null)
{
String[] s = request.getParameterValues("favorite");
for(String ss : s)
out.println(ss + " ");
}
%><br>
password為:<%=request.getAttribute("password") %><br>
請求體的MIME型別為:<%=request.getContentType() %><br>
請求用的協議型別及版本號為:<%=request.getProtocol() %><br>
接受請求的伺服器主機名為:<%=request.getServerName() %><br>
伺服器接受此請求所用的埠號為:<%=request.getServerPort() %><br>
字元編碼方式為:<%=request.getCharacterEncoding() %><br>
請求體的長度為:<%=request.getContentLength() %>Bytes<br>
傳送此請求客戶端IP地址為:<%=request.getRemoteAddr() %><br>
請求的真實路徑為:<%=request.getRealPath("reg1.jsp") %><br> <%--現在已基本不再使用 --%>
請求的上下文路徑為:<%=request.getContextPath() %><br>
</body>
</html>
結果如下:
注意: request裡的變數可以跨越forward前後的兩頁。但是隻要重新整理頁面,它們就重新計算了。
&& response內建物件
重定向和轉發: 重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來呼叫目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器傳送一個新的頁面請求。因為,當你使用重定向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,因為瀏覽器還得發出一個新的請求。同時,由於重定向方式產生了一個新的請求,所以經過一次重 定向後,request內的物件將無法使用。
重定向:以前的request中存放的變數全部失效,並進入一個新的request作用域。
轉發:以前的request中存放的變數不會失效,就像把兩個頁面拼到了一起。
response.sendRedirect(“request.jsp”); 此呼叫是重定向。此方法重定向的訪問過程結束後,瀏覽器位址列中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;此方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求。
request.getRequestDispatcher(“request.jsp”).forward(request,response); 此呼叫是轉發,此方法的請求轉發過程結束後,瀏覽器位址列保持初始的URL地址不變,注意之前也說過轉發的一種方式 <jsp:forward page=" "/>
注意:轉發之後request不能再呼叫之前轉發之前頁面的元素,也就是說轉發之後request會被替代。此方法在伺服器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在伺服器程式內部發生了轉發行為。
常用方法:
方法 | 用法 |
---|---|
String getCharacterEncoding() | 返回響應用的是何種字元編碼 |
ServletOutputStream getOutputStream() | 返回響應的一個二進位制輸出流 |
PrintWriter getWriter() | 返回可以向客戶端輸出字元的一個物件 |
void setContentLength(int len) | 設定響應頭長度 |
void setContentType(String type) | 設定響應的MIME型別 |
sendRedirect(java.lang.String location) | 重新定向客戶端的請求 |
&& out內建物件
out物件是JspWriter類的例項,是向客戶端輸出內容常用的物件
常用方法:
方法 | 用處 |
---|---|
void clear() | 清除緩衝區的內容 |
void clearBuffer() | 清除緩衝區的當前內容 |
void flush() | 清空流 |
int getBufferSize() | 返回緩衝區以位元組數的大小,如不設緩衝區則為0 |
int getRemaining() | 返回緩衝區還剩餘多少可用 |
boolean isAutoFlush() | 返回緩衝區滿時,是自動清空還是丟擲異常 |
void close() | 關閉輸出流 |
例項:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Out內建物件</h1>
<%
out.println("靜夜思<br>");
out.println("<br>");
out.println("床前明月光<br>");
out.println("疑是地上霜<br>");
out.println("舉頭望明月<br>");
out.println("低頭思故鄉<br>");
%>
緩衝區大小為:<%=out.getBufferSize() %>
<br>
剩餘緩衝區大小為:<%=out.getRemaining() %>
<br>
是否自動重新整理:<%=out.isAutoFlush() %>
</body>
</html>
&& session內建物件
session物件指的是客戶端與伺服器的一次會話,從客戶連到伺服器的一個WebApplication開始, 直到客戶端與伺服器斷開連線為止。它是HttpSession類的例項。當一個客戶訪問一個伺服器時,可能會在這個伺服器的幾個頁面之間切換,伺服器應當通過某種辦法知道這是一個客 戶,就需要Session物件。
常用方法:
方法 | 用法 |
---|---|
long getCreateTime() | 返回SESSION建立時間 |
public String getId() | 返回SESSION建立時JSP引擎為它設的唯一ID號 |
public Object setAttribute(String name,Object value) | 使用指定名稱將物件繫結到此會話 |
public Object getAttribute(String name) | 返回與此會話中的指定名稱繫結在一起的物件,如果沒有物件繫結在該名稱下,則返回null |
String[] getValueNames() | 返回一個包含在此SESSION中所有可用屬性的陣列 |
void setMaxInactiveInterval() | 設定兩次請求間隔多長時間此SESSON被取消(單位秒) |
int getMaxInactiveInterval() | 返回兩次請求間隔多長時間此SESSON被取消(單位秒) |
簡單示例:
session——page1.jsp
<%@ page language="java" import="java.text.* ,java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>session內建物件</h1>
<%
SimpleDateFormat sdt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("username", "admin");
session.setAttribute("Age", 20);
session.setAttribute("sex", "femle/male");
//設定當前session最大生存週期
session.setMaxInactiveInterval(10);
%>
Session建立時間:<%=sdt.format(d) %><br>
Session的ID編號:<%=session.getId() %><br>
從Session中獲取使用者名稱:<%=session.getAttribute("username") %>
<br>
<br>
<a href="session_page2.jsp " target="_blank">跳轉到Session_page2.jsp</a>
</body>
</html>
session——page2.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
Session的ID編號:<%=session.getId() %><br>
從Session中獲取使用者名稱:<%=session.getAttribute("username") %><br>
Session中儲存的屬性有:
<%
String[] s = session.getValueNames();
for(int i = 0; i < s.length; i++)
out.println(s[i] + " ");
%>
</body>
</html>
&& application內建物件
application實現了使用者間資料的共享,可存放全域性變數,開始於伺服器啟動,終止於伺服器關閉,在使用者的前後連線或不同連線之間,可以對application的物件的同一屬性進行操作,在任何地方對application物件屬性的操作,都會影響到其他使用者對此的訪問。
常用方法:
方法 | 用法 |
---|---|
Object getAttribute(String name) | 返回給定名的屬性值 |
Enumeration getAttributeNames() | 返回所有可用屬性名的列舉 |
void setAttribute(String name,Object obj) | 設定屬性的屬性值 |
void removeAttribute(String name) | 刪除一屬性及其屬性值 |
String getServerInfo() | 返回JSP(SERVLET)引擎名及版本號 |
String getRealPath(String path) | 返回一虛擬路徑的真實路徑 |
ServletContext getContext(String uripath) | 返回指定WebApplication的application物件 |
int getMajorVersion() | 返回伺服器支援的Servlet API的最大版本號 |
int getMinorVersion() | 返回伺服器支援的Servlet API的最大版本號 |
String getMimeType(String file) | 返回指定檔案的MIME型別 |
URL getResource(String path) | 返回指定資源(檔案及目錄)的URL路徑 |
InputStream getResourceAsStream(String path) | 返回指定資源的輸入流 |
RequestDispatcher getRequestDispatcher(String uripath) | 返回指定資源的RequestDispatcher物件 |
Servlet getServlet(String name) | 返回指定名的Servlet |
Enumeration getServlets() | 返回所有Servlet的列舉 |
Enumeration getServletNames() | 返回所有Servlet名的列舉 |
void log(String msg) | 把指定訊息寫入Servlet的日誌檔案 |
void log(Exception exception,String msg) | 把指定異常的棧軌跡及錯誤訊息寫入Servlet的日誌檔案 |
void log(String msg,Throwable throwable) | 把棧軌跡及給出的Throwable異常的說明資訊 寫入Servlet的日誌檔案 |
例項:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>application內建物件</h1>
<%
application.setAttribute("city","南京");
application.setAttribute("postcode","10000");
application.setAttribute("email","[email protected]");
%>
所在城市為:<%=application.getAttribute("city") %><br>
application中的屬性有:<%
Enumeration<String> en = application.getAttributeNames();
while(en.hasMoreElements()){
out.println(en.nextElement() + " ");
}
%><br>
JSP版本號:<%=application.getServerInfo() %><br>
</body>
</html>
&& page內建物件
page物件就是指向當前JSP頁面本身,有點象類中的this指標,它是java.lang.Object類的例項
常用方法:
方法 | 用法 |
---|---|
class getClass | 返回此Object的類 |
int hashCode() | 返回此Object的hash碼 |