JAVA學(xué)習(xí)筆記(JSP)

一、JSP基礎(chǔ)

1.1什么是JSP

JSP(Java ServerPage)是Java服務(wù)器端動(dòng)態(tài)頁面技術(shù)。是sun公司制訂的一種服務(wù)器端的動(dòng)態(tài)頁面生成技術(shù)規(guī)范。

1.2為什么要使用JSP

因?yàn)橹苯邮褂肧ervlet,雖然也可以生成動(dòng)態(tài)頁面。但是,編寫繁瑣(需要使用out.println來輸出),并且維護(hù)困難(如果頁面發(fā)生了改變,需要修改Java代碼),所以sun指定了JSP規(guī)范。

1.3JSP與Servlet的關(guān)系

JSP其實(shí)是一個(gè)以.jsp為后綴的文件,容器會(huì)自動(dòng)將.jsp文件轉(zhuǎn)換成一個(gè).java文件(其實(shí)就是一個(gè)Servlet),然后調(diào)用該Servlet。所以,從本質(zhì)上講,JSP其實(shí)就是一個(gè)Servlet。

1.4如何寫一個(gè)JSP文件

step1:創(chuàng)建一個(gè)以“.jsp”為后綴的文件。

step2:在該文件里面,可以添加如下的內(nèi)容:

1)HTML(CSS、JS):直接寫即可

2)Java代碼:

? 形式一:Java代碼片段:<%Java代碼%>

? 形式二:JSP表達(dá)式:<%=Java表達(dá)式%>

? 形式三:JSP聲明:<%!%>

3)指令

1.5JSP是如何運(yùn)行的

step1:容器依據(jù).jsp文件生成.java文件(也就是先轉(zhuǎn)換成一個(gè)Servlet):

? ? 1)HTML(CSS、JS)放到service方法里,使用out.write輸出

? ? 2)<%%>也放到service方法里,照搬,不改動(dòng)。

? ? 3)<%=%>也會(huì)放到service方法里,使用out.print輸出。

? ? 4)<%!%>給Servlet添加新的屬性或者新的方法(轉(zhuǎn)成.java文件后,聲明內(nèi)的部分添加在service方法之外)。

這樣就把一個(gè)JSP變成了一個(gè)Servlet容器。

注意事項(xiàng):out.writer方法只能輸出簡(jiǎn)單的字符串,對(duì)象是沒法輸出的。優(yōu)點(diǎn)是把null自動(dòng)轉(zhuǎn)換成空字符串輸出。如:<%out.println(newDate());%>不能用writer

step2:容器接下來就會(huì)調(diào)用Servlet來處理請(qǐng)求了(會(huì)將之前生成的.java文件進(jìn)行編譯、然后實(shí)例化、初始化、調(diào)用相應(yīng)的方法處理請(qǐng)求)

step3:隱含對(duì)象

1)所謂隱含對(duì)象(共9個(gè)),指的是在.jsp文件里面直接可以使用的對(duì)象,比如out、request、response、session、application(ServletContext上下文)、exception、pageContext、config、page。

2)之所以能直接使用這些對(duì)象,是因?yàn)槿萜鲿?huì)自動(dòng)添加創(chuàng)建這些對(duì)象的代碼。(JSP僅僅是個(gè)草稿,最終會(huì)變?yōu)橐粋€(gè)Servlet。)

1.6隱含對(duì)象

1)exception對(duì)象:當(dāng)jsp頁面運(yùn)行時(shí)發(fā)生了異常,容器會(huì)將異常信息封裝到該對(duì)象,可以使用該對(duì)象提供的方法來輸出異常的信息。另外,必須在頁面設(shè)置isErrorPage="true"指令才能使用該隱含對(duì)象。

2)pageContext對(duì)象:容器會(huì)為每一個(gè)JSP實(shí)例(JSP所對(duì)應(yīng)的那個(gè)Servlet對(duì)象)創(chuàng)建唯一的一個(gè)符合pageContext接口的對(duì)象,稱之為page上下文。該對(duì)象會(huì)一直存在,除非JSP實(shí)例被銷毀。它作用:①綁定數(shù)據(jù)(綁定的數(shù)據(jù)只有對(duì)應(yīng)的JSP實(shí)例才可以訪問):setAttribute、removeAttribute、getAttribute。②找到其他八個(gè)隱含對(duì)象(詳情看JSP標(biāo)簽)。

