1. 程式人生 > >jsp基本語法及內建物件的簡單介紹

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)”

,用於指明session物件是否可用預設為true
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" %>

結果:
ioAMqO.png
注意: 原始檔和包含檔案的變數和方法等不能重名,因為二者最後是生成同一個檔案。
&& 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頁面中對應的異常物件

還可以用這張圖進行簡單解釋:
iodyb8.png
&& 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 + "&nbsp;&nbsp;");
	}
	
%><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>

結果如下:
ioddCd.png
iodU4H.png
注意: 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>

結果:
iowzWj.png

&& 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] + "&nbsp;&nbsp;");
		%>
</body>
</html>

結果:
ioBzMn.png
點選連結後:
ioDSrq.png

&& 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() + "&nbsp;&nbsp;");
		}
	%><br>
	JSP版本號:<%=application.getServerInfo() %><br>
</body>
</html>

結果:
ioDMdK.png

&& page內建物件
page物件就是指向當前JSP頁面本身,有點象類中的this指標,它是java.lang.Object類的例項
常用方法:

方法 用法
class getClass 返回此Object的類
int hashCode() 返回此Object的hash碼