04-JSP的內建物件以及四大作用域
阿新 • • 發佈:2018-12-15
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專案中訪問, 伺服器關閉就玩完了.