原EL和OGNL用法和区别总结
摘要1、EL表达式单纯出现在jsp中,在四个作用域中取值,page,request,session,application;在struts2环境下,除了上述位置之外还能从valueStack(值栈)中取值。ognl表达式2、OGNL表达式: 读取从后台传递的值%{#name}:表示从值栈的map中取值%{name}:表示从对象栈中取值%{#request.name}:表示从request域中取值
ThreadLocal:不是“本地线程”,而是Thread的局部变量,ThreadLocal为每个使用该变量
的线程提供独立的变量副本,所以每个线程都可以独立改变自己的副本,而不会影响其他线程所对应
的副本。
在同步机制中,通过对象的锁机制保证同一时间只用一个线程访问变量。这个时候改变量是多个线程
共享的,使用同步机制要求程序决定何时锁定某个对象。
ThreadLocal则从另一个角度来解决线程并发访问,它为每个线程都提供一个独立的变量副本,
从而隔离了多个线程对于数据访问的冲突。
总之,对于多线程资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal采用了
"以空间换时间"的方式,前者仅提供了一分变量,让不同的线程排队访问,而后者为每个线程都提供了一份变量
因此可以互补影响。
对于Struts2中的ActionContext就是采用threadLocal方式,每个线程中的值都是唯一的。不用担心动作的
线程安全性。ognl表达式
EL表达式:
1、语法结构
${expression}
2、[]和.运算符
当存取的属性名称中包含一些特殊的字符时,如.或者?并非字符或者数字的符号,
必须采用[];如果要动态的获取值时,就可以采用[],而.无法做到动态取值,如${session.Scope.user[data]}其中data是变量。
3、el隐含对象
1)、与范围有关的对象
pageScope,requestScope,sessionScope,applicationScope,
与jsp中的pageContext,requset,session和application基本对应,只能获取该范围中的属性值,
不能获取其他信息。
2)、与输入有关的隐含对象
param和paramValues比较特别的隐含对象;获取用于请求的参数
${param.name}/${paramValues.name}--------获取同名请求参数的所用值。
3)、其他隐含对象
JSTL没有设定获得cookie的动作,可以使用el表达式${cookie,userCountry}
header和headValues:
header储存用户浏览器和服务端用来沟通的信息${header["User-Agent"]}
initParam:取得设定Web站点的环境参数
pageContext取得其他有关用户要求或页面的信息
OGNL:Object graph Navigatioin language----对象图形导航语言。
OGNL是一个对象,属性的查询语言。在其中有个类型为Map的Context,在这个
上下文中有个根元素root,对于根元素的访问的可以直接使用属性名字,但是对于其他非根元素
的访问必须加上特殊符号#
在Struts2中上下文是ActionContext,根元素为ValueStack(值栈,值栈代表了一族
对象而不是一个对象,其中Action类的实例也属于值堆栈的一个)
ActionContext容器结构如下:
---application
-----session
context map---|
----------- value stack(root)
-----------request
-----------parameters
-----------arr(page,request,session,application scopes)
访问root中变量可以直接反问,不用加#,其他都要加#
使用#包括以下情况:
1)、访问非根节点
2)、用于过滤和投影,如: books.{?#this.price>35}
3)、构造map,如:#{'foo1':'bar1','foo2':'bar2'}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-31924-1.html
唯一错的是这个社会已经形成的这个风气
这次的回归感觉都是超棒