1. 程式人生 > >04-JSP的內建物件以及四大作用域

04-JSP的內建物件以及四大作用域

JSP的內建物件以及四大作用域


Why?: 在jsp頁面中,有些物件需要頻繁的使用, 若每次都是重新建立這些物件會非常的麻煩,
為了簡化Web程式的發開, JSP2.0規範中提供了9個內建物件, 是JSP預設建立的, 所謂內建物件,就是我們可以直接在jsp頁面中使用這些物件,不用建立,可以直接在JSP頁面中使用. 大體如下表:

名稱 型別 描述
out javax.servlet.jsp.JspWriter 用於頁面輸出
request javax.servlet.http.HttpServletRequest 得到使用者請求資訊
response java.servlet.http.HttpServletResponse 伺服器想客戶端的響應資訊
config javax.servlet.ServletConfig 伺服器配置,可以獲得初始化引數
session javax.servlet.http.HttpSession 用來儲存使用者的資訊
application javax.servlet.ServletContext 所有使用者共享的資訊
page java.lang.Object 指當前頁面轉換後的Servlet類的例項
pageContext javax.servlet.jsp.PageContext JSP的頁面容器
exception java.lang.Throwable 表示JSP頁面所發生的異常, 在錯誤頁中才起作用

1. out物件

out物件是javax.servlet.jsp.JspWriter類的例項物件, 作用於ServletResponse.getWriter() 方法返回的PrintWriter物件非常相似, 都是用來向客戶端傳送文字形式的實體內容. out物件的型別為JspWriter, 它相當於一種帶快取功能的printWriter.
在這裡插入圖片描述

從上圖可以看出, 在JSP 頁面中, 通過out隱式物件寫入資料相當於將資料插入到JspWriter的物件的緩衝區中(也可叫做out緩衝區), 只有呼叫了ServletResponse.getWriter()方法, 緩衝區的資料才能真正的寫入到Servlet引擎所提供的快取區中.

舉個栗子演示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="8kb"%>
<!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>
		aaaaaaaaaaaaaaaaaaa
	<%
		out.write("bbbbbbbbbbb");
		response.getWriter().write("ccccccccccc");
	%>
	<%="dddddddddddddddddd" %>

</body>
</html>

分析以上程式碼:

  • page指令中的 buffer 屬性預設是 8 kd , 所指的就是 out 緩衝區(JspWriter) 的大小為 8 kb. 如果設定為0 代表關閉緩衝區, 內容直接寫到response緩衝區.
  • aaaaaa 是頁面直接輸出, jsp內建物件out.write() 輸出bbbbbb, jsp表示式輸出dddd. 這些都是輸出到out緩衝區. 最終都要到通過ServletResponse呼叫getWriter()方法寫到response緩衝區中(因為,tomcat是去response快取取出資訊的,而不會去out緩衝區中). response.getWriter().println() 是直接寫在response緩衝區中的.

根據以上分析,故頁面的輸出結果就是如下圖:
在這裡插入圖片描述

如果把out緩衝區關掉, 即 page中的指令 buffer=“0kb”
在這裡插入圖片描述
因為關掉了out緩衝區,故直接就寫在了 response緩衝區中, Servlet引擎按資料的存放順序輸出內容.

2. pageContext物件

2.1. 獲得其它隱式物件

在JSP頁面中, 使用pageContext物件可以獲取JSP得其他8個隱式物件. pageContext物件是javax.servlet.jsp.PageContext 類的例項物件, 它代表當前JSP頁面的執行環境, 並提供了一系列使用者獲取其他隱式物件的方法.如下圖:

方法名 功能描述
JspWriter getOut() 獲取out隱式物件
Object getPage() 獲取page隱式物件
ServletRequest getRequest() 獲取request隱式物件
ServletResponse getResponse() 獲取response()隱式物件
HttpSession getSession() 獲取session 隱式物件
Exception getException() 獲取exception 隱式物件
ServletConfig getServletConfig() 獲取config 隱式物件
ServletContext getServletContext() 獲取application隱式物件

2.2 pageContext 儲存資料

通過操作屬性來實現儲存資料. 下表為pageContext操作屬性的相關方法

方法名稱 功能描述
void setAttribute(String name, Object value, int scope) 設定pageContext物件的屬性
Object getAttribute(String name , int scope) 獲取pageContext物件的屬性
void removeAttribute(Stirng name , int scope) 刪除指定範圍內名稱為name的屬性
void removeAttribute(String name) 刪除所有範圍內名稱為name 的屬性
Object findAttribute(String name ) 從4個域物件中查詢名稱為name的屬性

其中name為指定的屬性的名稱, scope是指定的屬性的作用範圍
pageContext物件的作用範圍有4個值 如下:

  • PageContext.PAGE_SCOPE: 表示頁面範圍
  • PageContext.REQUEST_SCOPE : 表示請求範圍
  • PageContext.SESSION_SCOPE : 表示會話範圍
  • PageContext.APPLICATION_SCOPE : 表示web應用程式範圍
    注: 當使用findAttribute() 方法查詢名稱為name的屬性時, 會按照 page, request , session , application 即從小到大的順序查詢, 如果找到, 則返回屬性的名稱, 否則返回null.

舉個栗子:

<body>
	<%
	      // 獲取request物件
	      HttpServletRequest  req = (HttpServletRequest) pageContext.getRequest();
	      // 設定request範圍內屬性
	      req.setAttribute("param" , "aaa" );
		//使用pageContext向其它域中存資料 示例:
		request.setAttribute("name", "san");
		pageContext.setAttribute("name", "sun");
		pageContext.setAttribute("name", "lizi",PageContext.REQUEST_SCOPE);
		pageContext.setAttribute("name", "laowang", PageContext.SESSION_SCOPE);
		pageContext.setAttribute("name", "xiaohua", PageContext.APPLICATION_SCOPE);
	%>
	<%=request.getAttribute("name") %>
	<%=pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%>
	<!-- findAttribute會從小到大搜索域的範圍中的name -->
	<!-- page域<request域<session域<application域 -->
	<%=pageContext.findAttribute("name") %>
	<%
		pageContext.getRequest();
		pageContext.getOut();	
		//method(pageContext);
	%>
</body>

3. JSP的四個域範圍:

PageContext常量名 描述 作用域名稱 域物件型別
PageScope 當前頁面中有效 pageContext PageContext
RequestScope 一次請求範圍 request HttpServletRequest
SessionScope 一次會話範圍 session HttpSession
AppticationScope 應用範圍 application ServletContext
  • page: 表示當前頁面, 我們作為開發通常不用, jsp標籤底層使用
  • request: 表示一次請求.通常一次請求就一個頁面,但是如果使用請求轉發,會涉及到多個頁面
  • session: 表示一次會話. 可在多次請求之間共享資料
  • application: 表示一個web應用. 可在整個web專案中訪問, 伺服器關閉就玩完了.