在JSP頁面進行編程的時候,如果我們要使用一些對象,如:Httpsession,ServletConfig,ServletContext這些對象,如果每次都要先創建這些對象,然后再去使用它們,這樣就顯得十分繁瑣了,為了方便使用者,Sun公司在開發JSP的時候,把一些對象設置為內置對象,開發者在JSP頁面編程的時候不必聲明這些對象就能直接使用,這就是JSP的內置對象。
那么JSP對象有哪些呢?JSP內置對象 對應的類型 備注
Request HttpServletRequest 用于得到請求信息
Response HttpServletResponse 用于設置響應信息
application ServletContext 代表web應用環境
Config ServletConfig 用于得到Servlet初始化參數
Session HttpSession 用于的設置Session對象,調用request.getSession時被創建
Page Object 在JSP被翻譯成java文件后,創建的字節碼對象
Out JspWriter 一個帶緩沖的PRintWriter
Exception Thorwable 異常對象,封裝異常信息,發生異常時調用
Pagecontext PageContext 代表當前jsp的上下文對象
上面大多數對象在學習Servlet的時候已經學習過,下面我們只說一下兩個特別的對象:
Out對象Out對象的類型:JspWriter ,用于向瀏覽器輸出數據。
我們知道以前向頁面輸出數據,要用到PrintWriter,下面說一下兩者的區別:
PrintWriter:直接向頁面輸出數據,通過調用它的write()方法。
JspWriter:內部有一個一定大小的緩沖區,當這個緩沖區滿了,先把緩存區的數據寫入 PrintWriter,然后由PrintWriter把數據輸出到頁面。
那如果要輸出的數據填不滿緩沖區怎么辦呢,別擔心,開發者已經為我們想好了:
JspWriter把數據寫入PrintWriter的情況:
1)緩沖區滿了。
2)Jsp頁面已經加載完成,緩沖區雖然沒有滿,但JspWriter會把數據寫入PrintWriter。
3)關閉JspWriter的緩沖區,JspWriter就會把數據直接寫入PrintWriter。
那我們怎么設置緩沖區的大小呢?
我們可以在jsp頁面使用page指令,然后設置它里面的buffer屬性。
如果不設置,它的默認值是8kb。如果想關閉緩沖區我們可以把緩沖區的大小設置為0kb或none。
PageContext對象Pagecontext對象的數據類型:PageContext。
作用:代表當前jsp上下文對象。
那么什么是上下文對象呢?在語文書我們可能看到這樣的語句:“根據上下文,xxxxxxx”
所謂的上下文就是全文,所以Pagecontext對象可以獲取jsp的全部內置對象~
1)通過pagecontext對象來獲得jsp的其他8個內置對象
代碼如下:
<body> <% pageContext.getRequest(); pageContext.getResponse(); pageContext.getSession(); pageContext.getException(); pageContext.getOut(); pageContext.getPage(); pageContext.getServletConfig(); pageContext.getServletContext(); %> </body>
為什么它可以這樣獲取其它內置對象呢?我們來看看它的源代碼吧~
class _04_page_jsp extends HttpServlet{ public void _jspService(){ PageContext pageContext;//把8個內置對象放入PageContext類中 HttpSession session; ServietConfig config; SevletContext application; ..... //調用method1 method1(pageContext); } public void metdho1(PageContext pageContext){ //在這里需要使用到內置對象。例如session、config...... //得到pageContext對象就可以得到其他8個內置對象 pageContext.getRquet(); pageContext.getResponse(); ........ } }
由上述代碼可以看到,在JSP類里面的Serive()方法內聲明了這些變量,而里面又調用了了method1方法了把8個內置對象add到pageContext里了~
除了這個作用,pageContext還能作為域對象來使用。
1)pageContext作為域對象使用
域對象的作用:保存數據,得到數據
我們之前已經學過三個域對象:
requset域對象
context域對象
session域對象
這些都是servlet里可以使用的域對象。
然而,在JSP中,除了可以使用上面的三個域對象,還能使用pageContext域對象。
pageContext域對象的范圍:在當前jsp頁面中有效的?。?!
那么現在我們來使用它吧~
你可以這樣把數據保存到pageContext域
pageContext.setAttribute("name",Object);
然后這樣得到數據:
pageContext.getAttribute("name");
除了可以把數據保存在pageContext域,你也可以用pageContext對象把數據保存在其它域對象里!
指定域對象保存:
pageContext.setAttribute("name",Object,域常量)
指定域獲?。?/p>
pageContext.getAttribute("name",域常量);
域常量:
PAGE_SCOPE:pageContext域
REQUEST_SCOPE:request域
SESSION_SCOPE:session域
APPLICATION_SCOPE:context域
自動搜索:
pageContext.findAttribute("name");
注意:自動在4個域中依次按順序(從小到大)搜索數據:
page->requeste->session->application
如果在某個域中找到數據,則返回該域中的數據,如果4個域都找不到數據,那么就返回null
總結4個域對象1.jsp的4個域對象
a)Request
b)Session
c)Application
d)pageContext
2.域對象的作用
保存數據,得到數據,清楚數據
3.域對象的核心方法
setattribute(Strings,Objectobj);
getattribute(Strings)
removeattribute(Strings)
4.四個域對象的作用范圍
Request域對象:同一次請求有效,可用轉發來維持。
Session域對象:同一次會話有效。
Application域對象:同一個web應用下有效。
pageContext域對象:同一個jsp頁面內有效。
可以在html頁面內嵌入java代碼,這樣是十分不利于開發者和美工分工的,所以后來我們提倡:盡量在jsp頁面內不使用java代碼,為此,兩種新的技術出現了:
我們 用EL表達式來代替jsp表達式;
用jsp標簽來代替jsp中的java腳本。
EL表達式那么什么是EL表達式Jsp中的一種語法,用來代替jsp表達式。
EL表達式的語法:${變量或表達式} 十分的簡便。
EL表達式的用法!1)用與輸出域中的數據
我們現在兩個域中存入名字一樣的兩個數據,然后用EL來輸出到頁面
pageContext.setAttribute("id", "rrrr",pageContext.REQUEST_SCOPE); pageContext.setAttribute("id", "ppp"); %> ${id}
頁面輸出的結果為:ppp
所以,如果沒有指定域對象,EL表達式就會依次在page->request->session->application域里找那個名字的變量,先找到就先用。
那么如何指定域對象呢??在變量名前加上域范圍!
${域范圍.name}
域范圍:
pageScoope:pageContext域
requestScope:request域
sessinoScope:session域
applicatinScope:application域
1)除了能輸出域對象保存的數據,EL表達式還能輸出對象里的屬性?。。?/p>
假如我們定義了一個Person類,它有一個屬性name,有一個getName()方法。
那么我們可以用EL表達式來把它的name屬性的值取出來:
pageContext.setAttribute("person", person); %> ${person.name}
這樣就能把name屬性的值取出來了!為什么會這樣呢,因為EL表達式中的.name相當于調用了對象的getName()方法,這一點大家要注意了。
1)EL表達式也可以用來輸出集合對象的值!
List對象:
pageContext.setAttribute("personList", list); %> ${personList[0]}
中括號里的值表示腳標!是不是很簡便~
Map對象:
pageContext.setAttribute("personMap", map); %> ${personMap["ppp"]}
中括號里填的是key的值,這樣就能得到對應的value的值了~
4)用于計算表達式
算術、${12+13-12*5+100}
比較、${5<3}
邏輯、${5<6&&7>8}
判空判斷是否null${name==null}
判斷是否是空字符串${name==""}
還有一種empty關鍵字可以用來判斷空和null,用法:
${emptyname}
EL表達式內置對象EL表達式還有內置對象?。e怕,很多都學過了,分別是
pageContext--等價于jsp的pageContext內置對象
pageScope--指定域獲取
requestScope
sessionScope
applicationScope
param--請求參數
paramValues
header--請求頭
headerValues
除了以上9種內置對象,還樂意獲得以下兩種~
cookie--獲取cookie
initParm--獲取web應用全局參數
下面用代碼示范一下:
<body> <%=pageContext.getRequest() %> <br/> <%--EL獲取web上下文 --%> ${pageContext.request.contextPath } <br/> ${pageContext.request.remoteHost } <a href="${pageContext.request.contextPath }/04.el1.jsp">頁面</a> <hr/> <%-- param / paramValues --%> <%--jsp接收參數 --%> <% String name = request.getParameter("name"); //out.write(name); String[] names = request.getParameterValues("name"); for(String n:names){ out.write(n+"<br/>"); } %> <%--EL獲取參數 --%> <br/> EL: ${param["name"]}<br/> EL: ${paramValues["name"][0] } - ${paramValues["name"][1] } <hr/> <%--請求有: header / headerValues --%> <%--jsp獲取頭 --%> <%=request.getHeader("user-agent") %> <%=request.getHeaders("user-agent") %> <br/> <%--EL獲取請求頭 --%> EL: ${header["user-agent"] }<br/> EL: ${headerValues["user-agent"][0] } <hr/> <%--cookie: --%> <%--jsp獲取cookie --%> <%=request.getCookies() %> <br/> <%--EL獲取 Cookie--%> ${cookie["JSESSIONID"].name } - ${cookie["JSESSIONID"].value } <hr/> <%--EL獲取全局參數--%> ${initParam["AAA"] } - ${initParam["BBB"] } </body>
以上就是EL的內容,重點在引用屬性時會調用它的getXxxx方法!
下面我們來說一下JSP的標簽吧!
Jsp標簽聰明的你一定會發覺,就算EL表達式可以代替JSP表達式,但想要完成一些功能,EL表達式是不夠的,例如循環,條件判斷等。所以JSP標簽就來和它相輔相成了!
什么是JSP標簽jsp標簽替代jsp腳本的功能。
Jsp標簽分類一)JSP內置標簽,又稱為動作標簽
二)JSTL標簽庫的標簽
三)自定義標簽
就三種,不多~
動作標簽動作標簽不用手動導入,所以我們直接使用就行。常使用的動作標簽有以下三種:
<jsp:forwardpage="">轉發標簽
<jsp:paramname=""value=""/>參數標簽。參數標簽不能單獨使用,只能用在forward或include 標簽中。
<jsp:includepage=""/>包含標簽。用于包含其他頁面。是一種動態包含。
那么現在在JSP文件中演示下吧:
<jsp:include page="包含的頁面"> <jsp:param name="參數名" value="參數值"/> </jsp:include> <jsp:forward page="頁面名稱"> <jsp:param name="參數名" value="參數值"/> </jsp:forward>
什么是動態包含呢?
JSP文件需要先翻譯成JAVA源文件,然后再編譯成CLASS文件。
動態包含:兩個JSP文件各自先翻譯,然后在編譯運行時再合并。也就是說途中會產生多個java文件
靜態包含:兩個文件先合并,然后一并翻譯成java源文件,過程中只產生1個java文件。
***************靜態包含vs動態包含*****************
靜態包含:@include指令實現。原理是先合并再翻譯。靜態包含不能攜帶參數。
動態包含:<jsp:include/>標簽實現。原理是先翻譯再合并。動態包含可以使用<jsp:param/>標簽攜帶參數到被包含頁面
JSTL標簽庫JSTL,JavaStrandardTagLibararyjava標準標簽庫
*****使用jstl標簽庫,需要在jsp頁面中導入標簽庫
常見的JSTL標簽庫核心標簽庫(c:設置變量,獲取變量,條件判斷,循環)(主要)
國際化標簽庫(fmt:日期國家化,文字國際化,數字國際化)(以后說)
EL函數庫(fn:對String常用的方法)
數據庫標簽庫(sql:對數據庫操作的標簽)
xml標簽庫(x:對xml文件操作的標簽)
核心標簽庫使用jstl標簽步驟:
1) 如果是用java5.0的jar包,那么就已經包含jstl的jar包。
2)在jsp頁面頭部導入標簽庫:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3)在jsp頁面中使用
核心庫中常用的幾種標簽<c:set></c:set>--設置數據
<c:outvalue=""></c:out>--得到數據
<c:iftest=""></c:if>--單條件判斷
<c:choose></c:choose>--多條件判斷
<c:whentest=""></c:when>
<c:otherwise></c:otherwise>
<c:forEach></c:forEach>--循環,遍歷集合或數組
<c:forTokensitems=""delims=""></c:forTokens>-循環字符串
<c:redirect></c:redirect>--重定向
下面我們來一一示范下怎么使用這些標簽吧
<body> <%--使用set標簽設置數據,默認是在pageContext域中設置,也可以指定域保存 --%> <c:set var="name" value="eric" scope="request"></c:set> ${requestScope.name} <%-- out標簽,從域對象中得到數據, default屬性:設置默認值,當屬性為null時,就會用默認值代替 escapeXml:是否對內容進行轉義,false:不進行轉義,true:進行轉義 什么是轉義:特殊字符不會被識別作用,當普通字符輸出 --%> <c:out value="${name}" default="abc" escapeXml="false"></c:out> <%--if標簽:單條間判斷--%> <c:if test="${1>2}"> 條件成立執行的內容 </c:if> <%--choose標簽:多條件判斷 --%> <c:set var="id" value="001"></c:set> <c:choose> <c:when test="${id=002}">此用戶是002</c:when> <c:when test="${id=001}">此用戶是001</c:when> <c:otherwise>不存在此用戶</c:otherwise> </c:choose> <%--遍歷List begin:從哪個元素開始遍歷,第一個下標為0 end:到哪個元素結束 step:步長 items:需要遍歷的對象的名稱 var:每個元素對象的名稱 varStatus:當前遍歷對象的狀態,即:已經遍歷了幾個元素。 --%> <c:forEach items="${list}" var="student" varStatus="varSta"> 序號${varSta.count}-姓名${student.name}-年齡${student.age} </c:forEach> <%--遍歷Map--%> <c:forEach items="${map}" var="entry" varStatus="varSta"> 序號${varSta.count}-編號${entry.key}-姓名${entry.value.name} </c:forEach> <%--forTokens便簽 :循環字符串,可以切割后將子串都輸出 items:要循環的對象 delims:以什么東西切割字符串 var:切割后的單個對象的名稱 --%> <c:forTokens items="${str}" delims="-" var="s"> ${s} <br/> </c:forTokens> <%--重定向 標簽--%> <c:redirect url="http://www.baidu.com"></c:redirect> </body>
新聞熱點
疑難解答