EL表达式
•发布于   •作者 三国 - 魏  •406 次浏览  •来自 博客

EL表达式

    1、语法结构

     ${expression}

    2、[ ]与.运算符

        EL 提供“.“和“[ ]“两种运算符来存取数据。当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:

        ${ user. My-Name}应当改为${user["My-Name"]}

        其中.用于取属性[]用于取Array,List,Map,Set

    3、变量

    EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。

    因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。

    假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。

    属性范围在EL中的名称

Page         PageScope
Request         RequestScope
Session         SessionScope
Application     ApplicationScope

    4、EL运算符

 条件型  A ?B :C。根据 A 赋值的结果来赋值 B 或 C。
 算术运算符 +、-、*或$、/或div、%或mod
 关系运算符 ==、eq、!=、ne、lt、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
逻辑运算符  and、&&、or、||、!、not
   empty 空操作符是前缀操作,可用于确定值是否为空。

如:${empty param.name}、${A?B:C}、${A*(B+C)}

    5、隐式对象

    JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

pageContext
JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。

    pageContext取得其他有关用户要求或页面的详细信息。 

${pageContext.request.queryString}
取得请求的参数字符串
${pageContext.request.requestURL} 
取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath} 服务的web application 的名称
${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 是否为新的
${pageContext.session.id}
取得session 的ID
${pageContext.servletContext.serverInfo}
取得主机端的服务信息

    此外,还提供几个隐式对象,允许对以下对象进行简易访问:

术语
定义
param
将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 ${param . name}相当于 request.getParameter (name)。
paramValues
将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name} 相当于 request.getParamterValues(name)。
header
将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header. name} 相当于 request.getHeader(name)。
headerValues
将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。
cookie
将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues. name} 表达式。
initParam
将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。

使用El表达式是要注意

            1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

            2、 注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

举例说明:

1、例如:
< %=request. getParameter(“username”)% > 等价于 ${ param. username }
2、例如,但是下面的那句EL语言可以完成如果得到一个username为空,则不显示null,而是不显示值。

        <%=user.getAddr( ) %> 等价于 ${user.addr}。

3、例如:

        <%=request.getAttribute(“userlist”) %> 等价于$ { requestScope.userlist }

        4、例如,原理如上例3。

${requestScope.userlist} 1
${sessionScope.userlist} 2
${applicationScope.userlist} 3
${pageScope.userlist} 4

${uselist} 含义:执行顺序为4 1 2 3。

        5、“.”后面的只是一个字符串,并不是真正的内置对象,不能调用对象。如:

<%=user.getAddr( ) %> 等价于 ${user.addr}
第一句前面的user,为一个变量。
第二句后面user,必须为在某一个范围里的属性。

ognl表达式

    OGNL全名Object Graph Navigation Language,可认为是更完美EL表达式。

    1. OGNL有什么内容。

        OGNL的标准结构包含OGNL Context和ValueStack两部分。

        其中OGNL Context与传统的EL表达式大径相同,包含有  parameterMap,requestAttributeMap,

sessionAttributeMap,applicationAttributeMap

      而struts2 OGNL的ValueStack被指定为ActionContext。ActionContext是stack(先进后出的结构)的根节点,而Action中的属性成员则是stack的顶节点(第一层)。    

2. 我们先要明白OGNL能实现到什么程度的功能。 

      第一,OGNL是JSP脚本的替代品,又是EL,那么它一定是运行在服务器之上的。 

      第二,OGNL可以page,request,session,application的attribute,request的parameter范围的数据,与一般的EL一致 

      第三,OGNL可以访问Struts2中Action的属性。非常实用的数据绑定效果。 

      第四,OGNL可以创建对象,并且定制对象的数据。一般EL没有的功能呢个,弥补一大缺陷


3. OGNL的格式。
      Struts2的OGNL表达式主要涉及#%$三个特殊符号。这里我们需要强调的是实际上OGNL的范畴中只有#%两个特殊符号,而$并不属于OGNL。这是许多OGNL资料中造成误解的主要地方。

#  是OGNL查找符,当目标对象在根部或顶部,也就是根部的第一层树节点时,可直接使用对象名,并且必须只写对象名,不可使用#以作为区分。 
struts2 OGNL的查找范围为OGNL context和ActionContext,其包含下面是顶节点: 

名称            作用                                                  例子 
parameters  包含当前HTTP请求参数的Map    #parameters.id[0]作用相当于request.getParameter("id") 

request    包含当前HttpServletRequest的属性(attribute)的Map  #request.userName相当于request.getAttribute("userName") 

session    包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName") 

application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName") 

attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止 (value Stack) Action类的属性 #login.name相当于对应的Action类的name属性访问,可省略#如name但要求其actionName为login

其中parameters,request,session,application属于OGNL context范畴,而valuestack属于ActionContext范畴。

也就是说当使用parameters,request,session,application以及Action类的属性时#可省略,但这些非根非顶节点是必须完整给出#符号。 

值得注意的是:除了ValueStack可以按照javaBean的getter/setter原则展开对象视图OG,也就是Action类的成员属性可 按照getter方式查找;其余顶节点都是Map数据,只能查找自身所含的数据。我们说parameters是 requestParameterMap;request是requestAttributeMap;session是 sessionAttributeMap;application是applicationAttributeMap;attr是 page,request,session,application的attributeMap 

另外#在集合中可以作为筛选元素的条件,如books.{?#this.price<100}                //其中books是Action类的集合元素


1 回复
NOURX

刷一分

回到顶部

©2017 Powered by 三十三行伪代码
皖ICP备17005175号-3