(笔记)Spring MVC学习指南_表达式语言

1.表达式语言的语法
EL表达式以${开头,并以$}结束。EL表达式的结构:${expression}
对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为String,并且连接在一起。
${这样的字符顺序就表示是一个EL表达式的开头。如果需要的只是文本${,则需要在它前面加一个转义符,如${。
(1)关键字
以下是关键字,它们不能用作标识符:
and eq gt true instanceof or ne le false empty not lt ge null div mod
(2)[]和.运算符
EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,则可以利用[]或者.运算符来访问该属性。[]和.运算符类似,[]是比较规范的形式,.运算符则比较快捷。
${object["propertyName"]}
${object.propertyName}
但是,如果propertyName不是有效的Java变量名,只能使用[]运算符。
(3)取值规则
EL表达式的取值是从左到右进行的。对于expr-a[expr-b]形式的表达式,其EL表达式的取值方法如下:
1)先计算expr-a得到value-a
2)如果value-a为null,则返回null
3)然后计算expr-b得到value-b
4)如果value-b为null,则返回null
5)如果value-a为java.util.Map,则会查看value-b是否为Map中的一个key。若是,则返回value-a.get(value-b),若不是,则返回null
6)如果value-a为java.util.List,或者假如它是一个array,则要进行以下处理:
a.强制value-b为int,如果强制失败,则抛出异常
b.如果value-a.get(value-b)抛出IndexOutOfBoundsException,或者假如Array.get(value-a, value-b)抛出ArrayIndexOutOfBoundsException,则返回null。
c.否则,若value-a是一个List,则返回value-a.get(value-b);若value-a是一个array,则返回Array.get(value-a, value-b)。
7)如果value-a不是一个Map、List或者array,那么,value-a必须是一个JavaBean。在这种情况下,必须强制value-b为String。如果value-b是value-a的一个可读属性,则要强调用该属性的getter方法,从中返回值。如果getter方法抛出异常,该表达式就是无效的,否则,该表达式有效。
2.访问JavaBean
利用.或[]运算符,都可以访问bean的属性:
${beanName["propertyName"]}
${beanName.propertyName}
3.EL隐式对象
(1)pageContext
pageContext对象表示当前JSP页面的javax.servlet.jsp.PageContext。它包含了所以其他的JSP隐式对象。

对象EL中的类型
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
outjavax.servlet.jsp.JspWriter
sessionjavax.servlet.http.HttpSession
applicationjavax.servlet.ServletContext
configjavax.servlet.ServletConfig
PageContextjavax.servlet.jsp.PageContext
pagejavax.servlet.jsp.HttpJspPage
exceptionjava.lang.Throwable

例如,可以利用以下任意一个表达式来获取当前的ServletRequest:
${pageContext.request}
${pageContext["request"]}
(2)initParam
隐式对象initParam用于获取上下文参数的值。
${initParam.password}
${initParam["password"]}
(3)param
这是一个包含所有请求参数,并用参数名作为key的Map。每个key的值就是指定名称的第一个参数值。因此,如果两个请求参数同名,则只有第一个能够利用param获取值。要想访问同名参数的所有参数值,可以params代替。
${param.userName}
${param["userName"]}
(4)paramValues
利用隐式对象paramValues可以获取一个请求参数的多个值。这个对象表示一个包含所有请求参数,并以参数名称作为key的Map。每个key的值就是一个字符串数组,其中包含了指定参数名称的所有参数值。就算该参数只有一个值,它也仍然会返回一个带有一个元素的数值。
${paramValues.selectedOptions[0]}
(5)header
这是一个包含请求标题,并用标题名作为key的Map。每个key的值就是指定标题名称的第一个标题。换句话说,如果一个标题的值不止一个,则只返回第一个值。要想获得多个值的标题,得用headerValues对象替代。
${header["accept-language"]}
(6)headerValues
这是一个包含请求标题,并用标题名作为key的Map。每个key的值就是一个字符串数组,其中包含了指定标题名称的所有参数值。就算该标题只有一个值,它也仍然会返回一个带有一个元素的数值。
${headerValues["accept-language"][0]}
(7)cookie
这是一个包含了当前请求对象(HttpServletRequest)中所有Cookie对象的Map。
例如,为了获取名为jsessionid的cookie值,要使用:${cookie.jsessionid.value}
为了获取jsessionid cookie的路径值,要使用:{cookie.jsessionid.path}
(8)applicationScope(ServletContext对象中所有属性的Map),sessionScope(HttpSession对象中所有属性的Map),requestScope(当前HttpServletRequest对象中的所有属性)和pageScope(全页范围内的所有属性)
隐式对象applicationScope用于获取应用程序范围级变量的值。
在servlet/JSP编程中,有界对象是指在以下对象中作为属性的对象:pageContext、ServletRequest、HttpSession或者ServletContext。隐式对象sessionScope、requestScope和pageScope与applicationScope相似。但是,其范围分别为session、request和page。
有界对象也可以通过没有范围的EL表达式获取。在这种情况下,JSP容器将返回PageContext、ServletRequest、HttpSession或者ServletContext中第一个同名的对象。执行顺序是从最小范围(PageContext)到最大范围(ServletContext)。
4.使用其他EL运算符
(1)算术运算符
加法(+)、减法(-)、乘法(*)、除法(/和div)、取余/取模(%和mod)
EL表达式的计算按优先级从高到低、从左到右进行。
*、/、div、%、mod
+、-
这表示*、/、div、%、mod运算符的优先级别相同,+、-的优先级相同,但第二组运算符的优先级小于第一组运算符。
(2)逻辑运算符
和(&&和and)
或(||和or)
非(!和not)
(3)关系运算符
等于(==和eq)、不等于(!=和ne)、大于(>和gt)、大于或等于(>=和ge)、小于(<和lt)、小于或等于(<=和le)
(4)empty运算符
empty运算符用来检查某一个值是否为null或者empty。
5、如何在JSP2.0及其更高版本中配置EL
(1)实现免脚本的JSP页面
为了关闭JSP页面中的脚本元素,要使用jsp-property-group元素以及url-pattern和scripting-invalid两个子元素。

  <jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
  </jsp-config>

(2)禁用EL计算
第一种,可以将page指令的isELIgnored属性设为True
<%@ page isELIgnored=”true” %>
第二种,可以在部署描述符中使用jsp-property-group元素。

  <jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
  </jsp-config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值