JSP20技术手册 有关JS∏L的使用,第七章有更加详细的说明。图6-2是 Param. jsp的执行结果 ①后退·⊙·日)乙魏索收夹媒体e 地址四同/心始囝时到链 EL隐含对象 param、 paramvalues 姓名:林上 Male 兴趣: Travel Music 制本地 Intranet 图6-2 Param.jsp的执行结果 6-3-3其他隐含对象 介绍完上面六个隐含对象后,接下来将介绍最后五个隐含对象 所谓的 cookie是一个小小的文本文件,它是以key、 value的方式将 Session tracking的内容记录 在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL并没有提供设定 cookie的动作, 因为这个动作通常都是后端开发者必须去做的事情,而不是交给前端的开发者。假若我们在 cookie中 设定一个名称为 userCountry的值,那么可以使用${ cookie. userCountry}来取得它。 ● header和 headervalues header储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记 载要求信息的标头文件,例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。假 若要取得用户浏览器的版本,即$ header[" User-Agent"]}。另外在鲜少机会下,有可能同一标头名 称拥有不同的值,此时必须改为使用 headervalues来取得这些值。 因为User- Agent中包含“-”这个特殊字符,所以必须使用“]”,而不能写成 s(header User-Agent) ● initParam 就像其他属性一样,我们可以自行设定web站台的环境参数( Context),当我们想取得这些参数 Java爱好者htp/ w.javafan. net制作
JSP2.0 技术手册 Java 爱好者 http://www.javafan.net 制作 有关 JSTL 的使用,第七章有更加详细的说明。图 6-2 是 Param.jsp 的执行结果: 图 6-2 Param.jsp 的执行结果 6-3-3 其他隐含对象 介绍完上面六个隐含对象后,接下来将介绍最后五个隐含对象。 ● cookie 所谓的 cookie 是一个小小的文本文件,它是以 key、value 的方式将 Session Tracking 的内容记录 在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL 并没有提供设定 cookie 的动作, 因为这个动作通常都是后端开发者必须去做的事情,而不是交给前端的开发者。假若我们在 cookie 中 设定一个名称为 userCountry 的值,那么可以使用${cookie.userCountry}来取得它。 ● header 和 headerValues header 储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记 载要求信息的标头文件,例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。假 若要取得用户浏览器的版本,即${header["User-Agent"]}。另外在鲜少机会下,有可能同一标头名 称拥有不同的值,此时必须改为使用 headerValues 来取得这些值。 注意 因为 User-Agent 中包含“-”这个特殊字符,所以必须使用“[]”,而不能写成 $(header.User-Agent)。 ● initParam 就像其他属性一样,我们可以自行设定 web 站台的环境参数(Context),当我们想取得这些参数
JsP20技术手册 时,可以使用 initParam隐含对象去取得它,例如:当我们在web.xm1中设定如下 <?xml version=1. 0 encoding="IS0-8859-1"?> <web-app xmins=hTtp: //iava. sun com/xml/ns/i2ee xmins:xsi=http://www.w3.org/2001/xmlschema-instance xsischemalocation=http://iava.suncom/xmi/ns/i2ee/web-aPp24.xsd version=2. 4> <context-param) <param-name>userid</param-name> Kparam-value>mike</param-value> </context-param </web-app) 那么我们就可以直接使用${ initParam userid}来取得名称为 userid,其值为mike的参数。下 面是之前的做法 String userid =(String)application. getInitParameter(userid") ● page Context 我们可以使用${ pageContext}来取得其他有关用户要求或页面的详细信息。表6-5列出了几个 比较常用的部分。 表6-5 Expression sIpageContext. request queryString 取得请求的参数字符串 sIpage Context request. requestURL) 取得请求的URL,但不包括请求之参数字符串 page Context. request. ontextPathh)服务的 web application的名称 Java爱好者htp/ w.javafan. net制作
JSP2.0 技术手册 Java 爱好者 http://www.javafan.net 制作 时,可以使用 initParam 隐含对象去取得它,例如:当我们在 web.xml 中设定如下: <?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 的参数。下 面是之前的做法: String userid = (String)application.getInitParameter("userid"); ● pageContext 我们可以使用 ${pageContext}来取得其他有关用户要求或页面的详细信息。表 6-5 列出了几个 比较常用的部分。 表 6-5 Expression 说 明 ${pageContext.request.queryString} 取得请求的参数字符串 ${pageContext.request.requestURL} 取得请求的 URL,但不包括请求之参数字符串 ${pageContext.request.contextPath} 服务的 web application 的名称
JsP20技术手册 sipage Context. request me thod 取得HTTP的方法(GET、POST) s IpageContext request protocol 取得使用的协议(HTP/1.1、HTP/1.0) sipage Context request. remoteUser 取得用户名称 (pageContext. request. remoteAddr得用户的IP地址 sIpageContext. session. newh 判断 session是否为新的,所谓新的 session 表示刚由 server产生而 client尚未使用 Isipage Context session id) 取得sin的ID (pageContext servletContext. serverInfol得主机端的服务信息 我们来看下面这个范例: page Context.jsp,相信对读者来说能更加了解 page Context的用法。 page Context. jsp <%e page content Type="text/html; charset=GB2312"%> <%@taglibprefix=c"uri=http://iava.sun.com/isp/isti/core"%> <htmI> Head> <title)CH6- page Context. jsp</title) /head> <body> <h2>EL隐含对象 pageContext</h2〉 \s page Context request queryString: S Page Context request queryString)</br> \s page Context request reques tURL): S Page Context request. requestURL)</br> \s page Context request contextPath: S page Context request contextPath)</br> \s lpageContext request method): S Page Context request method</br> \s lpageContext. request. protocol): S pageContext. request protocol)</br> Java爱好者htp/ w.javafan. net制作
JSP2.0 技术手册 Java 爱好者 http://www.javafan.net 制作 ${pageContext.request.method} 取得 HTTP 的方法(GET、POST) ${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0) ${pageContext.request.remoteUser} 取得用户名称 ${pageContext.request.remoteAddr } 取得用户的 IP 地址 ${pageContext.session.new} 判断 session 是否为新的,所谓新的 session, 表示刚由 server 产生而 client 尚未使用 ${pageContext.session.id} 取得 session 的 ID ${pageContext.servletContext.serverInfo} 取得主机端的服务信息 我们来看下面这个范例:pageContext.jsp,相信对读者来说能更加了解 pageContext 的用法。 pageContext.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>CH6 - pageContext.jsp</title> </head> <body> <h2>EL 隐含对象 pageContext</h2> \${pageContext.request.queryString}:${pageContext.request.queryString}</br> \${pageContext.request.requestURL}:${pageContext.request.requestURL}</br> \${pageContext.request.contextPath}:${pageContext.request.contextPath}</br> \${pageContext.request.method}:${pageContext.request.method}</br> \${pageContext.request.protocol}:${pageContext.request.protocol}</br>
JsP20技术手册 \s page Context request. remoteUserl: S Page Context request. remoteUser)</br> \s page Context request. remoteAddr): Spage Context request. remoteAddr</br> \S page Context. session. new/: s page Context. session. new)</br> \s lpageContext. session id): s page Context. session id)</br> /body. </htmI> page Context.jsp的执行结果如图6-3,执行时必须在 page Context.jsp之后加上?test=1234,即 Page Context.jsp?test=1234,这样${ page Context. request. querystring}才会显示test=1234 查看0收(工具① Q··口日>独索收座国体色· 地址②ehd/eshe 1日w EL隐含对象 page Context s pageContext. request. querystring) test=1234 http://ocalhost:8080/jspbook/ch6/paGecOntExt.jsp extPath),/JSPBook s pageComntert. request. method], GET tert,requestprotocol,HTTP/1 s pos fonte. request remoter) requent. renoteMddr ) 127.0.0.1 s ageContert, session idl, 10003290C11010C75A950591750820C4 图6-3 page Context.jsp的执行结果 注意 因为$在JSP2.0中是特殊字符,JsP容器会自动将它当做E来执行,因此,假若要 示$母时,必须在$前加上\,如:\S{XX 6-4EL算术运算符 EL算术运算符主要有以下五个(见表6-6) 表6-6 算术运算符 s{17+5} s{17-5 12 Java爱好者htp/ ww.javafan. net制作
JSP2.0 技术手册 Java 爱好者 http://www.javafan.net 制作 \${pageContext.request.remoteUser}:${pageContext.request.remoteUser}</br> \${pageContext.request.remoteAddr }:${pageContext.request.remoteAddr}</br> \${pageContext.session.new}:${pageContext.session.new}</br> \${pageContext.session.id}:${pageContext.session.id}</br> </body> </html> pageContext.jsp 的执行结果如图 6-3,执行时必须在 pageContext.jsp 之后加上?test=1234,即 PageContext.jsp?test=1234,这样${pageContext.request.queryString}才会显示 test=1234。 图 6-3 pageContext.jsp 的执行结果 注意 因为 ${} 在 JSP 2.0 中是特殊字符,JSP 容器会自动将它当做 EL 来执行,因此,假若要显 示 ${}时,必须在 $ 前加上 \ ,如:\${ XXXXX } 6-4 EL 算术运算符 EL 算术运算符主要有以下五个(见表 6-6): 表 6-6 算术运算符 说 明 范 例 结 果 + 加 ${ 17 + 5 } 22 - 减 ${ 17 - 5 } 12
JsP20技术手册 {17*5} 或div s{17/5}或${17div5)阝3 %或mod 余数 S{17%5}或${17mod5 接下来,我们依照下列几种情况,详细说明EL算术运算符的规则 (1)A{+,一,* 假若A和B为mull:回传(Long)0 ●假若A或B为 BigDecimal时,将另一个也转为 BigDecimal,则 假若运算符为+时:回传A.add(B) ·假若运算符为一时:回传A. subtract(B) 假若运算符为*时:回传A. multiply(B) ●假若A或B为 Float、 Double或包含e/E的字符串时 假若A或B为 BigInteger时,将另一个转为 BigDecimal,然后依照运算符执行 运算 否则,将两者皆转为 Double,然后依照运算符执行运算 ●假若A或B为 BigInteger时,将另一个也转为 Biglnteger,则 ·假若运算符为+时:回传A.add(B 假若运算符为一时:回传A. subtract(B) 假若运算符为*时:回传A. multiply(B) ●否则,将A和B皆转为Long,然后依照运算符执行运算 假若运算结果产生异常时,则错误! (2)A/, div B ●假若A和B为null:回传(Long)0 假若A或B为 BigDecimal或 Biginteger时,皆转为 BigDecimal,然后回传A. divide(B, BigDecimal ROUND HALF UP) Java爱好者htp/ w.javafan. net制作
JSP2.0 技术手册 Java 爱好者 http://www.javafan.net 制作 * 乘 ${ 17 * 5 } 85 / 或 div 除 ${ 17 / 5 } 或 ${ 17 div 5 } 3 % 或 mod 余数 ${ 17 % 5 } 或 ${ 17 mod 5 } 2 接下来,我们依照下列几种情况,详细说明 EL 算术运算符的规则: (1) A {+ ,- , *} B ● 假若 A 和 B 为 null:回传 (Long)0 ● 假若 A 或 B 为 BigDecimal 时,将另一个也转为 BigDecimal,则: ·假若运算符为 + 时:回传 A.add(B) ·假若运算符为 - 时:回传 A.subtract(B) ·假若运算符为 * 时:回传 A.multiply(B) ● 假若 A 或 B 为 Float、Double 或包含 e / E 的字符串时: ·假若 A 或 B 为 BigInteger 时,将另一个转为 BigDecimal,然后依照运算符执行 运算 ·否则,将两者皆转为 Double,然后依照运算符执行运算 ● 假若 A 或 B 为 BigInteger 时,将另一个也转为 BigInteger,则: ·假若运算符为 + 时:回传 A.add(B) ·假若运算符为 - 时:回传 A.subtract(B) ·假若运算符为 * 时:回传 A.multiply(B) ● 否则,将 A 和 B 皆转为 Long,然后依照运算符执行运算 ● 假若运算结果产生异常时,则错误! (2) A {/ , div} B ● 假若 A 和 B 为 null:回传 (Long)0 ● 假若 A 或 B 为 BigDecimal 或 BigInteger 时,皆转为 BigDecimal,然后回传 A.divide(B, BigDecimal.ROUND_HALF_UP)