3)config對(duì)象:即ServletConfig,可以使用該對(duì)象獲得初始化參數(shù)。

4)page對(duì)象:JSP實(shí)例本身(一般不用)。

1.7指令

1)指令是什么

? 通知容器,在將.jsp文件轉(zhuǎn)換成.java文件時(shí),作一些額外的處理,比如導(dǎo)包。

2)指令的語法

? <%@指令名稱屬性名=屬性值%>

3)page指令

①import屬性:導(dǎo)包。

例如:<%@page ? ?import="java.util.*"%>

? ? ?<%@page ? ? import="java.util.*,java.text.*"%>

eg:頁面顯示系統(tǒng)時(shí)間

? ?currenttime:<%out.println(newDate());%>
? ?currenttime:<%=newDate()%>

注意事項(xiàng):兩個(gè)是等價(jià),newDate()會(huì)被放入out.print();里

②contenType屬性:設(shè)置response.setContentType的內(nèi)容。

例如:<%@pageimport="java.util.*"contentType="text/html;charset=utf-8"%>

③pageEncoding屬性:告訴容器.jsp的文件的編碼格式,這樣,容器在獲取jsp文件的內(nèi)容(即解碼)時(shí),不會(huì)出現(xiàn)亂碼。最好加入,有些容器默認(rèn)以ISO-8859-1編碼。

例如:<%@pagecontentType="text/html;charset=utf-8" pageEncoding="utf-8"%>

④session屬性:true/false,缺省值true,如果值為false,則容器不會(huì)添加獲得session的語句。

例如:<%@pagesession="false"%>

sessionID:<%=session.getId()%>

⑤isELIgnored屬性:true/false,缺省值true,如果值為false,則告訴容器不要忽略el表達(dá)式。J2EE5.0需要使用isELIgnored="false",否則EL表達(dá)式無效。

⑥isErrorPage屬性:true/false,缺省值false,如果值為true,表示這是一個(gè)錯(cuò)誤處理頁面(即專門用來處理其他JSP產(chǎn)生的異常,只有值為true時(shí),才能使用exception隱含對(duì)象去獲取錯(cuò)誤信息)。

例如:<%=exception.getMessage()%>

⑦errorPage屬性:設(shè)置一個(gè)錯(cuò)誤處理頁面。

例如:step1:a3.jsp頁面,測(cè)試輸入a3.jsp?num=100a

<%@pageerrorPage="a4.jsp"%>

<%String num=request.getParameter("num");

intsum=Integer.parseInt(num)+100;out.println(sum);%> step2:a4.jsp頁面

<%@pageisErrorPage="true"pageEncoding="UTF-8"

contentType="text/html;charset=utf-8"%>

<%=exception.getMessage()%>

4)include指令

file屬性:①對(duì)于頁面的公共部分,我們可以使用相同的jsp文件,并使用include指令導(dǎo)入,如此實(shí)現(xiàn)代碼的優(yōu)化。②告訴容器,在將.jsp文件轉(zhuǎn)換成.java文件時(shí),在指令所在的位置插入相應(yīng)的文件的“內(nèi)容“(由file屬性來指定)。插入的頁面并未運(yùn)行,而是機(jī)械的將內(nèi)容插入。

例如:<%@includefile="head.jsp"%>

5)taglib指令

導(dǎo)入JSP標(biāo)簽<%@taglib uri="命名空間"prefix="前綴"%>

①uri:在standard.jar/META-INF/c.tld中查找,詳情看2.2

②prefix:前綴,用于代表命名空間。

例如:<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

? ? ?<c:if test ="${1>0}">今天運(yùn)氣太好了</c:if>

1.8JSP注釋

1)<!--注釋內(nèi)容-->:允許注釋的內(nèi)容是Java代碼,如果是Java代碼,會(huì)被容器執(zhí)行,但是執(zhí)行的結(jié)果會(huì)被瀏覽器忽略(不會(huì)顯示出來)

2)<%--注釋內(nèi)容--%>:注釋的內(nèi)容不能是Java代碼,如果是Java代碼,會(huì)被容器忽略。

