每個(gè)JSP 頁面在第一次被訪問時(shí)竟贯,WEB容器都會(huì)把請求交給JSP引擎(即一個(gè)Java程序)去處理。JSP引擎先將JSP翻譯成一個(gè)_jspServlet(實(shí)質(zhì)上也是一個(gè)servlet) 捏卓,然后按照servlet的調(diào)用方式進(jìn)行調(diào)用惑畴。
由于JSP第一次訪問時(shí)會(huì)翻譯成servlet诱渤,所以第一次訪問通常會(huì)比較慢蚌铜,但第二次訪問,JSP引擎如果發(fā)現(xiàn)JSP沒有變化饺谬,就不再翻譯捂刺,而是直接調(diào)用,所以程序的執(zhí)行效率不會(huì)受到影響募寨。
JSP引擎在調(diào)用JSP對應(yīng)的_jspServlet時(shí)族展,會(huì)傳遞或創(chuàng)建9個(gè)與web開發(fā)相關(guān)的對象供_jspServlet使用。
JSP技術(shù)的設(shè)計(jì)者為便于開發(fā)人員在編寫JSP頁面時(shí)獲得這些web對象的引用拔鹰,特意定義了9個(gè)相應(yīng)的變量仪缸,開發(fā)人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用(不需要預(yù)先聲明就可以在腳本代碼和表達(dá)式中隨意使用)。
9大內(nèi)置對象
內(nèi)置對象是在JSP頁面中無需創(chuàng)建就可以直接使用的變量格郁,在JSP中一共有9個(gè)
序號 | 內(nèi)置對象 | 含義 | 類型 | 作用域 |
---|---|---|---|---|
1 | pageContext | 頁面上下文對象 | javax.servlet.jsp.PageContext | Page |
2 | request | 請求對象 | javax.servlet.http.HttpServletRequest | Request |
3 | response | 響應(yīng)對象 | javax.servlet.http.HttpServletResponse | Page |
4 | session | 會(huì)話對象 | javax.servlet.http.HttpSession | Session |
5 | application | 應(yīng)用程序?qū)ο?/td> | javax.servlet.ServletContext | Application |
6 | config | 配置對象 | javax.servlet.ServletConfig | Page |
7 | out | 輸出對象 | javax.servlet.jsp.JspWriter | Page |
8 | page | 頁面對象 | java.lang.Object | Page |
9 | exception | 異常對象 | java.lang.Throwable | Page |
內(nèi)置對象說明
1.pageContext
“頁面上下文”對象腹殿,代表的是當(dāng)前頁面運(yùn)行的一些屬性独悴。
pageContext對象是JSP技術(shù)中最重要的一個(gè)對象例书,它代表JSP頁面的運(yùn)行環(huán)境,這個(gè)對象不僅封裝了對其它8大隱式對象的引用刻炒,它自身還是一個(gè)域?qū)ο?容器)决采,可以用來保存數(shù)據(jù)。并且坟奥,這個(gè)對象還封裝了web開發(fā)中經(jīng)常涉及到的一些常用操作树瞭,例如引入和跳轉(zhuǎn)其它資源、檢索其它域?qū)ο笾械膶傩缘取?/p>
通過pageContext獲取其他對象:
- getException方法返回exception隱式對象
- getPage方法返回page隱式對象
- getRequest方法返回request隱式對象
- getResponse方法返回response隱式對象
- getServletConfig方法返回config隱式對象
- getServletContext方法返回application隱式對象
- getSession方法返回session隱式對象
- getOut方法返回out隱式對象
pageContext對象可以作為容器來使用爱谁,因此可以將一些數(shù)據(jù)存儲在pageContext對象中晒喷。
pageContext對象的常用方法:
1 public void setAttribute(java.lang.String name,java.lang.Object value)
2 public java.lang.Object getAttribute(java.lang.String name)
3 public void removeAttribute(java.lang.String name)
4 public java.lang.Object findAttribute(java.lang.String name
重點(diǎn)介紹一下findAttribute方法,這個(gè)方法是用來查找各個(gè)域中的屬性的访敌,查看這個(gè)方法的API可以看到關(guān)于這個(gè)方法的描述:
Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.
當(dāng)要查找某個(gè)屬性時(shí)凉敲,findAttribute方法按照查找順序"page→request→session→application"
在這四個(gè)對象中去查找,只要找到了就返回屬性值寺旺,如果四個(gè)對象都沒有找到要查找的屬性爷抓,則返回一個(gè)null。
范例:使用pageContext的findAttribute方法查找屬性值
運(yùn)行結(jié)果:
EL表達(dá)式語句在執(zhí)行時(shí)阻塑,會(huì)調(diào)用pageContext.findAttribute方法献雅,用標(biāo)識符為關(guān)鍵字瀑晒,分別從page、request、 session、application四個(gè)域中查找相應(yīng)的對象鹰霍,找到則返回相應(yīng)對象,找不到則返回”” (
注意,不是null极颓,而是空字符串
)。
pageContext對象中封裝了訪問其它域的方法
1 public java.lang.Object getAttribute(java.lang.String name,int scope)
2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
3 public void removeAttribute(java.lang.String name,int scope)
代表各個(gè)域的常量有:
1 PageContext.APPLICATION_SCOPE
2 PageContext.SESSION_SCOPE
3 PageContext.REQUEST_SCOPE
4 PageContext.PAGE_SCOPE
通過pageContext引入和跳轉(zhuǎn)到其他的資源:
PageContext類中定義了一個(gè)forward方法(用來跳轉(zhuǎn)頁面)和兩個(gè)include方法(用來引入頁面)來分別簡化和替代RequestDispatcher.forward方法和include方法群嗤。
方法接收的資源如果以“/”開頭菠隆, “/”代表當(dāng)前web應(yīng)用。
1.范例:使用pageContext的forward方法跳轉(zhuǎn)到其他頁面
<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>使用pageContext的forward方法跳轉(zhuǎn)頁面</title>
</head>
<%
//使用pageContext的forward方法跳轉(zhuǎn)到pageContextDemo05.jsp頁面狂秘,/代表了當(dāng)前的web應(yīng)用
pageContext.forward("/pageContextDemo05.jsp");
//使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
//使用RequestDispatcher的forward方法實(shí)現(xiàn)的跳轉(zhuǎn)方式
//pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
%>
注意:
pageContext.forward("/pageContextDemo05.jsp");這種寫法是用來簡化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);這種寫法的骇径。在實(shí)際開發(fā)中,使用pageContext.forward(relativeUrlPath)方法跳轉(zhuǎn)頁面用得不多者春,主要是因?yàn)橐贘sp頁面中嵌套java代碼破衔,所以這種做法簡單了解一下即可,在開發(fā)中钱烟,要想從一個(gè)Jsp頁面采用服務(wù)器端跳轉(zhuǎn)的方式跳轉(zhuǎn)到另一個(gè)Jsp頁面晰筛,那么一般會(huì)使用<jsp:forward>標(biāo)簽
,<jsp:forward>標(biāo)簽用于把請求轉(zhuǎn)發(fā)給另外一個(gè)資源拴袭。
使用pageContext的include方法引入資源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>使用pageContext的include方法引入資源</title>
</head>
<%
pageContext.include("/jspfragments/head.jsp");
%>
使用pageContext的include方法引入資源
<%
pageContext.include("/jspfragments/foot.jsp");
%>
<hr/>
<%--
<jsp:include page="/jspfragments/head.jsp"/>
使用jsp:include標(biāo)簽引入資源
<jsp:include page="/jspfragments/foot.jsp"/>
--%>
運(yùn)行結(jié)果:
注意:
在實(shí)際開發(fā)中读第,使用pageContext的include方法引入頁面這種做法也很少用,一般都使用jsp:include標(biāo)簽引入資源拥刻,因此這種做法了解一下即可怜瞒。
2.request
request對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等般哼,封裝了由WEB瀏覽器或其它客戶端生成地HTTP請求的細(xì)節(jié)(參數(shù)吴汪,屬性,頭標(biāo)和數(shù)據(jù)等)蒸眠,是最常用的對象漾橙。作用域?yàn)閞equest(用戶請求期)。
常用的方法有:getParameter楞卡、getParameterNames 和getParameterValues等霜运,通過調(diào)用這幾個(gè)方法來獲取請求對象中所包含的參數(shù)的值,方法可查看API臀晃。
同時(shí)request也是一個(gè)域?qū)ο?/p>
3.response
response對象代表的是對客戶端的響應(yīng)觉渴,此對象封裝了返回到HTTP客戶端的輸出,向頁面作者提供設(shè)置響應(yīng)頭標(biāo)和狀 態(tài)碼的方式徽惋。經(jīng)常用來設(shè)置HTTP標(biāo)題案淋,添加cookie,設(shè)置響應(yīng)內(nèi)容的類型和狀態(tài)险绘,發(fā)送HTTP重定向和編碼URL等踢京。作用域?yàn)閜age(頁面執(zhí)行期)誉碴。
常用方法有:sendRedirect、setContentType瓣距、encodeRedirectURL黔帕、addHeader、addCookie蹈丸、getWriter等
4.Session:
session對象代表服務(wù)器與客戶端所建立的會(huì)話成黄,當(dāng)需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物逻杖、客戶軌跡跟蹤等奋岁。
“session” 對象建立在 cookie的基礎(chǔ)上,所以使用時(shí)應(yīng)注意判斷一下客戶端是否打開了cookie荸百。注意:不要把cookie也理解為九大內(nèi)置對象之一闻伶,cookie主要是實(shí)現(xiàn)了session的作用。
常用方法有:getAttribute够话、setAttribute蓝翰、removeAttribute、setMaxInactiveInterval女嘲、getId畜份、 getValue、 getValueNames和putValue等澡为。
5. application
可將信息保存在服務(wù)器中漂坏,直到服務(wù)器關(guān)閉,否則application對象中保存的信息會(huì)在整個(gè)應(yīng)用中都有效媒至。與session對象相比,application對象生命周期更長谷徙,類似于系統(tǒng)的“全局變量”拒啰。
6.out
out 對象代表了向客戶端發(fā)送數(shù)據(jù)的對象,與“response” 對象不同完慧,通過“out” 對象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容谋旦,是文本一級的,可以通過“out” 對象直 接向客戶端寫一個(gè)由程序動(dòng)態(tài)生成HTML文件屈尼。常用的方法除了pirnt和println之外册着,還包括clear、clearBuffer脾歧、flush甲捏、getBufferSize和getRemaining,這是因 為“out”對象內(nèi)部包含了一個(gè)緩沖區(qū)鞭执,所以需要一些對緩沖區(qū)進(jìn)行操作的方法司顿。
7.config
取得服務(wù)器的配置信息芒粹。通過 pageConext對象的getServletConfig() 方法可以獲取一個(gè)config對象。
常用的方法有:getInitParameter和getInitParameterNames大溜,以獲得Servlet初始化時(shí)的參數(shù)化漆。
8.exception
代表了JSP文件運(yùn)行時(shí)所產(chǎn)生的例外對象,此對象不能在一般JSP文件中直接使用钦奋,而只能在使用了page指令“<%@ page isErrorPage="true "%>”的JSP文件中使用
在一般的JSP頁面中使用該對象將無法編譯JSP文件座云。
9. page
“page” 對象代表了正在運(yùn)行的由JSP文件產(chǎn)生的類對象,不建議一般讀者使用付材。
四大域?qū)ο?/h3>
9大內(nèi)置對象中有4個(gè)是域?qū)ο螅?/p>
- pageContext
- request
- session
- application
域?qū)ο蟮淖饔茫?/h6>
用于保存數(shù)據(jù)疙教,獲取數(shù)據(jù),在不同資源之間共享數(shù)據(jù)伞租。
域?qū)ο蟮姆椒ǎ?/h6>
setAttribute("name",Object) 保存數(shù)據(jù)
getAttribute("name") 獲取數(shù)據(jù)
removeAttribute("name") 清除數(shù)據(jù)
四個(gè)域?qū)ο蟮淖饔梅秶?/h6>
- page域: 處于同一個(gè)jsp頁面中數(shù)據(jù)共享是有效的
- request域:處于同一個(gè)請求中數(shù)據(jù)共享是有效的
- session域:處于同一個(gè)會(huì)話中數(shù)據(jù)共享是有效的
- application域:處于同一個(gè)web應(yīng)用中數(shù)據(jù)共享是有效的
setAttribute("name",Object) 保存數(shù)據(jù)
getAttribute("name") 獲取數(shù)據(jù)
removeAttribute("name") 清除數(shù)據(jù)
- page域: 處于同一個(gè)jsp頁面中數(shù)據(jù)共享是有效的
- request域:處于同一個(gè)請求中數(shù)據(jù)共享是有效的
- session域:處于同一個(gè)會(huì)話中數(shù)據(jù)共享是有效的
- application域:處于同一個(gè)web應(yīng)用中數(shù)據(jù)共享是有效的