EL表达式和OGNL表达式的区别和联系

一、EL简介 
  1.语法结构 
    ${expression} 
  2.[]与.运算符 
    EL 提供.和[]两种运算符来存取数据。 
    当要存取的属性名称中包含一些特殊字符,如.或-等并非字母或数字的符号,就一定要使用 []。例如: 

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

我们可以通过“.”操作符引 
用对象的属性,也可以用“[]”引用对象属性,如${logininfo[username]} 
与${logininfo.username}达到了同样的效果。 
“[]”引用方式的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”, 
此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免 
这一现象的出现)。 


   
  3.变量 
    EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。 
    因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。 
    假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。 
    属性范围在EL中的名称 
        Page         PageScope 
        Request         RequestScope 
        Session         SessionScope 
        Application     ApplicationScope 
        
二、EL隐含对象 
  1.与范围有关的隐含对象 
  与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和applicationScope; 
  它们基本上就和JSP的pageContext、request、session和application一样; 
  在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。 
  
  例如:我们要取得session中储存一个属性username的值,可以利用下列方法: 
    session.getAttribute("username") 取得username的值, 
  在EL中则使用下列方法 
    ${sessionScope.username} 
  2.与输入有关的隐含对象 
  与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。 
  
  例如我们要取得用户的请求参数时,可以利用下列方法: 
    request.getParameter(String name) 
    request.getParameterValues(String name) 
  在EL中则可以使用param和paramValues两者来取得数据。 
    ${param.name} 
    ${paramValues.name} 
  3.其他隐含对象 
  
  cookie 
  JSTL并没有提供设定cookie的动作, 
  例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。 
  header和headerValues 
  header 储存用户浏览器和服务端用来沟通的数据 
  例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。 
  另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。 
  initParam 
  initParam取得设定web站点的环境参数(Context) 
  例:一般的方法String userid = (String)application.getInitParameter("userid"); 
    可以使用 ${initParam.userid}来取得名称为userid 
  pageContext 
  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}   取得主机端的服务信息 
三、EL运算符 
  1.算术运算符有五个:+、-、*或$、/或div、%或mod 
  2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge 
  3.逻辑运算符有三个:&&或and、||或or、!或not 
  4.其它运算符有三个:Empty运算符、条件运算符、()运算符 

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


再补充: 
1    EL表达式用${}表示,可用在所有的HTML和JSP标签中 作用是代替JSP页面中复杂的JAVA代码. 
        2   EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}. ${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量. 
        3   <%@  page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言. 
        4   EL语言可显示 逻辑表达式如${true and false}结果是false    关系表达式如${5>6} 结果是false     算术表达式如 ${5+5} 结果是10 
        5   EL中的变量搜索范围是:page request session application   点运算符(.)和"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量 



OGNL 
OGNL是Object Graph Navigation Language的简称,详细相关的信息可以参考:http://www.ognl.org。这里我们只涉及Struts2框架中对OGNL的基本支持。 

OGNL是一个对象,属性的查询语言。在OGNL中有一个类型为Map的Context(称为上下文),在这个上下文中有一个根元素(root),对根元素的属性的访问可以直接使用属性名字,但是对于其他非根元素属性的访问必须加上特殊符号#。 

在Struts2中上下文为ActionContext,根元素位Value Stack(值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action类的实例也属于值堆栈的一个)。


ValueStack 值栈
概念: 服务器端 存储数据的,最终会在jsp中把值栈中的数据展示给客户
ValueStack的内存结构
1 ROOT 
存储了用户当前访问的action
2 Context Map
request #request
session #session
application #application
parameters #parameters
 attr  #attr   #attr.name会依次从不同的作用域对象中取出数据,哪里有,就从哪里取,类似于EL表达式中的${name}

parameters中封装了 用户从client提交的请求参数
 可以从#parameters.name获得链接中的名字为name属性的值
 表单 地址栏 超级 
 ActionContext操作 Context Map 获得 parameters中用户提交的请求参数


通过OGNL表达式 从ROOT中获得数据
1 获得Root中的一个对象的属性值,直接通过属性名获得
User{id,name,password} 放置 ROOT
OGNL:id属性名 就可以获得User对象id的属性值
User{id,name,password,Address address} 放置ROOT
OGNL:address.city
2 操作Root中的一个对象的集合属性
List/Set/数组 [下标]
User{List/Set tels} 放置 ROOT
OGNL:tels[0]
Map [key]
User{Map qqs} 放置ROOT
OGNL:qqs[key] --- value
3 在OGNL表达式中 如果获得了一个值 可以调用这个值所对应类型的方法
OGNL:name.length()
4 可以在OGNL表达式中进行 运算 (算数 比较运算 逻辑运算)
OGNL:id+1
: name=='';
5 投影筛选
ognl集合.{属性名}
6 过滤筛选 
ognl集合.{? #this.属性 > 100}
7 通过OGNL表达式 创建 集合 或者 Map
创建ArrayList集合 {1,2,3} {"suns","xiaohei","xuq"} {new User(),new User()}
创建Map #{key:value,key:value}

 通过OGNL表达式 从Context中取值
1 什么是Context 
就是一个Map
2 OGNL中如果从ContextMap中取值 那么必须以 #key方式获得
3 同 ROOT取值一致



注意事项:

在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题, 
一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件: 
<jsp-config> 
    <jsp-property-group> 
      <url-pattern>*.jsp</url-pattern> 
      <el-ignored>true</el-ignored> 
    </jsp-property-group> 
</jsp-config> 

  


二者用法区别:OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="#xx" /> struts页面中不能单独使用,el可以单独使用 ${sessionScope.username}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值