二、JSP標(biāo)簽和EL表達(dá)式

2.1什么是JSP標(biāo)簽

sun公司制定的一種技術(shù)規(guī)范,利用JSP標(biāo)簽(類似于HTML標(biāo)簽)來代替JSP中的Java代碼。這樣作的好處是,JSP頁面會(huì)更加簡(jiǎn)潔,并且更好維護(hù)(比如,將這樣的頁面交給美工,可以很方便地去修改)。

2.2JSTL及其使用

1)什么是JSTL:JavaStandardTaglib(Java標(biāo)準(zhǔn)標(biāo)簽庫,apache開發(fā)了一套標(biāo)簽,捐獻(xiàn)給了sun,sun將其命名為JSTL)。

2)如何使用:

step1:將JSTL標(biāo)簽對(duì)應(yīng)的jar(標(biāo)簽類)文件拷貝到WEB-INF\lib下,standard.jarjstl.jar

step2:使用taglib指令引入JSP標(biāo)簽

2.3什么是EL表達(dá)式

是一套簡(jiǎn)單的計(jì)算規(guī)則,用于給JSP標(biāo)簽的屬性賦值,也可以直接輸出。注意事項(xiàng):新建工程,J2EE選1.4可直接使用EL表達(dá)式,JavaEE5.0需要使用isELIgnored屬性,否則無法使用!!詳見1.7。

2.4EL表達(dá)式的使用

1)訪問bean的屬性(就是普通的Java類,有屬性和get/set方法)第一種方式:例如:${user.name},容器會(huì)依次從4個(gè)隱含對(duì)象中pageContext、request、session、application中查找(getAttribute)綁定名為"user"的對(duì)象。接下來,會(huì)調(diào)用該對(duì)象的"getName"方法(自動(dòng)將n變大寫然后加get),最后輸出執(zhí)行結(jié)果。

優(yōu)點(diǎn):①會(huì)自動(dòng)將null轉(zhuǎn)換成""輸出。

? ? ?②如果綁定名稱對(duì)應(yīng)的值不存在,會(huì)不報(bào)null指針異常,會(huì)輸出""。

注意事項(xiàng):依次是指先從pageContext中查找,如果找不到,再查找request,如果找到了,則不再向下查找。如果要指定查找范圍,可以使用pageScope、requestScope、sessionScope、applicationScope來指定查找的范圍。

eg:jsp頁面測(cè)試

<%Useruser=newUser();user.setName("chang");user.setAge(22);request.setAttribute("user",user);Useruser2=newUser();user2.setName("bo"); user2.setAge(22);session.setAttribute("user",user2);%>

name:<%Useruser=(User)request.getAttribute("user");out.println(user.getName());%>


name:${user.name}

name:${sessionScope.user.name}

第二種方式:比如${user["name"]},與第一種方式是等價(jià)的!容器會(huì)依次從4個(gè)隱含對(duì)象中pageContext、request、session、application中查找(getAttribute)綁定名為"user"的對(duì)象。接下來,會(huì)調(diào)用該對(duì)象的"getName"方法(自動(dòng)將n變大寫然后加get),最后輸出執(zhí)行結(jié)果。

優(yōu)點(diǎn):①中括號(hào)[]里面可以出現(xiàn)變量。②中括號(hào)[]里面可以出現(xiàn)下標(biāo)從0開始的數(shù)組。

注意事項(xiàng):

中括號(hào)[]里的字符串用雙引號(hào)、單引號(hào)都可以!

EL表達(dá)式中沒引號(hào)的為變量,有引號(hào)的為字符串。

eg:jsp頁面測(cè)試

step1:User類

privateString name;privateintage;privateString[]interest;privateIdCardcard;……get/set方法

step2:IdCard類

privateStringcardNo;……get/set方法

step3:jsp頁面

<%Useruser=newUser();user.setName("chang");user.setAge(22); user.setInterest(newString[]{"臺(tái)球","乒乓球"});

user.setCard(newIdCard("1008611"));request.setAttribute("user",user);%>name:${user["name"]}

<%request.setAttribute("propname","age");%> name:${user[propname]}
interest:${user.interest}
interest:${user.interest[1]}
IdCard:${user.card.cardNo}

