JSP九大內(nèi)置對(duì)象(隱式對(duì)象)

一、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í)例化肚吏,用戶直接使用即可。

JSP中的9個(gè)內(nèi)置對(duì)象

以上內(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)
page屬性范圍
2、request屬性范圍
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屬性范圍
session屬性范圍

每一個(gè)新的瀏覽器連接上服務(wù)器后就是一個(gè)新的session。

4算行、application屬性范圍
application屬性范圍

application范圍的屬性設(shè)置過多會(huì)影響服務(wù)器性能。

5、深入探究page屬性范圍

從javax.servlet.jsp.PageContext類中可以發(fā)現(xiàn)呀枢,有如下一種設(shè)置屬性的方法:

設(shè)置屬性的方法

與之前所使用的setAttribute()方法不同,該方法中用一個(gè)int的整型變量缨伊,此變量可以指定一個(gè)屬性的保存范圍摘刑。

4種屬性范圍常量

由上可以發(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();    //返回上下文路徑(虛擬路徑)
request內(nèi)置對(duì)象的常用方法

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定義的常用方法

所有的Cookie是由服務(wù)器端設(shè)置到客戶端上去的礼殊,所以要向客戶端增加Cookie,必須使用response對(duì)象的以下方法:

設(shè)置Cookie

如果想要獲取向客戶端設(shè)置的Cookie,可以通過request對(duì)象完成膏燕,使用request的以下方法:

取得Cookie

客戶端每次向服務(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)的退出操作测僵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谢翎,隨后出現(xiàn)的幾起案子捍靠,更是在濱河造成了極大的恐慌,老刑警劉巖森逮,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榨婆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡褒侧,警方通過查閱死者的電腦和手機(jī)良风,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闷供,“玉大人烟央,你說我怎么就攤上這事⊥嵩啵” “怎么了疑俭?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)唾糯。 經(jīng)常有香客問我怠硼,道長(zhǎng),這世上最難降的妖魔是什么移怯? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮这难,結(jié)果婚禮上舟误,老公的妹妹穿的比我還像新娘。我一直安慰自己姻乓,他們只是感情好嵌溢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布眯牧。 她就那樣靜靜地躺著,像睡著了一般赖草。 火紅的嫁衣襯著肌膚如雪学少。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天秧骑,我揣著相機(jī)與錄音版确,去河邊找鬼。 笑死乎折,一個(gè)胖子當(dāng)著我的面吹牛绒疗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骂澄,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼吓蘑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了坟冲?” 一聲冷哼從身側(cè)響起磨镶,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎健提,沒想到半個(gè)月后琳猫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矩桂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年沸移,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侄榴。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雹锣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癞蚕,到底是詐尸還是另有隱情蕊爵,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布桦山,位于F島的核電站攒射,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恒水。R本人自食惡果不足惜会放,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钉凌。 院中可真熱鬧咧最,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捣鲸,卻和暖如春瑟匆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栽惶。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工愁溜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人媒役。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓祝谚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酣衷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子交惯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容