一、JSP內(nèi)置對(duì)象簡(jiǎn)介
JSP內(nèi)置對(duì)象是Web容器創(chuàng)建的一組對(duì)象工育,不使用new關(guān)鍵字就可以使用的內(nèi)置對(duì)象如绸。
開發(fā)者可以直接使用它們而不用顯式聲明。JSP隱式對(duì)象也被稱為預(yù)定義變量扼脐。
1瓦侮、JSP內(nèi)置對(duì)象概覽
JSP中的9個(gè)內(nèi)置對(duì)象將由容器為用戶進(jìn)行實(shí)例化肚吏,用戶直接使用即可。
以上內(nèi)置對(duì)象中常用的是pageContext斋泄、request、response卒废、session摔认、application电谣,掌握了這5個(gè)剿牺,即可進(jìn)行程序開發(fā)。
二湃崩、四種屬性范圍
在JSP中提供了4種屬性的保存范圍攒读。所謂的屬性保存范圍,指的就是一個(gè)內(nèi)置對(duì)象废累,可以在多個(gè)頁面中保存并繼續(xù)使用震放。
- page:只在一個(gè)頁面中保存屬性殿遂,跳轉(zhuǎn)之后無效。
- request:只在一次請(qǐng)求中保存耳峦,服務(wù)器端跳轉(zhuǎn)后依然有效邑飒,超鏈接跳轉(zhuǎn)無效疙咸。
- session:再一次會(huì)話范圍中,無論何種跳轉(zhuǎn)都可以使用题山,但是新開瀏覽器無法使用顶瞳。
- application:在整個(gè)服務(wù)器上保存豫领,所有用戶(會(huì)話)都可以使用等恐。如果服務(wù)器重啟,所有設(shè)置屬性將全部消失二跋。
以上的四個(gè)內(nèi)置對(duì)象都支持下表所示的操作方法:
1、page屬性范圍(pageContext)
2、request屬性范圍
關(guān)于request屬性范圍的理解
request表示客戶端的請(qǐng)求闷营。正常情況下速蕊,一次請(qǐng)求服務(wù)器只會(huì)給予一次回應(yīng),那么這時(shí)如果是服務(wù)器端跳轉(zhuǎn)媳叨,請(qǐng)求的地址欄沒有改變糊秆,所以也就相當(dāng)于回應(yīng)了一次平痰;而如果地址欄改變了昂芜,就相當(dāng)于是發(fā)出了第二次請(qǐng)求,則地一次請(qǐng)求的內(nèi)容肯定就已經(jīng)消失了欢际,所以就無法取得。
request屬性范圍一般在MVC設(shè)計(jì)模式上應(yīng)用較多舶沿。
3、session屬性范圍
每一個(gè)新的瀏覽器連接上服務(wù)器后就是一個(gè)新的session。
4算行、application屬性范圍
application范圍的屬性設(shè)置過多會(huì)影響服務(wù)器性能。
5、深入探究page屬性范圍
從javax.servlet.jsp.PageContext類中可以發(fā)現(xiàn)呀枢,有如下一種設(shè)置屬性的方法:
與之前所使用的setAttribute()方法不同,該方法中用一個(gè)int的整型變量缨伊,此變量可以指定一個(gè)屬性的保存范圍摘刑。
由上可以發(fā)現(xiàn),pageContext對(duì)象可以設(shè)置任意范圍的屬性刻坊。
三枷恕、JSP內(nèi)置對(duì)象詳解
1、request對(duì)象
request內(nèi)置對(duì)象是使用最多的一個(gè)對(duì)象紧唱,每當(dāng)客戶端請(qǐng)求一個(gè)JSP頁面時(shí)活尊,JSP引擎就會(huì)制造一個(gè)新的request對(duì)象來代表這個(gè)請(qǐng)求。
其主要作用是接收客戶端發(fā)送而來的請(qǐng)求信息,如請(qǐng)求的參數(shù)、發(fā)送的頭信息等都屬于客戶端發(fā)來的信息。
request對(duì)象提供了一系列方法來獲取HTTP頭信息亚隅,cookies矾瑰,HTTP方法等等采幌。
注意:當(dāng)服務(wù)器端想得到客戶端信息時(shí)就會(huì)使用request對(duì)象來完成柴墩。
客戶端的請(qǐng)求信息被封裝在request對(duì)象中爹土,通過他才能了解到客戶端需求呵哨,然后做出響應(yīng)挨务。request對(duì)象具有請(qǐng)求域石景,即完成客戶端的請(qǐng)求之前,該對(duì)象一直有效。
request是javax.servlet.http.HttpServletRequest接口的實(shí)例化對(duì)象撒犀,表示此對(duì)象主要是應(yīng)用在HTTP協(xié)議上邮破。
該接口定義如下:
public interface HttpServletRequest extends ServletRequest
從定義上可以發(fā)現(xiàn)庙洼,HttpServletRequest是ServletRequest接口的子接口卖哎。
在Web開發(fā)中幸缕,交互性是重要的特點(diǎn)抬虽,所以request對(duì)象在實(shí)際開發(fā)中使用的較多手幢。
常用的方法如下:
String getParameter(String name); //返回name指定參數(shù)的參數(shù)值
String[] getParameterValues(String name); //返回包含參數(shù)name的所有值的屬性
void setAttribute(String, Object); //設(shè)置此請(qǐng)求中的屬性
Object getAttribute(String name); //返回指定屬性的屬性值
String getContentType(); //得到請(qǐng)求提的MIME類型
String getProtocol(); //返回請(qǐng)求用的協(xié)議類型及版本號(hào)
String getServerName(); //返回請(qǐng)求的服務(wù)器主機(jī)名
int getServerPort(); //返回服務(wù)器接受此請(qǐng)求所用的端口號(hào)
String getCharacterEncoding(); //返回字符編碼方式
void setCharacterEncoding(); //設(shè)置請(qǐng)求的字符編碼方式
int getContentLength(); //返回請(qǐng)求體的長(zhǎng)度(以字節(jié)數(shù))
String getRemoteAddr(); //返回發(fā)送此請(qǐng)求的客戶端IP地址
String getRealPath(); //返回一虛擬路徑的真實(shí)路徑
String request.getContentPath(); //返回上下文路徑(虛擬路徑)
1.1、亂碼解決
在Web開發(fā)中使用request接收請(qǐng)求參數(shù)是最常見的操作,但是瘪板,在進(jìn)行參數(shù)提交時(shí)也會(huì)存在一些中文的亂碼問題税朴“粒可以直接通過setCharacterEncoding()方法設(shè)置一個(gè)統(tǒng)一的編碼即可珍特。
現(xiàn)階段的開發(fā)中最好每一個(gè)JSP頁面都寫上編碼設(shè)置壶唤。
1.2、接收請(qǐng)求參數(shù)
單一的參數(shù)都可以使用getParameter()接收坪郭,而一組參數(shù)要用getParameterValues()接收。
在表單控件中儿子,像文本框(text)割岛、單選按鈕(radio)倒槐、密碼框(password)若贮、隱藏域(hidden)等,一般都會(huì)使用getParameter()方法進(jìn)行接收痒留,因?yàn)檫@些控件在使用時(shí)參數(shù)的名稱都只有一個(gè)不會(huì)重復(fù)谴麦;而像復(fù)選框(checked),一般參數(shù)的名稱都是重復(fù)的伸头,是一組參數(shù)匾效,所以只能使用getParameterValues()接收,如果不小心使用了getParameter()方法恤磷,則只會(huì)接收第一個(gè)選中的內(nèi)容弧轧。
在request內(nèi)置對(duì)象中還有一個(gè)靈活的方法就是getParameterNames(),此方法可以返回所有請(qǐng)求參數(shù)的名稱碗殷,但是此方法返回值的類型是Enumeration精绎,所以需要使用hasMoreElements()方法判斷是否有內(nèi)容以及使用nextElement()方法取出內(nèi)容。
1.3锌妻、顯示全部的頭信息
Java的Web開發(fā)使用的是HTTP協(xié)議代乃,主要操作就是基于請(qǐng)求和回應(yīng),但是在請(qǐng)求和回應(yīng)的同時(shí)也會(huì)包含一些其他的信息(如客戶端的IP、Cookie搁吓、語言等)原茅,那么這些信息就稱為頭信息。
取得頭信息的名稱堕仔,可以再直接通過request內(nèi)置對(duì)象的getHeaderNames()方法擂橘;而要想取出每一個(gè)頭信息的的內(nèi)容,則需要使用getHeader()方法摩骨。
1.4通贞、角色驗(yàn)證
如果現(xiàn)在某些JSP頁面需要輸入特定的管理員的賬號(hào)才能訪問,那么就需要進(jìn)行角色驗(yàn)證恼五,而要進(jìn)行角色驗(yàn)證就必須使用request內(nèi)置對(duì)象中的isUserInRole()方法完成昌罩。
2、response對(duì)象
當(dāng)服務(wù)器創(chuàng)建request對(duì)象時(shí)會(huì)同時(shí)創(chuàng)建用于響應(yīng)這個(gè)客戶端的response對(duì)象灾馒。
response對(duì)象的主要作用是對(duì)客戶端的請(qǐng)求進(jìn)行回應(yīng)茎用,將Web服務(wù)器處理后的結(jié)果發(fā)回給客戶端。
通過這個(gè)對(duì)象睬罗,開發(fā)者們可以添加新的cookies轨功,時(shí)間戳,HTTP狀態(tài)碼等等容达。
response對(duì)象屬于javax.servlet.http.HttpServletResponse接口的實(shí)例古涧。
HttpServletResponse接口的定義如下:
public interface HttpServletResponse extends ServletResponse
常用方法如下:
String getCharacterEncoding(); // 返回響應(yīng)用的是何種字符編碼
void setContentType(String type); //設(shè)置響應(yīng)的MIME類型
PrintWriter getWriter(); //返回可以向客戶端輸出字符的一個(gè)對(duì)象(輸出流對(duì)象),打印輸出提前于內(nèi)置的out對(duì)象董饰。
sendRedirect(java.lang.String location) throws IOException; //重新定向客戶端的請(qǐng)求
void addCookie(Cookie cookie); //向客戶端增加Cookie
void setHeader(String name, String value); //設(shè)置回應(yīng)的頭信息
2.1蒿褂、設(shè)置頭信息
客戶端在進(jìn)行請(qǐng)求時(shí)會(huì)發(fā)送許多額外的信息,這些就是頭信息卒暂。服務(wù)器端也可以根據(jù)需要向客戶端設(shè)置頭信息啄栓,在所有頭信息的設(shè)置中,定時(shí)刷新頁面的頭信息使用的最多也祠,直接使用setHeader()方法昙楚,將頭信息名稱設(shè)置為refresh,同時(shí)制定刷新的時(shí)間诈嘿。
設(shè)置指定時(shí)間跳轉(zhuǎn)到指定頁面
response.setHeader("refresh", "3;URL=hello.html");
使用HTML完成定時(shí)跳轉(zhuǎn)的功能
<meta http-equiv="refresh" content="3;url=hello.htm">
定時(shí)跳轉(zhuǎn)屬于客戶端跳轉(zhuǎn)
2.2堪旧、頁面跳轉(zhuǎn)
在JSP中除了可以通過頭信息的方式完成跳轉(zhuǎn)外,還可以使用response對(duì)象的sendRedirect()方法直接完成頁面跳轉(zhuǎn)奖亚。
response跳轉(zhuǎn)屬于客戶端跳轉(zhuǎn)淳梦。
請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向的區(qū)別:
- 請(qǐng)求重定向:客戶端行為,response.sendRedirect()昔字,從本質(zhì)上講等同于再次請(qǐng)求爆袍,前一次的請(qǐng)求對(duì)象不會(huì)保存首繁,地址欄的URL地址會(huì)改變。
- 請(qǐng)求轉(zhuǎn)發(fā):服務(wù)器行為陨囊,request.getRequestDispatcher().forward(req, resp);是一次請(qǐng)求弦疮,轉(zhuǎn)發(fā)后請(qǐng)求對(duì)象會(huì)保存,地址欄的URL地址不會(huì)改變蜘醋。
客戶端跳轉(zhuǎn)和服務(wù)器端跳轉(zhuǎn)(<jsp:forward>)有什么區(qū)別胁塞?
服務(wù)器端跳轉(zhuǎn)后地址欄的信息不會(huì)有任何的改變,客戶端跳轉(zhuǎn)后地址欄會(huì)改變压语,變?yōu)樘D(zhuǎn)之后的頁面地址啸罢。
在使用request屬性范圍時(shí),只有服務(wù)器端跳轉(zhuǎn)才能夠?qū)equest屬性保存到跳轉(zhuǎn)頁无蜂;如果客戶端跳轉(zhuǎn)伺糠,則無法進(jìn)行屬性的傳遞蒙谓。
服務(wù)器端跳轉(zhuǎn)斥季,在執(zhí)行到跳轉(zhuǎn)語句時(shí)會(huì)立刻進(jìn)行腳磚;使用的是客戶端跳轉(zhuǎn)累驮,則是在整個(gè)頁面執(zhí)行完后才執(zhí)行跳轉(zhuǎn)酣倾。
由于兩種跳轉(zhuǎn)存在這樣的差異,所以在代碼開發(fā)中谤专,尤其在使用了JDBC的操作中躁锡,一定要在<jsp:forward>語句執(zhí)行之前關(guān)閉數(shù)據(jù)庫(kù)的鏈接,否則將再也無法關(guān)閉置侍。
如果使用了<jsp:forward>映之,可以通過<jsp:forward>方便的進(jìn)行參數(shù)傳遞;而如果使用了response.sendRedirect()傳遞參數(shù)蜡坊,則只能通過地址重寫的方式完成杠输。
2.3、操作Cookie
Cookie是瀏覽器所提供的一種技術(shù)秕衙,能夠讓服務(wù)器端將一些只需保存在客戶端或者客戶端進(jìn)行處理的數(shù)據(jù)蠢甲,放在客戶端本身使用的計(jì)算機(jī)中,不需通過網(wǎng)絡(luò)的傳輸据忘,因而提高了網(wǎng)頁處理的效率鹦牛,而且也能夠減少服務(wù)器端的負(fù)載。但是由于Cookie是服務(wù)器端保存在客戶端的信息勇吊,所以其安全性也是很差的曼追。
使用Cookie保存信息可以減少客戶端的部分操作。(比如記住密碼的功能)
在JSP總能專門提供了javax.servlet.http.Cookie的操作類汉规,
所有的Cookie是由服務(wù)器端設(shè)置到客戶端上去的礼殊,所以要向客戶端增加Cookie,必須使用response對(duì)象的以下方法:
如果想要獲取向客戶端設(shè)置的Cookie,可以通過request對(duì)象完成膏燕,使用request的以下方法:
客戶端每次向服務(wù)器端發(fā)送請(qǐng)求時(shí)都會(huì)將之前設(shè)置Cookie隨著頭信息一起發(fā)送到服務(wù)器上钥屈,所以這時(shí)使用request對(duì)象的getCookies()方法就可以取出全部設(shè)置的Cookie。
實(shí)際上坝辫,之前設(shè)置的Cookie并沒有真正的保存在客戶端上篷就,在重新啟動(dòng)瀏覽器后,之前設(shè)置的Cookie就全部不存在了近忙,則再使用getCookies()方法取得的就是null竭业。如果想要真正的將Cookie保存在客戶端上,就必須設(shè)置Cookie 的保存時(shí)間及舍,使用setMaxAge()方法即可未辆。
雖然Cookie中可以保存信息,但是并不能無限制的保存锯玛,一般一個(gè)客戶端最多只能保存300個(gè)Cookie咐柜,所以數(shù)據(jù)量太大時(shí)將無法使用Cookie。
3攘残、session對(duì)象
3.1.拙友、什么是session
session表示客戶端與服務(wù)器的一次會(huì)話。Web中的session指定是用戶在瀏覽某個(gè)網(wǎng)站時(shí)歼郭,從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時(shí)間遗契,也就是用戶瀏覽這個(gè)網(wǎng)站所花費(fèi)的時(shí)間。從上述定義中可以看到病曾,session實(shí)際上是一個(gè)時(shí)間上的概念牍蜂。
在服務(wù)器的內(nèi)存中保存著不同用戶的session。
session對(duì)象在第一個(gè)JSP頁面被裝載時(shí)自動(dòng)創(chuàng)建泰涂,完成會(huì)話期管理鲫竞。
從一個(gè)客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個(gè)瀏覽器結(jié)束负敏,稱此為一個(gè)會(huì)話贡茅。
當(dāng)一個(gè)客戶訪問一個(gè)服務(wù)器時(shí),可能會(huì)在服務(wù)器的幾個(gè)頁面之間切換其做,服務(wù)器應(yīng)當(dāng)通過某種辦法知道這是一個(gè)客戶顶考,就需要session對(duì)象。
實(shí)際上在開發(fā)中session對(duì)象最主要的用處就是完成用戶的登錄(login)妖泄、注銷(logout)等常見功能驹沿,每一個(gè)session對(duì)象都表示不同的訪問用戶。
session對(duì)象是javax.servlet.http.HttpSession接口的實(shí)例化對(duì)象蹈胡,所以session只能應(yīng)用在HTTP協(xié)議中渊季。
session對(duì)象的常用方法如下:
long getCreationTime(); //返回session創(chuàng)建時(shí)間
public String getId(); //返回session創(chuàng)建時(shí)JSP引擎為它設(shè)的唯一ID號(hào)
public Object setAttribute(String name, Object value); //使用指定名稱將對(duì)象綁定到此會(huì)話
public Object getAttribute(String name); //返回與此會(huì)話中的指定名稱綁定在一起的對(duì)象朋蔫,如果沒有對(duì)象綁定在該名稱下,則返回null
String[] getValueNames(); //返回一個(gè)包含此session的所有可用屬性的數(shù)組
int getMaxInactiveInterval(); //返回兩次請(qǐng)求間隔多長(zhǎng)時(shí)間此session被取消(單位秒)
public long getLastAccessedTime(); //取得session的最后一次操作時(shí)間
public boolean isNew(); //判斷是否是新的session(新用戶)
public void invalidate(); //讓session失效
在HttpSession接口中最重要的部分還是屬性操作却汉,主要是可以完成用戶登錄的合法性的驗(yàn)證驯妄。
3.2、session的生命周期
創(chuàng)建:當(dāng)客戶端第一次訪問某個(gè)JSP或者Servlet的時(shí)候合砂,服務(wù)器會(huì)為當(dāng)前會(huì)話創(chuàng)建一個(gè)sessionID青扔,每次客戶端向服務(wù)端發(fā)送請(qǐng)求時(shí),都會(huì)講此session攜帶過去翩伪,服務(wù)端會(huì)對(duì)此sessionID進(jìn)行校驗(yàn)微猖。
活動(dòng):某次會(huì)話當(dāng)中通過超鏈接打開的新頁面屬于同一次會(huì)話。只要當(dāng)前會(huì)話頁面沒有全部關(guān)閉缘屹,重新打開的新的瀏覽器窗口訪問統(tǒng)一項(xiàng)目資源時(shí)屬于同一次會(huì)話凛剥。除非本次會(huì)話的所有頁面都關(guān)閉后再重新訪問某個(gè)JSP或者Servlet將會(huì)創(chuàng)建新的會(huì)話。
注意:原有會(huì)話還存在轻姿,只是這個(gè)舊的sessionID任然存在于服務(wù)端犁珠,只不過再也沒有客戶端會(huì)攜帶它然后交予服務(wù)端校驗(yàn)。
銷毀:session的銷毀只有三種方式踢代。
(1)調(diào)用了session.invalidate()方法盲憎。
(2)session過期(超時(shí))
(3)服務(wù)器重新啟動(dòng)
- Tomcat的默認(rèn)session超時(shí)時(shí)間為30分鐘
- 設(shè)置session超時(shí)有兩種方式:
1嗅骄、session.setMaxInactiveInterval(time); //單位秒
2胳挎、在web.xml配置
<session-config>
//單位是分鐘
<session-timeout> 10 </session-timeout>
</session-config>
3.3、取得session ID
當(dāng)一個(gè)用戶連接到服務(wù)器后溺森,服務(wù)器會(huì)自動(dòng)為此session分配一個(gè)不會(huì)重復(fù)的Session Id慕爬,服務(wù)器依靠這些不同的session id 來區(qū)分每一個(gè)不同的用戶,在Web中可以使用HttpSession接口中的getId()方法取得這些編號(hào)屏积。
在使用session時(shí)必須注意一點(diǎn)医窿,對(duì)于每一個(gè)已經(jīng)連接到服務(wù)器上的用戶,如果重新啟動(dòng)服務(wù)器炊林,則這些用戶再次發(fā)出請(qǐng)求實(shí)際上表示的都是一個(gè)新連接的用戶姥卢,服務(wù)器會(huì)為每個(gè)用戶重新分配新的session id。
3.4渣聚、登錄及注銷
在各系中幾乎都存在用戶登錄驗(yàn)證及注銷的功能独榴,此功能完可以使用session實(shí)現(xiàn)。
具體思路是:當(dāng)用戶登錄成功后奕枝,設(shè)置一個(gè)session范圍的屬性棺榔,然后在其他需要驗(yàn)證的界面中判斷是否存在此session范圍的屬性,如果存在隘道,則表示已經(jīng)是正常登陸過的合法用戶症歇;如果不存在郎笆,則給出提示,并跳轉(zhuǎn)會(huì)登錄頁提示用戶重新登錄忘晤,用戶登陸后可以進(jìn)行注銷的操作宛蚓。
完成該功能,如下要求:
3.5设塔、判斷新用戶
在session對(duì)象中可以使用inNew()方法判斷一個(gè)用戶是否是第一次訪問頁面苍息。
3.6、取得用戶的操作時(shí)間
在session對(duì)象中壹置,可以通過getCreationTime()方法取得一個(gè)session的創(chuàng)建時(shí)間竞思,也可以使用getLastAccessedTime()方法取得一個(gè)session的最后一次操作時(shí)間。
關(guān)于getCreationTime()方法
當(dāng)用戶第一次連接到服務(wù)器上時(shí)钞护,服務(wù)器就會(huì)自動(dòng)保留一個(gè)session的創(chuàng)建時(shí)間盖喷。
4、application對(duì)象
這個(gè)對(duì)象在JSP頁面的整個(gè)生命周期中都代表著這個(gè)JSP頁面难咕。這個(gè)對(duì)象在JSP頁面初始化時(shí)被創(chuàng)建课梳,隨著jspDestroy()方法的調(diào)用而被移除。
通過向application中添加屬性余佃,則所有組成您web應(yīng)用的JSP文件都能訪問到這些屬性暮刃。
application對(duì)象實(shí)現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量爆土。
application對(duì)象開始于服務(wù)器的啟動(dòng)椭懊,結(jié)束予服務(wù)器的關(guān)閉。
在用戶的前后連接或不同用戶之間的連接中步势,可以對(duì)application對(duì)象的同一屬性進(jìn)行操作氧猬。
在任何地方對(duì)application對(duì)象屬性的操作,都將影響到其他用戶對(duì)此的訪問坏瘩。
服務(wù)器的啟動(dòng)和關(guān)閉決定了application對(duì)象的生命盅抚。
application對(duì)象是javax.servlet.ServletContext接口的實(shí)例化對(duì)象。
application對(duì)象常用方法如下:
public void setAttribute(String name, Object value); //使用指定名稱將對(duì)象綁定到此對(duì)話
public Object getAttribute(String name); //返回與此會(huì)話中的指定名稱綁定在一起的對(duì)象倔矾,如果沒有對(duì)象綁定在該名稱下妄均,則返回null
Enumeration getAttributeName(); //返回所有可用屬性名的枚舉
String setServerInfo(); //返回JSP(Servlet)引擎名及版本號(hào)
String getRealPath(String path); //得到虛擬路徑對(duì)應(yīng)的絕對(duì)路徑
public String getContextPath(); //取得當(dāng)前的虛擬路徑名稱
在application中最重要的部分也是屬性操作。
4.1哪自、取得虛擬目錄對(duì)應(yīng)的絕對(duì)路徑
在Toncat中配置虛擬目錄:
<Context path="/mldn" docBase="D:\mldnwebdome" />
以上表示的是在瀏覽器中使用“”/mldn“”訪問 "D:\mldnwebdome"目錄丰包,這時(shí)如果希望在Web開發(fā)中取得docBase對(duì)應(yīng)的真實(shí)路徑,就需要使用application對(duì)象中的getRealPath()方法來完成提陶。
對(duì)于application對(duì)象而言烫沙,在Web中也可以使用getServletContext()方法代替。在開發(fā)中盡量使用該方法隙笆。
5锌蓄、Web安全性及config對(duì)象
5.1升筏、Web安全性
在Web目錄中必須存在一個(gè)WEB_INF文件夾。在JavaEES的標(biāo)準(zhǔn)中瘸爽,Web目錄中的WEB_INF是必須存在的您访,而且此文件夾的安全性是最高的,在各個(gè)程序的開發(fā)中剪决,基本上都將一些配置信息保存在此文件夾中灵汪。
在定義WEB_INF目錄時(shí)一定要注意大小寫的問題,這里的字母都必須是大寫柑潦。
5.2享言、config對(duì)象
config對(duì)象是在一個(gè)Servlet初始化時(shí),JSP引擎向它傳遞信息用的渗鬼,此信息包括Servlet初始化時(shí)所用到的參數(shù)(通過屬性名和屬性值)以及服務(wù)器的有關(guān)信息(通過傳遞一個(gè)ServletContext對(duì)象)览露。
config是對(duì)象是javax.servlet.ServletConfig接口的實(shí)例化對(duì)象,主要功能是取得一些初始化的配置信息譬胎。
Config對(duì)象的常用方法如下:
ServletContext getServletContext(); //返回含有服務(wù)器相關(guān)信息的ServletContext對(duì)象
String getInitParameter(String name); //返回初始化參數(shù)的值
Enumeration getInitParameterNames(String name); //返回Servlet初始化所需所有參數(shù)的枚舉
所有初始化參數(shù)一定要在web.xml中配置差牛,即如果一個(gè)JSP文件想要通過初始化參數(shù)取得一些信息,則一定要在web.xml中完成映射堰乔。
6偏化、out對(duì)象
out是javax.servlet.jsp.JspWriter類的實(shí)例化對(duì)象,主要功能就是完成頁面的輸出操作镐侯,使用println()或print()方法輸出侦讨,但是從實(shí)際的開發(fā)來看,直接使用out對(duì)象的幾率較小析孽,一般使用表達(dá)式完成輸出的操作搭伤。
用來在response對(duì)象中寫入內(nèi)容。
最初的JspWriter類對(duì)象根據(jù)頁面是否有緩存來進(jìn)行不同的實(shí)例化操作袜瞬。可以在page指令中使用buffered='false'屬性來輕松關(guān)閉緩存身堡。
JspWriter類包含了大部分java.io.PrintWriter類中的方法邓尤。不過,JspWriter新增了一些專為處理緩存而設(shè)計(jì)的方法贴谎。還有就是汞扎,JspWriter類會(huì)拋出IOExceptions異常,而PrintWriter不會(huì)擅这。
常用方法如下:
public void println(); //向客戶端打印字符串
public void clear(); //清除緩存區(qū)內(nèi)容澈魄,如果在flush之后調(diào)用會(huì)拋出異常。
public void clearBuffer(); //清除緩存區(qū)的內(nèi)容仲翎,如果在flush之后調(diào)用不會(huì)拋出異常
public void flush(); //將緩存區(qū)內(nèi)容輸出到客戶端
public int getBufferSize(); //返回緩存區(qū)的大小以字節(jié)數(shù)的大小痹扇,如不設(shè)緩存區(qū)則為0
public int getRemaining(); //返回緩存區(qū)還剩余多少可用
public boolean isAutoFlush(); //返回緩存區(qū)滿時(shí)铛漓,是自動(dòng)清空還是拋出異常
public void close(); //關(guān)閉輸出流
7、paget對(duì)象
page對(duì)象就是指向當(dāng)前JSP頁面本身鲫构,有點(diǎn)像類中的this指針浓恶,它是java.lang.Object類的實(shí)例。
8结笨、pageContext對(duì)象
pageContext對(duì)象提供了對(duì)JSP頁面內(nèi)所有的對(duì)象及名字空間的訪問包晰。
pageContext對(duì)象可以訪問到本頁所在的session,也可以取本頁面所在的application的某一屬性值炕吸。
pageContext對(duì)象相當(dāng)于頁面中所有功能的集大成者伐憾。
pageContext對(duì)象的本類名也叫pageContext。
pageContext對(duì)象是javax.servlet.jsp.PageContext類的實(shí)例赫模,主要表示一個(gè)JSP頁面的上下文塞耕。
這個(gè)對(duì)象主要用來訪問頁面信息,同時(shí)過濾掉大部分實(shí)現(xiàn)細(xì)節(jié)嘴瓤。
這個(gè)對(duì)象存儲(chǔ)了request對(duì)象和response對(duì)象的引用扫外。application對(duì)象蔽午,config對(duì)象袱瓮,session對(duì)象,out對(duì)象可以通過訪問這個(gè)對(duì)象的屬性來導(dǎo)出锐峭。
pageContext對(duì)象也包含了傳給JSP頁面的指令信息停忿,包括緩存信息驾讲,ErrorPage URL,頁面scope等。
PageContext類定義了一些字段席赂,包括PAGE_SCOPE吮铭,REQUEST_SCOPE,SESSION_SCOPE颅停, APPLICATION_SCOPE谓晌。它也提供了40余種方法,有一半繼承自javax.servlet.jsp.JspContext 類癞揉。
其中一個(gè)重要的方法就是removeArribute()纸肉,它可接受一個(gè)或兩個(gè)參數(shù)。比如喊熟,pageContext.removeArribute("attrName")移除四個(gè)scope中相關(guān)屬性柏肪。
但是下面這種方法只移除特定scope中的相關(guān)屬性:
pageContext.removeAttribute("attrName", PAGE_SCOPE);
pageContext對(duì)象的常用方法:
JspWriter getOut(); //返回當(dāng)前客戶端響應(yīng)被使用的JspWriter流(out)
HttpSession getSession(); //返回當(dāng)前頁中的HttpSession對(duì)象(session)
Object getPage(); //返回當(dāng)前頁的Object對(duì)象(page)
ServletRequest getRequest(); //返回當(dāng)前頁的ServletRequest對(duì)象(request)
ServletResponse getResponse(); //返回當(dāng)前頁的ServletResponse對(duì)象(response)
ServletConfig getServletConfig(); //返回當(dāng)前頁的ServletConfig對(duì)象(config)
void setAttribute(String name, Object attribute); //設(shè)置屬性及屬性值
Object getAttribute(String name, int scope); //在指定范圍內(nèi)取屬性的值
int getAttributeScope(String name); //返回某屬性的作用范圍
void forward(String relativeUrlPath); //使當(dāng)前頁面跳轉(zhuǎn)到另一頁面
void include(String relativeUrlPath); //在當(dāng)前位置包含另一文件
8、Exception對(duì)象
exception對(duì)象是一個(gè)異常對(duì)象芥牌,當(dāng)一個(gè)頁面在運(yùn)行過程中發(fā)生了異常烦味,就產(chǎn)生這個(gè)對(duì)象。如果一個(gè)JSP頁面要應(yīng)用此對(duì)象壁拉,就必須把isErrorPage設(shè)置為true谬俄,否則無法編譯柏靶。
exception對(duì)象是java.lang.Throwable的對(duì)象。
exception對(duì)象的常用方法如下:
String getMessage(); //返回描述異常的信息
String toString(); //返回關(guān)于異常的簡(jiǎn)短描述信息
void printStackTrace(); //顯示異常及其棧軌跡
Throwable FIllInStackTrace(); //重寫異常的執(zhí)行棧軌跡
不難發(fā)現(xiàn)凤瘦,request宿礁、response、config蔬芥、application梆靖、<jsp:include>、<jsp:forward>等操作實(shí)際上都可以在pageContext對(duì)象中完成笔诵。
四返吻、實(shí)戰(zhàn)開發(fā)
使用JSP+JDBC完成一個(gè)用戶的登錄程序,登錄成功后可以使用session進(jìn)行用戶的登錄驗(yàn)證乎婿,用戶根據(jù)需要也可以直接進(jìn)行系統(tǒng)的退出操作测僵。