2)進(jìn)行一些簡(jiǎn)單的計(jì)算,計(jì)算的結(jié)果可以用來給JSP標(biāo)簽的屬性賦值,也可以直接輸出。

①算術(shù)運(yùn)算:“+”、“-”、“*”、“/”、“%”

注意事項(xiàng):"+"號(hào)操作不能連接字符串。如"abc"+"bcd"會(huì)報(bào)錯(cuò)!

"100"+"200"=${"100"+"200"}可以!

②關(guān)系運(yùn)算:“>”、“>=”、“<”、“<=”、“!=”、"=="

注意事項(xiàng):“eq”也可判斷是否相等

eg:相關(guān)測(cè)試

1>0?${1>0}

<%request.setAttribute("str1","abc");request.setAttribute("str2","bcd");%>

${str1==str2}
${str1=="abc"}

eq:${str1eq"abc"}
${sessionScope.str1=="abc"}

③邏輯運(yùn)算:"&&"、"||"、"!",與Java中的一樣

④empty運(yùn)算:判斷是否是一個(gè)空字符串,或者是一個(gè)空的集合,如果是,返回true。以下四種情況都是true:A.空字符串。B.空集合。C.null。D.根據(jù)綁定名找不到值。

eg:相關(guān)測(cè)試

<%request.setAttribute("str3","");%>

空字符串:${emptystr3}

<%Listlist1=newArrayList();//list1.add("abc");//falserequest.setAttribute("list1",list1);%>

空集合:${emptylist1}

<%request.setAttribute("obj",null);%> null:${emptyobj}
找不到值:${emptyabc}

3)獲取請(qǐng)求參數(shù)值

? ①${param.username}等價(jià)于request.getParameter("username");

? ②${paramValues.city}等價(jià)于request.getParameterValues("city");eg:相關(guān)測(cè)試a6.jsp頁面

? ? username:${param.username}
? ? interest:${paramValues.interest[0]}

三、JSTL中的幾個(gè)核心標(biāo)簽

3.1if

? 1)語法:當(dāng)test屬性值為true,執(zhí)行標(biāo)簽體的內(nèi)容,test屬性可以使用EL表達(dá)式。

? 2)var屬性:用來指定綁定名稱。

? 3)scope屬性:指定綁定范圍,可以是page(pageContext)、request、session、

? ? ?application

? 注意事項(xiàng):可以在if標(biāo)簽里寫Java代碼。

3.2choose

1)語法:

注意事項(xiàng):

? ?when和otherwise必須要放到choose標(biāo)簽里面才能使用。

? ?when可以出現(xiàn)1次或者多次,otherwise可以出現(xiàn)0次或者1次,表例外。

eg:相關(guān)測(cè)試

<%

Person p = new Person();

p.setAttribute("p",p);

%>

性別:<c:choose>

? ? ? ? <c:when test="${p.gender=='m'}">男</c:when>

? ? ? ? <c:when test="${p.gender=='f'}">女</c:when>

? ? ? ? <c:otherwise>保密</c:otherwise>

? ? </c:choose>

3.3forEach

1)語法:

用法一(遍歷集合):<c:forEach var=" " items=" " carStatus=" "></c:forEach>

①items屬性:用來指定要遍歷的集合,可以使用EL表達(dá)式。

②var屬性:指定綁定名,綁定范圍是pageContext,綁定值是從集合中取出的某個(gè)元素。

③carStatus屬性:指定綁定名,綁定范圍是pageContext,綁定值是一個(gè)由容器創(chuàng)建的一個(gè)對(duì)象,該對(duì)象封裝了當(dāng)前迭代的狀態(tài)。比如,該對(duì)象提供了getIndex、getCount方法,其中,getIndex會(huì)返回當(dāng)前迭代的元素的下標(biāo)(從0開始),getCount會(huì)返回當(dāng)前迭代的次數(shù)(從1開始)。

用法二(指定位置迭代):<c:forEach var=" " begin=" " end=" " ></c:forEach>

①begin:如果指定了items,那么迭代就從items[begin]開始進(jìn)行迭代;如果沒有指定items,那么就從begin開始迭代。它的類型為整數(shù)。

②end:如果指定了items,那么就在items[end]結(jié)束迭代;如果沒有指定items,那么就在end結(jié)束迭代。它的類型也為整數(shù)。

