- 浏览: 308732 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (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 2559大家应该理解浅拷贝和深拷贝的区别: 浅拷贝:被复制对象的任何 ... -
深入 Lucene 索引机制
2011-09-21 21:49 617简介: Lucene 是一个 ... -
Apache DBUtils使用总结
2011-09-19 10:50 982Apache DBUtils使用总结 DBU ... -
Java搜索引擎 Lucene
2011-09-19 10:43 883Lucene 是一套用于全文 ... -
Java的弱引用(Weak Reference)
2011-09-16 08:47 1326之前一直没有接触 ... -
JAVA读取大文件
2011-09-13 10:27 3400/** * */ package com.b2s. ... -
Java性能优化技巧
2011-09-06 11:59 891摘要: ==================== ... -
java程序性能优化
2011-09-06 11:58 695一、避免在循环条件中使用复杂表达式 在不做编译优化 ... -
大家在普遍认识中对架构师这一职业有哪些误区
2011-09-04 10:26 747误区一 架构师与项目经理没有区别。大家经常在 ... -
Ibatis执行SQL操作把SQL打印到控制台
2011-08-10 10:46 2773要想让Ibatis打印SQL语句到控制台,可以在log4j.x ... -
用 PMD 铲除 bug
2011-06-08 17:33 1033简介: PMD 是一个开源的静态分析工具,是一个值得您添加 ... -
Web Service 实现分布式服务的基本原理
2011-05-24 13:27 1498简单的说, 就是客户端 ... -
Web Service概述
2011-05-24 10:16 1008Web Service是构建互联网 ... -
有关母亲的名人名言
2011-05-09 08:42 812God could not be everywhere and ... -
装饰器模式[Decorator]
2011-05-06 17:42 732装饰器模式 主要应用于这样一种场合,当你已经 ... -
Java 7已经完成的七大新功能预览
2011-05-06 12:26 1145今年的Devoxx大会又是一次有关Java 7进程的一 ... -
回归测试
2011-05-04 17:16 797回归测试, 英文是Regression testing。 ... -
jxl 使用总结收藏
2011-04-29 17:33 965jxl的一些总结 要 ... -
Struts1下如何实现国际化
2011-04-25 14:18 1141Struts1下如何实现国际化 1.ApplicationR ... -
JAVA静态导入(import static)详解
2011-04-20 17:52 4025在Java 5中,import语句得到了增强,以便提供甚至更加 ...
相关推荐
Struts2 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它在Struts2框架中扮演着核心角色,用于数据绑定、控制流程以及动态方法调用。这篇博文可能详细介绍了Struts2框架中OGNL的使用、工作原理...
### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...
在这个“Struts2 OGNL用法项目”中,我们将深入探讨OGNL(Object-Graph Navigation Language),它是Struts2中一个强大的表达式语言,用于在模型对象和视图之间进行数据绑定和表达式计算。 OGNL是Struts2的核心组件...
OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于在Action对象和视图之间传递数据。在这个主题中,我们将深入探讨Struts2 OGNL2.6.11的源码,了解其内部工作原理和关键功能。 首先,...
Struts2 OGNL表达式是Java开发中一个重要的知识点,尤其在Web应用程序设计中扮演着核心角色。OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它被Struts2框架广泛用于视图层与模型层之间的数据...
Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...
struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...
Struts2 OGNL语言学习笔记 OGNL(Object-Graph Navigation Language)是 Struts 2 中的一种表达式语言,主要用于简化 JSP 页面中的编码,使页面与后台代码分离。下面是 OGNL 语言的主要特点和用法: 1. 支持对象...
Struts2 OGNL---标签详解析 都有实例 适合初学者
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
这个"Struts2 OGNL示例(Maven项目)"提供了使用OGNL与Struts2集成的实例,帮助开发者更好地理解和应用这一强大的特性。 首先,让我们了解什么是OGNL。OGNL是一种强大的表达式语言,允许我们访问和修改对象图中的...
这个压缩包包含的是OGNL的2版本的源代码,这对于理解Struts2框架的工作原理以及OGNL语言的实现细节非常有帮助。 OGNL的主要功能是提供一种简洁的方式来获取和设置对象的属性,甚至可以处理复杂的对象图。例如,你...
关于struts2 OGNL 详细教程,对初学者有帮助
Struts2 OGNL(Object-Graph Navigation Language)表达式是一种强大的、动态的数据绑定和脚本语言,广泛应用于Struts2框架中。它允许开发者在视图层与模型层之间灵活地传递数据,增强了MVC架构中的灵活性。本文将...
8. **Struts2中的OGNL拦截器**:Struts2框架使用了一系列拦截器来增强OGNL的功能,例如ValueStack,它可以将Action上下文中的所有对象暴露给OGNL表达式。这使得在视图层直接访问Action的属性变得简单。 总的来说,...
Struts2 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,广泛应用于Apache Struts2框架中,用于在视图、控制器和模型之间进行数据的表达和操作。Struts2是Java Web开发中最流行的MVC框架之一,而...
### Struts2 OGNL 表单提交问题详解 #### 一、背景介绍 Struts2框架作为一款流行的企业级应用开发框架,在处理MVC架构方面有着独特的优势。其中,OGNL (Object-Graph Navigation Language) 作为一种强大的表达式...
struts2 ognl源文件 在ECLIPSE导入后可方面的利于开发