- 浏览: 300662 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (187)
- JAVA (66)
- JS (2)
- AJAX (9)
- Servlet (5)
- eclipse (4)
- html (2)
- PL/SQL (9)
- SOAP (1)
- other (14)
- JavaScript (8)
- Struts2 (6)
- Spring (10)
- Hibernate (5)
- JSP (1)
- Linux (3)
- WebService (2)
- 数据结构 (1)
- DB (5)
- English (1)
- maven (4)
- Code standard (2)
- SQL (1)
- 软件架构 (1)
- Tomcat (2)
- windows (1)
- HSQL (0)
- Open source framework (0)
- Web (6)
- Compass (0)
- Flex (1)
- OSGI (1)
- python (3)
- groovy (2)
- JPA (2)
- svn (1)
- jetty (1)
最新评论
-
zjfshowtime:
it doesn't work !why
Tomcat 和 Jetty 下 JNDI 配置 DBCP 连接池 -
coco5012:
Useful
sql server日期时间函数 datetime -
烟花弥散:
弱弱的问一句,您的第一个举例中else 后面可以跟判断条件吗? ...
Java高手论道:你还在用if else吗? -
coco5012:
Not very simple
使用assembly plugin实现自定义打包 -
mqlfly2008:
[color=red][size=medium][size=x ...
Java高手论道:你还在用if else吗?
1.OGNL表达式语言 相对EL表达式,它提供了平时我们需要的一些功能,如: Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图
另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。 在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象 在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
3.由于ValueStack(值栈)是Struts
2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性: 如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。 session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。 request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName")。 parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。 attr对象:用于按page->request->session->application顺序访问其属性。 4.为何使用EL表达式能够访问valueStack中对象的属性 原因是Struts2对HttpServletRequest作了进一步的封装。简略代码如下: public class StrutsRequestWrapper extends HttpServletRequestWrapper
{ 5.采用OGNL表达式创建List/Map集合对象 如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。 生成一个Map对象: Set标签用于将某个值放入指定范围。
not in表达式: 7.OGNL表达式的投影功能 8.property标签
10.if/elseif/else标签 10.url标签 <s:url action="helloworld_add" namespace="/test"><s:param
name="personid"
value="23"/></s:url> 当标签的属性值作为字符串类型处理时, “%”符号的用途是计算OGNL表达式的值。
如果集合为list 如果集合为MAP
生成如下html代码: 13.表单标签_radio单选框 14.表单标签_select下拉选择框 |
__________________________________________________________________________
其实 OGNL 获取 Context 中的对象中的属性的方法很简单: person.name 就可以获取 person 对象的 name 属性的值。 OGNL 会从当前 valueStack 开始查找所要求的属性,一直往上层查找,直到找到为止。
除此之外, Struts2 还提供了一些命名对象,它们存在于 Stack Context 中,所以访问这些对象时需要使用 # 前缀来指明。
1 , parameters 对象,用于访问 HTTP 请求参数。如 #parameters['foo'] 或 #parameters.foo ,用于返回调用 HttpServletRequest.getParameter("foo") 的返回值。
2 , request 对象,用于访问 HttpServletRequest 的属性。如 #request['foo'] 或 #request.foo ,用于返回调用 HttpServletRequest.getAttribute("foo") 的返回值。
3 , session 对象,用于访问 HttpSession 的属性。如 #session['foo'] 或 #session.foo ,用于返回调用 HttpSession.getAttribute("foo") 的返回值。
4 , application 对象,用于访问 ServletContext 的属性。如 #application['foo'] 或 #application.foo ,用于返回调用 ServletContext.getAttribute("foo") 的返回值。
5 , attr 对象,如果可以访问到,则访问 PageContext ,否则将依次搜索如下对象: HttpServletRequest, HttpSession , ServletContext 中的属性。
OGNL 表达式还可以直接生成一个集合,如:
{e1,e2,e3} 可以生成一个 List ;多个元素之间以英文逗号分隔。
#{key1:value1,key2:value2} 可以生成一个 Map ; key-value 之间以英文冒号分隔,多个元素之间以英文逗号分隔。
OGNL 还提供了两个元素符: in 和 not in , in 判断某个元素是否在指定的集合中, not in 判断某个元素是否不在指定集合中。如下例:
<s:if test="'foo'" in {'foo','fooo'} > 包含 </s>
<s:if test="'foo'" not in {'foo','fooo'} > 不包含 </s>
除此之后, OGNL 还允许通过某个规则取得集合的子集。取得子集时有如下 3 个操作符:
1 , ? 取出所有符合选择逻辑的元素
2 , ^ 取出符合选择逻辑的第一个元素
3 , $ 取出符合选择逻辑的最后一个元素
如以下代码: person.relatives.{? #this.gender == 'male'}
直接在集合后紧跟 .{} 运算符表明用于取出该集合的子集,在 {} 内使用 ? 表明取出所有符合选择逻辑的元素,而 #this 代表集合里元素。因此,上面代码的含义是:取出 person 里所有的 gender 等于 male 的 relatives 的属性的集合。
OGNL 支持基本的 Lambda( λ ) 表达式语法。通过这种 Lambda 表达式语法,可以让我们在 OGNL 表达式中使用一些简单的函数。如下面的斐波那契数列:
if n==0 return 0;
elseif n==1 return 1;
else return fib(n-2)+fib(n-1);
fib(0)=0
fib(1)=1
fib(11)=89
我们可以使用 OGNL 表达式来求该数列中第 11 个元素的值:
<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2) + #fib(#this-1)], #fib(11)" />
用 OGNL 表达式取出 valueStack 中的值的方式为 ${requtestScope.username};
------------------------------------------------------------------------------------------------------------------
OGNL就是<s:property value="username"/>标签中value里的内容。
<li>访问值栈中的action的普通属性: username = <s:property value="username"/>
</li>
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property
value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong:
<%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中对象的普通属性(get set方法): <s:property
value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property
value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()"
/></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr
/>
<li>访问静态方法:<s:property
value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property
value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property
value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new
com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property
value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property
value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property
value="users[0].age"/></li>
<li>访问Set:<s:property
value="dogs"/></li>
<li>访问Set中某个元素:<s:property
value="dogs[1]"/></li>
<li>访问Map:<s:property
value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> |
<s:property value="dogMap['dog101']"/> | <s:property
value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property
value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property
value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property
value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property
value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property
value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property
value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property
value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>[]:<s:property
value="[0].username"/></li>
发表评论
-
JAVA ArrayList深层 拷贝 克隆
2012-04-23 14:13 2496大家应该理解浅拷贝和深拷贝的区别: 浅拷贝:被复制对象的任何 ... -
深入 Lucene 索引机制
2011-09-21 21:49 577简介: Lucene 是一个 ... -
Apache DBUtils使用总结
2011-09-19 10:50 941Apache DBUtils使用总结 DBU ... -
Java搜索引擎 Lucene
2011-09-19 10:43 840Lucene 是一套用于全文 ... -
Java的弱引用(Weak Reference)
2011-09-16 08:47 1292之前一直没有接触 ... -
JAVA读取大文件
2011-09-13 10:27 3358/** * */ package com.b2s. ... -
Java性能优化技巧
2011-09-06 11:59 848摘要: ==================== ... -
java程序性能优化
2011-09-06 11:58 657一、避免在循环条件中使用复杂表达式 在不做编译优化 ... -
大家在普遍认识中对架构师这一职业有哪些误区
2011-09-04 10:26 714误区一 架构师与项目经理没有区别。大家经常在 ... -
Ibatis执行SQL操作把SQL打印到控制台
2011-08-10 10:46 2741要想让Ibatis打印SQL语句到控制台,可以在log4j.x ... -
用 PMD 铲除 bug
2011-06-08 17:33 989简介: PMD 是一个开源的静态分析工具,是一个值得您添加 ... -
Web Service 实现分布式服务的基本原理
2011-05-24 13:27 1458简单的说, 就是客户端 ... -
Web Service概述
2011-05-24 10:16 969Web Service是构建互联网 ... -
有关母亲的名人名言
2011-05-09 08:42 770God could not be everywhere and ... -
装饰器模式[Decorator]
2011-05-06 17:42 685装饰器模式 主要应用于这样一种场合,当你已经 ... -
Java 7已经完成的七大新功能预览
2011-05-06 12:26 1112今年的Devoxx大会又是一次有关Java 7进程的一 ... -
回归测试
2011-05-04 17:16 761回归测试, 英文是Regression testing。 ... -
jxl 使用总结收藏
2011-04-29 17:33 927jxl的一些总结 要 ... -
Struts1下如何实现国际化
2011-04-25 14:18 1099Struts1下如何实现国际化 1.ApplicationR ... -
JAVA静态导入(import static)详解
2011-04-20 17:52 3969在Java 5中,import语句得到了增强,以便提供甚至更加 ...
相关推荐
struts2的ognl
Struts2 OGNL---标签详解析 都有实例 适合初学者
关于struts2 OGNL 详细教程,对初学者有帮助
struts2 ognl2.6.11源代码,官网上下要很麻烦,麻烦的事就我帮各位做了
对 Struts2 OGNL 的分析与简介
本资源适合刚接触Struts和Ognl的小伙伴交流学习,欢迎吐槽。
struts2 ognl源文件 在ECLIPSE导入后可方面的利于开发
NULL 博文链接:https://chaoyi.iteye.com/blog/2161928
从官网checkout下来的源码,如果大家觉的区官网麻烦可以直接下载这个
struts2 ognl 取list ,set map ,方法,静态变量的值,
struts2OGNL表达式ActionContext及valuesStack.pdf
Struts2学习计划5---Struts2_OGNL(对象图导航语言)的学习
主要是ognl的用法,很适合新手上路的,源代码很清晰可见,一看就懂
struts2中ognl表达式的用法,详细介绍了ognl表达式与struts2基本标签的结合。
struts2 OGNL之标签访问值栈(value stack)用法,希望能对大家有帮助
Struts2中ognl-2的源代码,从官网下载的
Struts2的OGNL示例,使用Maven构建,导入请前先安装maven。
在struts2编程中,ognl帮助文档,你可导入到工程里,就可以查看相关文档。
本人在学习struts2框架时的学习笔记,主要是ognl表达式语言的运用。希望对大家有所帮助!