注意事項(xiàng):forEach還一個(gè)屬性為step="":迭代的步長(zhǎng)。

3.4url

1)語法:<c:url value=" ">

①當(dāng)用戶禁止cookie以后,會(huì)自動(dòng)在地址后面添加sessionId。

②當(dāng)使用絕對(duì)路徑時(shí),會(huì)自動(dòng)在地址前添加應(yīng)用名。

2)value屬性:指定地址,在表單提交、鏈接當(dāng)中,可以使用該標(biāo)簽。

3.5set

1)語法:<c:set var=" " scope=" " value=" ">,綁定一個(gè)對(duì)象到指定的范圍。

2)value屬性:綁定值。

3.6remove

1)語法:<c:remove var=" " scope=" ">,解除綁定。

3.7catch

1)語法:<c:catch avr=" ">,處理異常,會(huì)將異常信息封裝成一個(gè)對(duì)象,綁定到pageContext對(duì)象上。

3.8import

1)語法:<c:import url=" ">

2)url屬性:指定一個(gè)jsp文件的地址,jsp會(huì)在運(yùn)行時(shí)調(diào)用這個(gè)jsp。

3.9redirect

1)語法:< c:redirect url=" ">,重定向到另外一個(gè)地址。

2)url屬性:指定重定向的地址。

3.10?out

1)語法:<c:out value=" " default=" " escapeXml=" ">,用于輸出el表達(dá)式的值。

2)value屬性:指定輸出的值。

3)default屬性:指定缺省值。

4)escapeXml屬性:設(shè)置成true,會(huì)將value中的特殊字符替換成相應(yīng)的實(shí)體。缺省值就是true。

3.11JSP標(biāo)簽是如何運(yùn)行的

容器依據(jù)命名空間找到標(biāo)簽的描述文件(.tld文件),接下來,依據(jù)標(biāo)簽的名稱找到標(biāo)簽類的類名,然后將該標(biāo)簽實(shí)例化,最后,調(diào)用標(biāo)簽實(shí)例的相應(yīng)的方法。

注意事項(xiàng):容器會(huì)從WEB-INF下查找,如果找不到,還會(huì)查找WEB-INF\lib下的

jar文件。

3.12案例:將員工列表中的Java代碼改為JSP標(biāo)簽,并添加分頁

step1:刪除該頁上所有Java代碼,并修改如下


step2:JSP頁面添加分頁


step3:修改ActionServlet中service方法中的if語句

四、自定義標(biāo)簽

4.1如何寫一個(gè)自定義標(biāo)簽

step1:寫一個(gè)Java類(標(biāo)簽類),且必須繼承SimpleTagSupport類。

step2:在doTag方法里面(覆蓋doTag方法),編寫相應(yīng)的處理邏輯。標(biāo)簽有哪些屬性,則標(biāo)簽類也有哪些屬性,并且類型要匹配。此外,這些屬性必須提供相應(yīng)的set方法

step3:在.tld文件當(dāng)中,描述該標(biāo)簽。.tld文件可以放在WEB-INF下(或它的子文件夾下),也可以放到META-INF下,可以參考c.tld文件來寫。

注意事項(xiàng):

簡(jiǎn)單標(biāo)簽技術(shù)是新技術(shù),新的規(guī)范。

<body-content></body-content>的作用是告訴容器標(biāo)簽是否有標(biāo)簽體(即開始、結(jié)束標(biāo)簽之間的內(nèi)容),如果有標(biāo)簽體可以有三個(gè)值:

1)empty:沒有標(biāo)簽體。2)scriptless:可以有標(biāo)簽體,但是標(biāo)簽體里面不能夠出現(xiàn)Java代碼(三種形式都不行!)。3)JSP:有標(biāo)簽體,并且標(biāo)簽體的內(nèi)容可以是Java代碼。只有復(fù)雜標(biāo)簽技術(shù)支持JSP。簡(jiǎn)單標(biāo)簽技術(shù)只支持empty和scriptless。

4.2JavaEE5.0中,如何使用EL表達(dá)式和JSTL

在JavaEE5.0以上版本中,已經(jīng)將JSTL標(biāo)簽庫對(duì)應(yīng)的jar文件包含進(jìn)來了,不用再去將

