?? jsp(day05).txt
字號:
JSP第五天 2007年7月4日
一、EL語法
EL的語法很簡單,他最大的特點(diǎn)就是使用上很方便
例:
${sessionScope.user.sex}
所有EL都是以 ${ 為起始、以} 為結(jié)尾的。
上述EL范例的意思是:從Session取得用戶的性別。如果使用之前JSP代碼的寫法如下:
<%
User user = (User)session.getAttribute("user");
String sex = user.getSex( );
%>
兩者相比較之下,可以發(fā)現(xiàn)EL的語法比傳統(tǒng)JSP代碼更為方便、簡潔。
EL提供 . 和 [ ] 兩種運(yùn)算符來存取數(shù)據(jù),[ ]可以訪問集合或者是數(shù)組的元素、Bean的屬性。下列兩者所代表的意思是一樣的,
但是需要保證要取得對象的那個的屬性有相應(yīng)的setXxx()和getXxx()方法才行。
例:
${sessionScope.user.sex}
等于
${sessionScope.user["sex"]}
. 和 [ ] 也可以同時混合使用,如下:
${sessionScope.shoppingCart[0].price}
返回結(jié)果為shoppingCart中第一項物品的價格。
在EL中,字符串既可以使用"abc",可以使用'abc'。
EL運(yùn)算符
EL的算術(shù)運(yùn)算符和Java中的運(yùn)算符的大致相同,優(yōu)先級也相同。
注意:'+' 運(yùn)算符不會連接字符串了,他只用于加法運(yùn)算。
EL關(guān)系運(yùn)算符有以下六個運(yùn)算符
關(guān)系運(yùn)算符 說 明 范 例 結(jié)果
= = 或 eq | 等于 |${ 5 = = 5 } 或 ${ 5 eq 5 } | true
!= 或 ne | 不等于 |${ 5 != 5 } 或 ${ 5 ne 5 } | false
< 或 lt | 小于 |${ 3 < 5 }或 ${ 3 lt 5 } | true
> 或 gt | 大于 |${ 3 > 5 }或 ${ 3 gt 5 } | false
<= 或 le | 小于等于 |${ 3 <= 5 }或 ${ 3 le 5 } | true
>= 或 ge | 大于等于 |${ 3 >= 5 }或 ${ 3 ge 5 } | false
empty運(yùn)算符
Empty運(yùn)算符主要用來判斷值是否為null或空的,例如:
${ empty param.name }
接下來說明Empty運(yùn)算符的規(guī)則:
{empty} A
如果A為null時,返回true
如果A不存在時,返回true
如果A為空字符串時,返回true
如果A為空數(shù)組時,返回true
如果A為空的Map時,返回true
如果A為空的Collection時,返回true
否則,返回false
注意:
在使用EL關(guān)系運(yùn)算符時,不能夠?qū)懗桑?${param.password1} = = ${param.password2}
或者
${ ${param.password1 } = = ${ param.password2 } }
而應(yīng)寫成
${ param.password1 = = param.password2 }
使用EL從表單中取得數(shù)據(jù)
與輸入有關(guān)的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。一般而言,我們在取得用戶的請求參數(shù)時,
可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中則可以使用param和paramValues兩者來取得數(shù)據(jù)。
${param.name}
${paramValues.name}可以取得所有同名參數(shù)的值
${paramValues.hobbies[0]}可以通過指定下標(biāo)來訪問特定的參數(shù)的值
這里param的功能和request.getParameter(String name)相同,而paramValues和request.getParameterValues(String name)相同。
如果用戶填了一個form,form名稱有為username的文本框,則我們就可以使用${param.username}來取得用戶填入文本框的值。
EL函數(shù)
EL中使用函數(shù)要寫一個要使用到方法的類,然后在配置xxx.tld文件,然后在JSP中使用時和JSP的自定義標(biāo)簽相似。
xxx.tld中的配置
<function>
<name>reverse</name><!--函數(shù)名-->
<function-class>jsp2.examples.el.Functions</function-class><!--函數(shù)所在的類-->
<function-signature>java.lang.String reverse( java.lang.String )</function-signature>
<!--函數(shù)原型,也就是函數(shù)的返回值類型,函數(shù)名,參數(shù)表,注意一定要寫類型的全名-->
</function>
使用EL函數(shù)的寫法
${sn:upper('abc')}
注意:在定義EL函數(shù)時,都必須為公開靜態(tài)(public static)
EL的隱含對象
EL也可以使用內(nèi)置對象中設(shè)置的屬性,需要使用特定的EL內(nèi)置對象
屬性范圍 | 在EL中的對象
Page | pageScope
Request | requestScope
Session | sessionScope
Application | applicationScope
EL中使用內(nèi)置對象的屬性
${requestScope.user}
等價于
<%request.getAttribute("user")%>
如果不寫出特定的范圍 ,那就會在不同的范圍間進(jìn)行搜索了
例:{user}(user是在request范圍 request.setAttribute("user",user))
也就等于
${requestScope.user}
<%request.getAttribute("user")%>
EL的隱含對象
對象 類 型 說 明
PageContext | javax.servlet.ServletContext |表示此JSP的PageContext
----------------------------------------------------------------------------------------------------------------------------
PageScope | java.util.Map |取得Page范圍的屬性名稱所對應(yīng)的值
----------------------------------------------------------------------------------------------------------------------------
RequestScope | java.util.Map |取得Request范圍的屬性名稱所對應(yīng)的值
----------------------------------------------------------------------------------------------------------------------------
sessionScope | java.util.Map |取得Session范圍的屬性名稱所對應(yīng)的值
----------------------------------------------------------------------------------------------------------------------------
applicationScope | java.util.Map |取得Application范圍的屬稱所對應(yīng)的值
----------------------------------------------------------------------------------------------------------------------------
param | java.util.Map |如同ServletRequest.getParameter(String name)返回String類型的值
----------------------------------------------------------------------------------------------------------------------------
paramValues | java.util.Map |如同ServletRequest.getParameterValues(String name)。返回String []類型的值
----------------------------------------------------------------------------------------------------------------------------
header | java.util.Map |如同ServletRequest.getHeader(String name)返回String類型的值
----------------------------------------------------------------------------------------------------------------------------
headerValues | java.util.Map |如同ServletRequest.getHeaders(String name)返回String []類型的值
----------------------------------------------------------------------------------------------------------------------------
cookie | java.util.Map |如同HttpServletRequest.getCookies( )
----------------------------------------------------------------------------------------------------------------------------
initParam | java.util.Map |如同ServletContext.getInitParameter(String name)。返回String類型的值
----------------------------------------------------------------------------------------------------------------------------
cookie對象
所謂的cookie是一個小小的文本文件,它是以key、value的方式將Session Tracking的內(nèi)容記錄在這個文本文件內(nèi),這個文本文件通常存在于
瀏覽器的暫存區(qū)內(nèi)。JSTL并沒有提供設(shè)定cookie的動作,因?yàn)檫@個動作通常都是后端開發(fā)者必須去做的事情,而不是交給前端的開發(fā)者。如果
我們在cookie中設(shè)定一個名稱為userCountry的值,那么可以使用${cookie.userCountry}來取得它。
${cookie.JSESSIONID.vlaue}
header和headerValues(請求報頭對象)
header儲存用戶瀏覽器和服務(wù)端用來溝通的數(shù)據(jù),當(dāng)用戶要求服務(wù)端的網(wǎng)頁時,會送出一個記載要求信息的標(biāo)頭文件,例如:用戶瀏覽器的版本、
用戶計算機(jī)所設(shè)定的區(qū)域等其他相關(guān)數(shù)據(jù)。如果要取得用戶瀏覽器的版本,即${header["User-Agent"]}。另外在很少機(jī)會下,有可能同一標(biāo)頭名
稱擁有不同的值,此時必須改為使用headerValues來取得這些值。
注意:因?yàn)閁ser-Agent中包含“-”這個特殊字符,所以必須使用“[]”,而不能寫成${header.User-Agent}。
initParam
就像其他屬性一樣,我們可以自行設(shè)定web應(yīng)用的環(huán)境參數(shù)(Context),當(dāng)我們想取得這些參數(shù)時,可以使用initParam隱含對象去取得它,
例如:當(dāng)我們在web.xml中設(shè)定如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>userid</param-name>
<param-value>mike</param-value>
</context-param>
</web-app>
那么我們就可以直接使用 ${initParam.userid}來取得名稱為userid,其值為mike的參數(shù)。
下面是之前的做法:String userid = (String)application.getInitParameter("userid");
pageContext對象
我們可以使用 ${pageContext}來取得其他有關(guān)用戶要求或頁面的詳細(xì)信息。下面列出了幾個比較常用的部分。
Expression 說 明
${pageContext.request} |取得請求對象
${pageContext.session} |取得session對象
${pageContext.request.queryString} |取得請求的參數(shù)字符串
${pageContext.request.requestURL} |取得請求的URL,但不包括請求之參數(shù)字符串
${pageContext.request.contextPath} |服務(wù)的web application的名稱
${pageContext.request.method} |取得HTTP的方法(GET、POST)
${pageContext.request.protocol} |取得使用的協(xié)議(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} |取得用戶名稱
${pageContext.request.remoteAddr } |取得用戶的IP地址
${pageContext.session.new} |判斷session是否為新的,所謂新的session,表示剛由 server產(chǎn)生而client尚未使用
${pageContext.session.id} |取得session的ID
${pageContext.servletContext.serverInfo}|取得主機(jī)端的服務(wù)信息
二、JSTL(JSP標(biāo)準(zhǔn)標(biāo)簽庫)
JSTL由核心標(biāo)簽,<c:... > ,xml解析標(biāo)簽 <x:...>,國際化標(biāo)簽 <fmt:....>,數(shù)據(jù)庫訪問標(biāo)簽<sql:...>,函數(shù)標(biāo)簽<fn:...>
核心標(biāo)簽
Core
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
屬性設(shè)置
<c:set> 設(shè)置屬性
<c:remove> 移除設(shè)置的屬性
過程控制
<c:if test="..."> 條件標(biāo)簽 只有在test屬性的值為true是才會執(zhí)行標(biāo)簽體
例:
<c:if test="${!(empty user.age)}">
<h1>hello</h1>
</c:if>
<c:choose>choose和when是組合在一起使用的,有點(diǎn)類似于swith case的語法 。
<c:when test="...">when也是條件判斷標(biāo)簽,test屬性的值為true是才會執(zhí)行標(biāo)簽體。
例:
<c:choose>
<c:when test="${param.age<18}">
<h1>you is a child<h1>
</c:when>
<c:when test="${param.age>18 and param.age<50 }">
<h1>you is a young person</h1>
</c:when>
<c:when test="${param.age>50}">
<h1>you is a old person</h1>
</c:when> <c:otherwise> <h1>you is a other person</h1> </c:otherwise>
</c:choose>
<c:forEach>迭代標(biāo)簽;可以分割字符串 按,號分割
例:
<c:forEach var="book" item="${store.books}" varStatus="status">
<h1>${book.parice}</h1>
</c:forEach>
<c:forEach begin="1" end="5" step="1">
<h1>hello</h1>
</c:forEach>
<c:forTokens>字符串迭代標(biāo)簽
<c:import>引入標(biāo)簽
<c:import url="引入內(nèi)容的url" var="別名">
${別名}
<c:url>url標(biāo)簽
<c:url value="...">
<c:param name="..." value="..."/>
</c:url>
<c:url value="...">
使用url標(biāo)簽可以實(shí)現(xiàn)URL回寫
<c:redirect uri="xxx/xxx/xxx.xx"/>
國際化標(biāo)簽
<fmt:lauguage>
<fmt:bundel>資源指定標(biāo)簽
<fmt:message>消息標(biāo)簽
例:
<fmt:setLocale value="zh"/>
<fmt:bundel basename="message.MessageResources">
<fmt:message>name</fmt:message>
</fmt:bundel>
xxxx.properties
name=\0060\0700\
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -