EL(Expression Language)表达式语言是JSP 2.0中新增加的一种可简化JSP开发的技术,它可以非常方便地访问JSP页面相关的数据和支持基本的算术、关系和逻辑运算。EL表达式的基本语法格式为“${表达式}” 。可以出现在JSP自定义标签和标准标签的属性值中,其计算结果将作为标签的属性值或属性值的一部分。EL表达式也可以出现在模版元素中,其计算结果将插入进当前的输出流中。
使用EL表达式可以非常方便地访问JSP页面相关的数据。访问请求参数JSP表达式:<%= reqeust.getParameter("user") %>EL表达式:${param.user}访问JavaBean及其中的嵌套属性JSP表达式:<%CustomerBean custormBean =(CustomerBean)pageContext.findAttribute("customerBean");%><%= customerBean.getAddress().getCountry()%>EL表达式:${customerBean.address.country}在EL表达式中还可以直接使用${cookie.user}来访问名称为user的Cookie信息,在JSP脚本表达式中却无法实现这样的功能,虽然使用JSP脚本片断也可以 实现这个功能,但是其程序代码却比较复杂。
如果表达式的计算结果为null,JSP脚本表达式将输出内容为“null”的字符文本,而EL表达式会将它强制转换成空字符串("")后再输出,而不是显示为“null”,这样的处理结果非常有用。
在EL表达式中还可以使用empty操作符来判断一个参数是否为null、某个集合或字符串中的内容是否为空。EL表达式还具有JavaScript等脚本语言的优点,能够对字符串、数字等各种类型的数据进行自动转换,摆脱了Java语言严格的数据类型限制,使得应用起来更加简单。EL表达式仅仅是专门为网页作者量身定做的一种数据访问语言,可以方便地访问和处理应用程序数据,但是它并不一种程序设计语言,不能替代Java语言的强大功能。
JSP注释的格式:<%-- 注释信息 --%>JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。•EL是为了便于存取数据而定义的一种语言,JSP 2.0之后才成为一种标准。下面的示例就是一个简单的EL表达式:–<%@ page contentType="text/html; charset=UTF-8"%>–<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">–<html>–<body>–${stuno + 1} <br>–</body>–</html>
•JSTL语法结构为${expression},它必须以“${”开始,以“}”结束。其中间的expression部分就是具体表达式的内容。•EL表达式可以作为元素属性的值,也可以在自定义或者标准动作元素的内容中使用,但是不可以在脚本元素中使用。•EL表达式可适用于所有的HTML和JSP标签。
•EL提供(.)和([])两种运算符来存取数据,即使用点运算符(.)和方括号运算符([])。–点运算符和方括号运算符可以实现某种程度的互换,如${student.name}等价于${student [“name”]}。•当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号时,就一定要使用[]。例如${student.name }应当改为${student[“name”] }。•如果要动态取值,就可以用[]来做,而.无法做到动态取值。–例如${sessionScope.student[data]}中data是一个变量。
•EL存取变量数据的方法很简单,例如${username}。它的意思是取出某一范围中名称为username的变量。•属性范围在EL中的名称如表6.1所示。
属性范围 EL中的名称 备 注 page pageScope
request requestScope
session sessionScope
application applicationScope
•一个EL表达式包含变量、文字常量、操作符。文字常量主要包括字符串、数字和布尔值,还有NULL。•其中字符串是由任何由单引号或双引号引起来的一串字符。•数字常量包括整型、浮点型,整型表示十进制、十六进制和八进制类型的值,浮点型与Java类似,可以包含任何正的或者负的浮点数。•布尔型包括true和false。
•EL表达式的操作符主要有–算术运算符–关系运算符–逻辑运算符–验证运算符empty–条件运算符
运算符类型
|
运算符
|
功 能
|
算术运算符
|
+
|
执行加法操作
|
-
|
执行减法操作
|
|
*
|
执行乘法操作
|
|
/或div
|
执行除法操作
|
|
%或mod
|
执行取模操作
|
•与范围有关的EL隐含对象包含以下4个:–pageScope、requestScope、sessionScope和applicationScope•它们基本上就和JSP的pageContext、request、session和application一样; 在EL中,这4个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。•例如,要取得session中储存的一个username属性的值,可以利用下面的方法:–session.getAttribute("username")•在EL中则使用下面的方法:–${sessionScope.username}
•与输入有关的隐含对象有两个,即param和paramValues,它们是EL中比较特别的隐含对象。例如要取得用户的请求参数时,可以利用下列方法:–request.getParameter(String name)–request.getParameterValues(String name)•在EL中则可以使用param和paramValues两者来取得数据:–${param.name}–${paramValues.name}
•在JSP 2.0中默认是启用EL表达式的,如果需要禁用表达式的话,需要在JSP页面中使用page指令的isELIgnored属性来指定,语法如下:–<%@page isELIgnored="true|false"%>•true:表示忽略对EL表达式进行计算。•false:表示计算EL表达式。•isELIgnored默认为false。
在JSP引擎看来,出现在JSP脚本元素中的Java注释属于Java代码的一部分,它们将被原封不动地插入进Servlet源文件中,但在Servlet源文件被编译成class文件时由Java编译程序忽略。在JSP引擎看来,JSP页面中的HTML注释就是一段文本,其处理方式与普通的文本内容完全一样,都被转换成out.write语句输出到客户端。由于HTML注释相当于一段普通文本,其中当然可以嵌入JSP的其他各种元素,JSP引擎依然会对这些嵌套的JSP元素进行解释处理,例如:<!--This page was loaded on <%=(new java.util.Date()).toLocaleString()%>-->
由于三种JSP脚本元素的分界符都使用到了“<%”和“%>”,如果要在JSP模版元素和JSP脚本元素内部表示字面意义的“<%”和“%>”,需要进行转义处理。由于EL表达式使用“${”和“}”作为分界符,在一些应用中,也需要对它们进行转义处理。EL表达式内的转义EL表达式内的任何字符序列都不需要进行转义处理,${‘${’}和${“${”}都可直接输出 ${,${‘}’}和${“}”}都可直接输出 },这就好像${‘xyz’}和${“xyz”}的输出结果都是 xyz 一样的道理。脚本元素内的转义要在脚本元素内表达字面意义上的“%>”,必须用“%\>”进行转义。JSP引擎在生成servlet源文件时,将把脚本元素内部的“%\>”转换成“%>”。因为“%\>”在脚本元素内要被转义处理,如果要表达字面意义上的“%\>”,应该使用“%\\>”。
J SP模版元素内的转义要在JSP模版元素内表达字面意义上的“<%”,必须用“<\%” 进行转义。要表达字面意义上的“<\%”,应该使用“<\\%”。为了让JSP引擎不要把JSP模版元素内的字符序列“${”当作EL表达式的开始,在支持EL表达式的JSP页面中,“$”可以使用“\$”来表示,但这不是必须的。如果要表达字面意义上的“${”,这时候就必须使用“\${”。如果要达字面意义上的“\$”,必须使用“\\$”。JSP标签的属性内的转义如果使用单引号(‘)将属性值部分引起来,那么属性值中的单引号要用“\’”表示。如果使用双引号(“)将属性值部分引起来,那么属性值中的双引号要用“\””表示。反斜杠(\)要用“\\”表示。在支持EL表达式的JSP页面中,“$”可以使用“\$”来表示。“<%”要用“<\%” 表示。“%>”要用“%\>” 表示。
JSP指令简介page指令include指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。JSP指令的基本语法格式:<%@ 指令 属性名="值" %>举例:<%@ page contentType="text/html;charset=gb2312"%>注意:属性名部分是大小写敏感的在目前的JSP 2.0中,定义了page、include和taglib这三种指令,每种指令中又都定义了一些各自的属性。如果要在一个JSP页面中设置同一条指令的多个属性,可以使用多条指令语句单独设置每个属性,也可以使用同一条指令语句设置该指令的多个属性。第一种方式:<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.util.Date"%>第二种方式:<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。JSP 2.0规范中定义的page指令的完整语法:<%@ page[ language=" java" ][ extends=" package. class" ][ import="{ package. class | package. *}, ..." ][ session=" true | false" ][ buffer="none | 8kb | sizekb" ][ autoFlush=" true | false" ][ isThreadSafe=" true | false" ][ info=" text" ][ errorPage="relative_url" ][ isErrorPage="true | false" ][ contentType=" mimeType [ ;charset= characterSet ]" | " text/html ; charset=ISO-8859-1" ][ pageEncoding=" characterSet| ISO-8859-1" ][ isELIgnored=" true | false" ]%>
include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。语法:<%@ include file="relativeURL"%>其中的file属性用于指定被引入文件的相对路径。细节:被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素、JSP指令和JSP行为元素等普通JSP页面所具有的一切内容。被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。在将JSP文件翻译成Servlet源文件时,JSP引擎将合并被引入的文件与当前JSP页面中的指令元素(设置pageEncoding属性的page指令除外),所以,除了import和pageEncoding属性之外,page指令的其他属性不能在这两个页面中有不同的设置值。
细节:除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。引入文件与被引入文件是在被JSP引擎翻译成Servlet的过程中进行合并,而不是先合并源文件后再对合并的结果进行翻译。当前JSP页面的源文件与被引入文件的源文件可以采用不同的字符集编码,即使在一个页面中使用page指令的pageEncoding或contentType属性指定了其源文件的字符集编码,在另外一个页面中还需要用page指令的pageEncoding或contentType属性指定其源文件所使用的字符集 。Tomcat 5.x在访问JSP页面时,可以检测它所引入的其他文件是否发生了修改,如果发生了修改,则重新编译当前JSP页面file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。假设myweb应用程序的根目录下有一个a.jsp文件,其一般的访问路径形式为:http://localhost:8080/myweb/a.jsp在a.jsp页面中使用了如下语句引入b.jspf文件:<%@ include file=“b.jspf”%>请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为什么?如果将a.jsp页面映射为如下地址:http://localhost:8080/myweb/dir1/a.html请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为:http://localhost:8080/myweb/b.jspfhttp://localhost:8080/myweb/dir1/b.jspf
在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象。只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:设置page指令的buffer属性关闭了out对象的缓存功能写入到out对象中的内容充满了out对象的缓冲区
pageContext对象简介获得其他隐式对象引入和跳转到其他资源访问各个域范围中的属性pushBody与popBody方法
pageContext对象是javax.servlet.jsp.PageContext类的实例对象,javax.servlet.jsp.PageContext类是javax.servlet.jsp.JspContext的子类。pageContext对象封装了当前JSP页面的运行信息,它提供了返回JSP页面的其他隐式对象的方法。pageContext对象是通过调用JspFactory.getPageContext方法返回的,getPageContext方法的完整语法如下:public PageContext getPageContext(javax.servlet.Servlet servlet,javax.servlet.ServletRequest request,javax.servlet.ServletResponse response,java.lang.String errorPageURL, boolean needsSession,int buffer, boolean autoflush)在JSP页面中只需将pageContext对象传递给某个Java类的实例对象,在该Java对象中就可以访问和调用其他隐式对象的功能了。PageContext类中定义了一个setAttribute方法来将对象存储进pageContext对象内部的一个HashMap对象中,同时也定义了一个getAttribute方法来检索存储在该HashMap对象中的对象。PageContext类除了可以存储和检索自身中的属性对象外,还定义了可以存储和检索其他域范围内的属性对象的方法。
getException方法返回exception隐式对象getPage方法返回page隐式对象getRequest方法返回request隐式对象getResponse方法返回response隐式对象getServletConfig方法返回config隐式对象getServletContext方法返回application隐式对象getSession方法返回session隐式对象getOut方法返回out隐式对象