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

2024-03-19 14:08
文章标签 表达式 区别 联系 el ognl

本文主要是介绍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}

这篇关于EL表达式和OGNL表达式的区别和联系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826239

相关文章

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表