那兩個(gè)jar文件拷貝到WEB-INF\lib下了。

4.3案例:自定義標(biāo)簽


4.4案例:修改之前員工列表中的日期顯示

step1:JSP頁面


五、MVC

5.1什么是MVC

ModelViewController,是一種軟件架構(gòu)的思想,將一個(gè)軟件的模塊劃分成三種不同類型的模塊,分別是模型(封裝業(yè)務(wù)邏輯)、視圖(實(shí)現(xiàn)表示邏輯)、控制器(協(xié)調(diào)模型和視圖,即模型返回的結(jié)果要先交給控制器,由控制器來選擇合適的視圖來展示處理結(jié)果;另外,視圖發(fā)送請(qǐng)求給控制器,由控制器來選擇對(duì)應(yīng)的模型來處理。)

5.2使用MVC的目的

使用MVC思想來設(shè)計(jì)軟件,最根本的目的是為了實(shí)現(xiàn)模型的復(fù)用:即模型只返回處理結(jié)果,并不關(guān)心這些結(jié)果如何展現(xiàn),展現(xiàn)由不同的視圖來處理;另外可以使用不同的視圖來調(diào)用同一個(gè)模型。

5.3如何使用MVC來開發(fā)一個(gè)Web應(yīng)用程序(JavaEE)

使用Java類來實(shí)現(xiàn)模型(將業(yè)務(wù)邏輯寫在Java類里面,寫完之后可以立即測(cè)試),使用

Servlet或者Filter來實(shí)現(xiàn)控制器,使用JSP來實(shí)現(xiàn)視圖。

注意事項(xiàng):

一般模型產(chǎn)生應(yīng)用異常(即不是系統(tǒng)的原因產(chǎn)生的異常,而是用戶使用不當(dāng)造成的,需要提示用戶采取正確的操作)時(shí),拋?zhàn)远x異常給控制器(自定義異常可自己寫個(gè)最簡(jiǎn)單的類,但是,當(dāng)有許多應(yīng)用異常時(shí)可采用異常編號(hào)方式),控制器再返回結(jié)果給視圖。

對(duì)于客戶端,WEB-INF下的文件都是受保護(hù)的,不能直接訪問!只有服務(wù)器之間的組件可以訪問。某個(gè)結(jié)果頁面不想被用戶訪問,可以設(shè)置主頁,然后使用ActionServlet采取轉(zhuǎn)發(fā)方式。

5.4MVC的優(yōu)缺點(diǎn)

1)優(yōu)點(diǎn):①可以實(shí)現(xiàn)模型的復(fù)用。②模型或者視圖發(fā)生改變,不會(huì)相互影響。③方便測(cè)試(比如,將業(yè)務(wù)邏輯寫在Java類里面,可以直接測(cè)試,如果寫在Servlet里面,必須要先部署才能測(cè)試)。

2)缺點(diǎn):使用MVC后,①會(huì)增加設(shè)計(jì)的難度。②代碼量也會(huì)增加。③相應(yīng)地也會(huì)增加軟件的開發(fā)成本。

5.5案例:簡(jiǎn)易貸款(貸款數(shù)小于余額數(shù)*10)



JSP九大內(nèi)置對(duì)象:request、response、session、application、out、pagecontext、config、page、exception

1.request對(duì)象

request對(duì)象是javax.servlet.httpServletRequest類型的對(duì)象。該對(duì)象代表了客戶端的請(qǐng)求信息,主要用于接受通過http協(xié)議傳送到服務(wù)器的數(shù)據(jù)(包括信息、系統(tǒng)信息、請(qǐng)求方式以及請(qǐng)求參數(shù)等)

2.response對(duì)象

response代表的是對(duì)客戶端的響應(yīng),主要是講JSP容器處理過得對(duì)象傳回到客戶端。reswponse對(duì)象也具有作用域,它只在JSP頁面內(nèi)有效

3.session對(duì)象

session對(duì)象是由服務(wù)器自動(dòng)創(chuàng)建的與用戶請(qǐng)求相關(guān)的對(duì)象,服務(wù)器為每個(gè)用戶都生成一個(gè)session對(duì)象,用于保存該用戶的信息,跟蹤用戶的操作狀態(tài)。session對(duì)象內(nèi)部使用MAP類來保存數(shù)據(jù),因此保存數(shù)據(jù)的格式是“key/value”.session對(duì)象的value可以是復(fù)雜的對(duì)象類型,而不僅僅局限于字符串類型

