4.1、EL语法
EL表达式是以${开头,以}结束。一个EL表达式构造如下:
${expression}
例如,编写表达式x+y时,要使用以下结构:
${x+y}
两个表达式相连接,这种也很常见,表达式的运算顺序是从左到右。如果a+b等于8,c+d等于10,下面这两个表达式的结果将是810:
${a+b}${c+d}
字符${表示某一个EL表达式开始了。如果你想要发送字符${,则必须转换掉第一个字符,如:\${。
4.1.1、保留字
下面是一些保留字,不能用作标识符:
and eq gt true instanceof or ne le false empty not It ge null div mod
4.1.2、[]和.运算符
要访问某个对象的属性,可以使用以下任意一种形式:
${object[“propertyName”]}
${object.propertyName}
但是,如果propertyName不是有效的Java变量名称,则只能使用[]运算符。例如,下面这两个EL表达式可以用来访问隐式对象标头中的HTTP标头host:
${header[“host”]}
${header.host}
但是,要访问accept-language标头,则只能使用[]运算符,因为accept-language不是一个合法的java变量名称。如果用.运算符来访问它,将会导致抛出一个异常。
如果一个对象的属性碰巧返回另一个带有属性的对象,那么就可以利用[]或者.来访问第二个对象的属性。下面的这些表达式都是相等的。
${pageContext[“request”][“servletPath”]}
${pageContext.request[“servletPath”]}
${pageContext.request.servletPath}
${pageContext[“request”].servletPath}
要访问HttpSession,可使用下面这个语法:
${pageContext.session}
下面的这个表达式输出session标识符:
${pageContext.session.id}
4.1.3、运算规则
EL表达式的运算顺序是从左到右。
4.2、访问JavaBean
我们可以利用.或[]运算符来访问一个Bean的属性,其构造如下:
${beanName[“propertyName”]}
${beanName.propertyName}
例如,要访问myBean中的secret属性,要使用下面这个表达式:
${myBean.secret}
4.3、EL隐式对象
1、pageContext:当前jsp页面的javax.servlet.jsp.PageContext
2、initParam:包含所有context初始化参数并以参数名称做为键的map
3、Param:包含所有请求参数并以参数名称做为键的Map。每个键的值就是指定名称的第一个参数值。因此,如果有两个同名的请求参数,将只有第一个参数可以利用param对象获取到,要想获取所有同名参数的值,则要使用params对象。
4、paramValues:包含所有请求参数并以参数名称做为键的Map。每个键的值就是包含所有指定名称值的一个字符串数组。如果该参数只有一个值,它仍然会返回一个只有一个元素的数组。
5、Header:包含所有请求标头并以标头名称做为键的Map。每个键的值就是指定标头名称的第一个标头。换句话说,如果某个标头具有多个值,将只返回第一个值。要想获得多值标头,则要使用headerValues对象。
6、headerValues:包含所有请求标头并以标头名称做为键的Map。每个键的值就是包含指定标头名称所有值的一个字符串数组。如果标头只有一个值,将返回只有一个元素的数组。
7、Cookie:包含当前请求对象中的所有Cookie对象的Map。Cookie的名称就是Map的键,每一个键都映射到一个Cookie对象。
8、applicationScope:包含servletContext对象中所有属性并以属性名称作为键的Map。
9、sessionScope:包含HttpSession对象中所有属性并以属性名称作为键的Map
4.3.1、pageContext
pageContext对象表示当前jsp页面的javax.servlet.jsp.PageContext。它包含所有其他的jsp隐式对象。
Jsp隐式对象:request、response、out、session、application、config、pageContext、page、exception。
我们可以用下面任意一个表达式获得当前的ServletRequest:
${pageContext.request}
${pageContext[“request”]}
请求方法则可以利用以下任意一个表达式获得:
${pageContext[“request”][“method”]}
${pageContext[“request”].method}
${pageContext.request[“method”]}
${pageContext.request.method}
注:${param.name}等价于request.getParameter(“name”),这两种方法一般用于服务器从页面或客户端获取的内容。
${requestScope.name}等价于request.getAttribute(“name”),一般是从服务器传送结果到页面,在页面中取出服务器保存的值。
4.3.2、initParam
隐式对象initParam用于获取一个context参数值。例如,要想获得context参数password,需使用下面的表达式:
${initParam.password}
或者${initParam[“password”]}
4.3.3、param
隐式对象param用于获取一个请求参数。这个对象表示一个包含所有请求参数的Map。例如,为了获取参数userName,需使用下面任意一个表达式:
${param.userName}、${param[“userName”]}
4.3.4、paramValues
利用隐式对象paramValues可以获取一个请求参数的多个值。可以使用如下表达式:
${paramValues.selectedOption[0]}
4.3.5、header
隐式对象header表示一个包含所有请求标头的Map。要获取一个标头值,需用该标头名称做为键。例如,要获取accept-language标头的值,需用下面的表达式:
${header[“accept-language”]}
如果该标头名称是一个有效的java变量名,如connection,那么也可以使用.运算符:
${header.connection}
4.3.6、headerValues
${headerValues[“accept-language”][0]}
4.3.7、cookie
利用隐式对象cookie可以获取一个cookie。这个对象表示包含当前HttpServletRequest中所有cookie的Map。例如要获取一个名为jessionid的cookie值,需使用下面这个表达式:
${cookie.jessionid.value}
要获取jessionid cookie的路径值,则使用这个表达式:
${cookie.jessionid.path}
4.3.8、applicationScope、sessionScope、requestScope及pageScope
注意:在Servlet/Jsp编程中,有作用范围的对象是指放在以下这些对象中作为属性的对象:PageContext、ServletRequest、HttpSession或者ServletContext。隐式对象pageScope、requestScope、sessionScope与applicationScope相似。但是其范围分别是page、request及session。
有作用范围的对象也可以用一个没有指定范围的EL表达式进行反问。在这种情况下JSP容器将会返回在PageContext、ServletRequest、HttpSession或者ServletContext中第一次识别到的指定对象。搜索范围从最小范围(PageContext)开始,到最大范围(ServletContext)。例如:下面的表达式将返回任意范围的today所引用的对象:
${today}
4.4、使用其他EL运算符
4.4.1、算数运算符
算数运算符有5个:+、-、*、/、%
4.4.2、关系运算符
下面是关系运算符列表:
等于(==和eq)
不等于(!=和ne)
大于(>和gt)
大于或等于(>=和gt)
小于(<和lt)
小于或等于(<=和le)
4.4.3、逻辑运算符
And(&&和and)
Or(||和or)
Not(!和not)
4.4.4、条件运算符
EL条件运算符具有下列语法:
${statement?A:B}
4.4.5、empty运算符
Empty运算符用来检验一个是否为null或者为空。
${empty x}
如果X为null,或者如果x是一个长度为0的字符串,那么该表达式将返回true。如果x是一个空的Map、空数组或者空集合,它也是返回true,否则返回false。
4.5、在JSP2.0及更高版本中配置EL
4.5.1、实现无脚本的JSP页面
下面示范如何在应用程序中关闭所有JSP页面的脚本:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
4.5.2、关闭EL运算
第一、可以将page指令的isELIgnored属性值设为true,如:
<%@ page isELIgnored=”true” %>
第二、在web.xml中配置
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
4.6、小结
EL是JSP2.0及更新版本中最重要的特性之一。它可以帮助你编写出更简短、更高效的JSP页面,以及帮助你编写无脚本的页面。