JSP(3) - 9個JSP內置對象 - 小易Java筆記

1、9個JSP內置對象

內置對象引用名稱     對應的類型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession(有開關的:page指令的session屬性的取值,默認是true創建)
exception java.lang.Throwable(有開關的:page指令的isErrorPage屬性改爲true)
page this(當前Servlet對象)
out JspWriter
pageContext javax.servlet.jsp.PageContext(非常重要)
==> 注:前7個和servlet差不多,後3箇中pageContext比較重要。這些對象都在jsp文件對應翻譯成的.java文件中的_jspservice()方法中聲明瞭的,故是局部變量,每個jsp頁面有自己的對象

2、out對象詳解

(1)out隱式對象用於向客戶端發送文本數據

(2)out對象是通過調用pageContext對象的getOut方法返回的,其作用和用法與ServletResponse.getWriter方法返回的PrintWriter對象非常相似

(3)JSP頁面中的out隱式對象的類型爲JspWriter,JspWriter相當於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性可以調整它的緩存大小,甚至關閉它的緩存

(4)只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象纔去調用ServletResponse.getWriter()方法,並通過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:

==> 設置page指令的buffer屬性關閉了out對象的緩存功能

==> out對象的緩衝區已滿(並且可以自動刷新,即默認autoFlush=true;如果autoFlush=false,則不自動刷新,新數據會替換out緩存中的數據,直到頁面結束)

==> 整個JSP頁面結束

(5)圖解

JspWrite緩存原理 - 小易

3、pageContext對象詳解

(1)本身是一個域對象。同時還能操作其他三個域對象(PageContext ServletRequest HttpSession ServletContext)

①本身表示的域範圍是本頁面

void setAttribute(String name,Object value)

Object getAttribute(String name)

void removeAttribute(String name)

②操作其他的三個域對象

void setAttribute(String name,Object value,int scope)

Object getAttribute(String name,int scope)

void removeAttribute(String name,int scope)

注 : 參數int scope是由PageContext類提供的靜態變量規定的,取值爲

==> PageContext.PAGE_SCOPE:頁面範圍(是PageContext本身中的那個Map,代號page)

==> PageContext.REQUEST_SCOPE:請求範圍(是ServletRequest中的那個Map,代號request)

==> PageContext.SESSION_SCOPE:會話範圍(是HttpSession中的那個Map,代號session)

==> PageContext.APPLICATION_SCOPE:應用範圍(是ServletContext中的那個Map,代號application)

(非常有用)Object findAttribute(String name):依次按照page request session application範圍搜索指定名稱的對象,找到爲止

(2)獲取其他8個隱式對象

==> getRequest方法返回request隱式對象

==> getResponse方法返回response隱式對象

==> getServletConfig方法返回config隱式對象

==> getServletContext方法返回application隱式對象

==> getSession方法返回session隱式對象

==> getException方法返回exception隱式對象

==> getPage方法返回page隱式對象

==> getOut方法返回out隱式對象

(3)提供了轉發和包含的方法

pageContext.forward("url"); (相對於servlet的轉發更方便,由服務器負責轉發,也是隻爲一次請求)

pageContext.include("url");

==> servlet中的轉發 : request.getRequestDispatcher("url").forward(request,response);

==> 和servlet一樣,forward由服務器負責轉發,所以url是給服務器用的,如果用絕對路徑(加/),就不需要加項目名

4、out實例

實例1:a1.jsp的部分源碼
	<%@ page pageEncoding="UTF-8"%>
	<body>
		<%
			out.print("aaa");
			response.getWriter().write("bbb");
		%>
	</body>
結果:bbbaaa
-----------------------------------------
實例2:b1.jsp的部分源碼
	<%@ page pageEncoding="UTF-8"%>
	<body>
		<%
			out.print("aaa");
			out.flush();
			response.getWriter().write("bbb");
		%>
	</body>
結果:aaabbb
-----------------------------------------
實例3:c1.jsp的部分源碼
	<%@ page pageEncoding="UTF-8" buffer="none"%>
	<body>
		<%
			out.print("aaa");
			response.getWriter().write("bbb");
		%>
	</body>