4.application對(duì)象

application對(duì)象可以將信息保存在服務(wù)器中,直到服務(wù)器關(guān)閉,否則application對(duì)象中保存的信息會(huì)在整個(gè)應(yīng)用中都有效。與session對(duì)象相比,spplication對(duì)象生命周期更長(zhǎng),類似于系統(tǒng)的“全局變量”

5.out對(duì)象

out對(duì)象用于在Web瀏覽器內(nèi)輸出信息,并且管理應(yīng)用服務(wù)器上的輸出緩沖區(qū)。在使用out對(duì)象輸出數(shù)據(jù)時(shí),可以對(duì)數(shù)據(jù)緩沖區(qū)進(jìn)行操作,及時(shí)清除緩沖區(qū)中的殘余數(shù)據(jù),為其他的輸出讓出緩沖空間。待數(shù)據(jù)輸出完畢之后,要及時(shí)關(guān)閉輸出流。

6.pageContext對(duì)象

pageContext對(duì)象的作用是去的任何范圍的參數(shù),通過它可以獲取JSP頁面的out、request、response、session、application等對(duì)象。pageContext對(duì)象的創(chuàng)建和初始化都是由容器來完成的,在JSP頁面中可以直接使用pageContext對(duì)象

7.config對(duì)象

config對(duì)象的主要作用是取得服務(wù)器的配置信息,通過pagecontext對(duì)象的getServletConfig()方法可以獲取一個(gè)config對(duì)象。當(dāng)一個(gè)Servlet初始化時(shí),容器把某些信息通過config對(duì)象傳遞給這個(gè)Servlet。開發(fā)者可以在web.xml文件之中為應(yīng)用程序環(huán)境中的Servlet程序和JSP頁面提供初始化參數(shù)

8.page對(duì)象

page對(duì)象代表jsp本身,只有在JSP頁面內(nèi)才是合法的。page隱含對(duì)象本質(zhì)上包含當(dāng)前servlet接口引用的變量,類似于java編程腫的this指針

9.exception對(duì)象

exception對(duì)象的作用是顯示異常信息,只有包含isErrorPage="true"的頁面才可以被使用,在一般的jsp頁面中使用該對(duì)象將無法編譯jsp文件。exception對(duì)象和java的所有對(duì)象一樣,都具有系統(tǒng)提供的繼承結(jié)構(gòu)。exception對(duì)象幾乎定義了所有異常情況。在java程序中,可以使用try/catch關(guān)鍵字來處理異常情況;如果在jsp頁面中出現(xiàn)沒有捕獲到的異常,就會(huì)生成exception對(duì)象,并且把exception對(duì)象傳送到在page指令中設(shè)定的錯(cuò)誤頁面中,然后在錯(cuò)誤頁面中處理相應(yīng)的exception對(duì)象

總結(jié):

request ? ? ? ? ? 請(qǐng)求對(duì)象  ? ? ? ? ? ?類型 javax.servlet.ServletRequest??????? 作用域 Request

response????????響應(yīng)對(duì)象 ? ? ? ? ? ? ?? 類型 javax.servlet.SrvletResponse ? ? ? ?作用域 Page

pageContext??頁面上下文對(duì)象?????類型 javax.servlet.jsp.PageContext ? ? ?? 作用域 Page

session????????? 會(huì)話對(duì)象??????????????? 類型 javax.servlet.http.HttpSession????????作用域 Session

application?? 應(yīng)用程序?qū)ο?????????? 類型 javax.servlet.ServletContext ? ? ? ??? 作用域 Application

out??????????輸出對(duì)象???????????????????????類型 javax.servlet.jsp.JspWriter??????????????作用域 Page

config?????配置對(duì)象 ? ? ? ? ? ?????????? ?類型 javax.servlet.ServletConfig ? ? ? ?????? 作用域 Page

page???????頁面對(duì)象 ? ? ? ? ? ????????? ?類型 javax.lang.Object ? ? ? ? ? ? ? ? ???????????? 作用域 Page

