JSP(Java ServerPage)是Java服務(wù)器端動(dòng)態(tài)頁面技術(shù)。是sun公司制訂的一種服務(wù)器端的動(dòng)態(tài)頁面生成技術(shù)規(guī)范。
因?yàn)橹苯邮褂肧ervlet,雖然也可以生成動(dòng)態(tài)頁面。但是,編寫繁瑣(需要使用out.println來輸出),并且維護(hù)困難(如果頁面發(fā)生了改變,需要修改Java代碼),所以sun指定了JSP規(guī)范。
JSP其實(shí)是一個(gè)以.jsp為后綴的文件,容器會(huì)自動(dòng)將.jsp文件轉(zhuǎn)換成一個(gè).java文件(其實(shí)就是一個(gè)Servlet),然后調(diào)用該Servlet。所以,從本質(zhì)上講,JSP其實(shí)就是一個(gè)Servlet。
step1:創(chuàng)建一個(gè)以“.jsp”為后綴的文件。
step2:在該文件里面,可以添加如下的內(nèi)容:
1)HTML(CSS、JS):直接寫即可
2)Java代碼:
? 形式一:Java代碼片段:<%Java代碼%>
? 形式二:JSP表達(dá)式:<%=Java表達(dá)式%>
? 形式三:JSP聲明:<%!%>
3)指令
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)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)指令是什么
? 通知容器,在將.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)<!--注釋內(nèi)容-->:允許注釋的內(nèi)容是Java代碼,如果是Java代碼,會(huì)被容器執(zhí)行,但是執(zhí)行的結(jié)果會(huì)被瀏覽器忽略(不會(huì)顯示出來)
2)<%--注釋內(nèi)容--%>:注釋的內(nèi)容不能是Java代碼,如果是Java代碼,會(huì)被容器忽略。
sun公司制定的一種技術(shù)規(guī)范,利用JSP標(biāo)簽(類似于HTML標(biāo)簽)來代替JSP中的Java代碼。這樣作的好處是,JSP頁面會(huì)更加簡(jiǎn)潔,并且更好維護(hù)(比如,將這樣的頁面交給美工,可以很方便地去修改)。
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)簽
是一套簡(jiǎn)單的計(jì)算規(guī)則,用于給JSP標(biāo)簽的屬性賦值,也可以直接輸出。注意事項(xiàng):新建工程,J2EE選1.4可直接使用EL表達(dá)式,JavaEE5.0需要使用isELIgnored屬性,否則無法使用!!詳見1.7。
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]}
? 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>
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)。
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)簽。
1)語法:<c:set var=" " scope=" " value=" ">,綁定一個(gè)對(duì)象到指定的范圍。
2)value屬性:綁定值。
1)語法:<c:remove var=" " scope=" ">,解除綁定。
1)語法:<c:catch avr=" ">,處理異常,會(huì)將異常信息封裝成一個(gè)對(duì)象,綁定到pageContext對(duì)象上。
1)語法:<c:import url=" ">
2)url屬性:指定一個(gè)jsp文件的地址,jsp會(huì)在運(yùn)行時(shí)調(diào)用這個(gè)jsp。
1)語法:< c:redirect url=" ">,重定向到另外一個(gè)地址。
2)url屬性:指定重定向的地址。
1)語法:<c:out value=" " default=" " escapeXml=" ">,用于輸出el表達(dá)式的值。
2)value屬性:指定輸出的值。
3)default屬性:指定缺省值。
4)escapeXml屬性:設(shè)置成true,會(huì)將value中的特殊字符替換成相應(yīng)的實(shí)體。缺省值就是true。
容器依據(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語句
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下了。
step1:JSP頁面
ModelViewController,是一種軟件架構(gòu)的思想,將一個(gè)軟件的模塊劃分成三種不同類型的模塊,分別是模型(封裝業(yè)務(wù)邏輯)、視圖(實(shí)現(xiàn)表示邏輯)、控制器(協(xié)調(diào)模型和視圖,即模型返回的結(jié)果要先交給控制器,由控制器來選擇合適的視圖來展示處理結(jié)果;另外,視圖發(fā)送請(qǐng)求給控制器,由控制器來選擇對(duì)應(yīng)的模型來處理。)
使用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ā)方式。
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ù)。