結果:
-----------------------------------------
實例4:d1.jsp的部分源碼
	<%@ page pageEncoding="UTF-8"%>
	<body>
		<%
			response.getWriter().write("aaa");
			out.print("bbb");
			response.getWriter().write("ccc");
		%>
	</body>
結果:aaacccbbb

5、pageContext實例

實例1:
a1.jsp源碼
	<body>
		<%
			pageContext.setAttribute("username", "小易");
		%>
		利用pageContext對象的getAttribute方法從a1.jsp(此頁面)獲得的username的值是:
		<%
			out.print(pageContext.getAttribute("username"));
		%>
	</body>
a2.jsp源碼
	<body>
		pageContext對象只針對本頁面,所有想在a2.jsp中利用pageContext.getAttribute("username")
		是獲取不到a1.jsp中的值,所以結果是:
		<%
			out.print(pageContext.getAttribute("username"));
		%>
	</body>
訪問http://127.0.0.1:8080/testJsp/pagecontext/a1.jsp
==>輸出:利用pageContext對象的getAttribute方法從a1.jsp(此頁面)獲得的username的值是: 小易
訪問http://127.0.0.1:8080/testJsp/pagecontext/a2.jsp
==>輸出:pageContext對象只針對本頁面,所有想在a2.jsp中利用pageContext.getAttribute("username") 是獲取不到a1.jsp中的值,所以結果是: null
-------------------------------------------------------------
實例2:
b1.jsp源碼
	<body>
		<%
			pageContext.setAttribute("username", "小易SESSION", PageContext.SESSION_SCOPE);
		%>
	<a href="/testJsp/pagecontext/b2.jsp">訪問b2.jsp</a>
	</body>
b2.jsp源碼
	<body>
		在b2.jsp中利用pageContext操作ServletRequest域對象來獲取b1.jsp中的username的值,結果爲:
		<%
			//或者爲session.getAttribute("username");
			out.print(pageContext.getAttribute("username",PageContext.SESSION_SCOPE));
		%>
	</body>
先訪問http://127.0.0.1:8080/testJsp/pagecontext/b1.jsp
再訪問http://127.0.0.1:8080/testJsp/pagecontext/b2.jsp
==>輸出:在b2.jsp中利用pageContext操作ServletRequest域對象來獲取b1.jsp中的username的值,結果爲: 小易SESSION
-------------------------------------------------------------
實例3:
c1.jsp源碼
	<body>
		<%
			pageContext.setAttribute("username", "小易page");
			pageContext.setAttribute("username", "小易request", PageContext.REQUEST_SCOPE);
			pageContext.setAttribute("username", "小易session", PageContext.SESSION_SCOPE);
			pageContext.setAttribute("username", "小易application", PageContext.APPLICATION_SCOPE);
			
			//重定向,url是給瀏覽器使用的,所以絕對路徑要加項目名
			response.sendRedirect("/testJsp/pagecontext/c3.jsp");
		%>
	</body>
c2.jsp源碼
	<body>
		<%
			pageContext.setAttribute("username", "小易page");
			pageContext.setAttribute("username", "小易request", PageContext.REQUEST_SCOPE);
			pageContext.setAttribute("username", "小易session", PageContext.SESSION_SCOPE);
			pageContext.setAttribute("username", "小易application", PageContext.APPLICATION_SCOPE);
			
			//轉發(這種方法更方便),url是給服務器使用的,所以絕對路徑不用加項目名
			pageContext.forward("/pagecontext/c3.jsp");
		%>
	</body>
c3.jsp源碼
	<body>
		findAttribute是按照page request session application的順序來查找的,找到就停止。
		結果爲:
		<%
			//pageContext.getOut()獲取out對象,同理pageContext還可以獲取JSP的其他8個內置對象
			pageContext.getOut().print(pageContext.findAttribute("username"));
		%>
	</body>
訪問http://127.0.0.1:8080/testJsp/pagecontext/c1.jsp
==>輸出:findAttribute是按照page request session application的順序來查找的,找到就停止。 結果爲: 小易session
訪問http://127.0.0.1:8080/testJsp/pagecontext/c2.jsp
==>輸出:findAttribute是按照page request session application的順序來查找的,找到就停止。 結果爲: 小易request





發佈了36 篇原創文章 · 獲贊 15 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章