exception ? ? ? ? 例外對(duì)象???????????? 類型 javax.lang.Throwable ? ? ? ? ? ? ? ???????? 作用域 page

“exception” 對(duì)象則代表了JSP文件運(yùn)行時(shí)所產(chǎn)生的例外對(duì)象,此對(duì)象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用。

何為作用域

  先讓我們看看效果:

  大概流程是這樣的,我們?cè)L問index.jsp的時(shí)候,分別對(duì)pageContext, request, session,application四個(gè)作用域中的變量進(jìn)行累加。(當(dāng)然先判斷這個(gè)變量是不是存在,如果變量不存在,則要把變量初始化成1)。計(jì)算完成后就從index.jsp執(zhí)行forward跳轉(zhuǎn)到test.jsp。在test.jsp里再進(jìn)行一次累加,然后顯示出這四個(gè)整數(shù)來。

  從顯示的結(jié)果來看,我們可以直觀的得出結(jié)論:

  page里的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉(zhuǎn)了,它們就不見了。

  request里的變量可以跨越forward前后的兩頁。但是只要刷新頁面,它們就重新計(jì)算了。

  session和application里的變量一直在累加,開始還看不出區(qū)別,只要關(guān)閉瀏覽器,再次重啟瀏覽器訪問這頁,session里的變量就重新計(jì)算了。

? ?? ?application里的變量一直在累加,除非你重啟tomcat,否則它會(huì)一直變大。

作用域規(guī)定的是變量的有效期限

  如果把變量放到pageContext里,就說明它的作用域是page,它的有效范圍只在當(dāng)前jsp頁面里。

  從把變量放到pageContext開始,到j(luò)sp頁面結(jié)束,你都可以使用這個(gè)變量。

  如果把變量放到request里,就說明它的作用域是request,它的有效范圍是當(dāng)前請(qǐng)求周期。

  所謂請(qǐng)求周期,就是指從http請(qǐng)求發(fā)起,到服務(wù)器處理結(jié)束,返回響應(yīng)的整個(gè)過程。在這個(gè)過程中可能使用forward的方式跳轉(zhuǎn)了多個(gè)jsp頁面,在這些頁面里你都可以使用這個(gè)變量。

  如果把變量放到session里,就說明它的作用域是session,它的有效范圍是當(dāng)前會(huì)話。

  所謂當(dāng)前會(huì)話,就是指從用戶打開瀏覽器開始,到用戶關(guān)閉瀏覽器這中間的過程。這個(gè)過程可能包含多個(gè)請(qǐng)求響應(yīng)。也就是說,只要用戶不關(guān)瀏覽器,服務(wù)器就有辦法知道這些請(qǐng)求是一個(gè)人發(fā)起的,整個(gè)過程被稱為一個(gè)會(huì)話(session),而放到會(huì)話中的變量,就可以在當(dāng)前會(huì)話的所有請(qǐng)求里使用。

  如果把變量放到application里,就說明它的作用域是application,它的有效范圍是整個(gè)應(yīng)用。

  整個(gè)應(yīng)用是指從應(yīng)用啟動(dòng),到應(yīng)用結(jié)束。我們沒有說“從服務(wù)器啟動(dòng),到服務(wù)器關(guān)閉”,是因?yàn)橐粋€(gè)服務(wù)器可能部署多個(gè)應(yīng)用,當(dāng)然你關(guān)閉了服務(wù)器,就會(huì)把上面所有的應(yīng)用都關(guān)閉了。

  application作用域里的變量,它們的存活時(shí)間是最長(zhǎng)的,如果不進(jìn)行手工刪除,它們就一直可以使用。

  與上述三個(gè)不同的是,application里的變量可以被所有用戶共用。如果用戶甲的操作修改了application中的變量,用戶乙訪問時(shí)得到的是修改后的值。這在其他scope中都是不會(huì)發(fā)生的,page, request,session都是完全隔離的,無論如何修改都不會(huì)影響其他人的數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對(duì)象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對(duì)象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,172評(píng)論 1 18
  • 1.什么是JSP (1)jsp全稱是Java Server Pages,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,685評(píng)論 5 99
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,764評(píng)論 18 399
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,425評(píng)論 0 10
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,835評(píng)論 0 11