`
longgangbai
  • 浏览: 7308431 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Struts2中 用OGNL表达式

QQ 
阅读更多

具体记录如下:

<s:set name="fieldType" value="'condition'"></s:set>
<s:set name="countryID" value="'CHN'"></s:set>
<s:set name="corpCenter" value="#session.opType.corpCenter"></s:set>
<s:set name="corpID" value="#session.opType.corpID"></s:set>
<s:set name="corpType" value="#session.opType.corpType"></s:set>
<s:set name="agentID" value=""></s:set>
<s:set name="city" value=""></s:set>
<s:set name="agentType" value='"A"'></s:set>
注意上面红色部分的标识。当定义的变量为单个字符是,必须外面是单引号,字符用双引号引起。

<s:action name="ReportBeanListAction" id="reportBeanSkyechoAgentListAction">
                      <s:param name="agentID"><s:property value="agentID" /></s:param>
         <s:param name="city"><s:property value="city" /></s:param>
         <s:param name="corpID"><s:property value="corpID" /></s:param>
         <s:param name="corpCenter"><s:property value="corpCenter" /></s:param>
         <s:param name="agentType"><s:property value="agentType" /></s:param>
                        </s:action>

附:转载OGNL表达式相关的知识点:

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。

为什么使用OGNL
相对于其它的表达式语言,OGNL的功能更为强大,它提供了很多高级而必需的特性,例如强大的类型转换功能、静态或实例方法的执行、跨集合投影,以及动态lambda表达式定义等。
OGNL基础
OGNL表达式的计算都是围绕OGNL上下文来进行的,OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类(实现了 java.util.Map接口)来表示。OGNL上下文可以包含一个或多个JavaBean对象,在这些对象中有一个是特殊的,这个对象就是上下文的根 (root)对象。如果在写表达式的时候,没有指定使用上下文中的哪一个对象,那么根对象将被假定为表达式所依据的对象。
在OGNL上下文中,只能有一个根对象,如果你访问根对象,那么在写表达式的时候,直接写对象的属性就可以了;否则,你需要使用“#key”前缀,例如表达式#namager.name。
OGNL表达式
OGNL表达式的基础单元就是导航链,通常简称为链(chain)。最简单的链由下列部分组成:
1、属性名:如name和manager.name;
2、方法调用:如manager.hashCode(),返回manager对象的散列码;
3、数组索引:如emals[0],返回当前对象的邮件列表中的第一个邮件地址。
所有OGNL表达式的计算都是在当前对象的上下文中,一个链简单地使用链中先前链接的结果作为下一步计算的当前对象。我们看如下所示的链:
name.toCharArray()[0].numericValue.toString()
这个表达式按照下列的步骤进行计算:
1、获取根对象的name属性;
2、在String结果上调用toCharArray()方法;
3、从char数组中提取第一个字符;
4、从提取的字符对象上行到numericValue属性(这个字符被表示为Character对象,Character类有一个getNumericValue()方法);
5、在Integer对象结果上调用toString()方法。
这个表达式最终结果是最后返回的toString()方法调用返回的字符串。
常量
OGNL支持的所有常量类型:
1、字符串常量:
以单引号或双引号括起来的字符串。如”hello”,’hello’。
不过要注意的是,如果是单个字符的字符串常量,必须使用双引号。
2、字符常量:
以单引号括起来的字符。如’a'。
3、数值常量:
除了Java中的int、long、float和double外,OGNL还让你使用“b”或“B”后缀指定BigDecimal常量,用“h”“H”后缀指定BigInteger常量。
4、布尔常量:
true和false。
5、null常量。
操作符
OGNL除了支持所有的Java操作符外,还支持以下几种:
1、逗号,
与C语言中的逗号操作符类似。
2、花括号{}
用于创建列表,元素之间用逗号分隔。
3、in和not in
用于判断一个值是否在集合中。
访问JavaBean的属性
假如有一个employee对象作为OGNL上下文的根对象,那对于下面的表达式:
1、name
对应的java代码是employee.getName();
2、address.country
对应的java代码是employee.getAddress().getCountry();
访问静态方法和静态字段
@class@method(args)     //调用静态方法
@class@field           //调用静态字段
其中class必须给出完整的类名(包括包名),如果省略class,那么默认使用的类是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI
索引访问
OGNL支持多种索引方式的访问。
1、数组和列表索引
在OGNL中,数组和列表可以大致看成是一样的。
如:array[0]、list[0]。表达式:{’zhangsan’,'lisi’,'wangwu’}[1]等。
2、JavaBean的索引属性
要使用索引属性,需要提供两对setter和getter方法,一对用于数组,一对用于数组中的元素。
如:有一个索引属性interest,它的getter和setter如下
public String[] interest;
public String[] getInterest(){ return interest;}
public void setInterest(String[] interest){ this.interest=interest;}
public String getInterest(int i){ return interest[i]}
public void setInterest(int i, String newInterest){ interest[i]=newInterest;}
对于表达式interest[2],OGNL可以正确解释这个表达式,调用getInterest(2)方法。如果是设置的情况下,会调用setInterest(2,value)方法。
3、OGNL对象的索引属性
JavaBean的索引属性只能使用整型作为索引,OGNL扩展了索引属性的概念,可以使用任意的对象来作为索引。
对集合进行操作
1、创建集合:
创建列表
使用花括号将元素包含起来,元素之间使用逗号分隔。如{’zhangsan’,'lisi’,'wangwu’}
创建数组
OGNL中创建数组与Java语言中创建数组类似。
创建Map
Map使用特殊的语法来创建     #{”key”:value, ……}
如果想指定创建的Map类型,可以在左花括号前指定Map实现类的类名。如:
#@java.util.LinkedHashMap@{”key”:”value”,….}
Map通过key来访问,如map["key"]或map.key。
2、投影
OGNL提供了一种简单的方式在一个集合中对每一个元素闻调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合,称之为投影。
假如employees是一个包含了employee对象的列表,那么
#employees.{name}将返回所有雇员的名字的列表。
在投影期间,使用#this变量来引用迭代中的当前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
3、选择
OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。
如#employees.{?#this.salary>3000}
将返回薪水大于3000的所有雇员的列表。
#employees.{^#this.salary>3000}
将返回第一个薪水大于3000的雇员的列表。
#employees.{$#this.salary>3000}
将返回最后一个薪水大于3000的雇员的列表。
lambda表达式
lambda表达式的语法是:   :[...]。OGNL中的lambda表达式只能使用一个参数,这个参数通过#this引用。
如:
#fact= :[ #this<=1 ? 1 : #this* #fact ( #this-1) ], #fact(30)
#fib= :[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。

为什么使用OGNL
相对于其它的表达式语言,OGNL的功能更为强大,它提供了很多高级而必需的特性,例如强大的类型转换功能、静态或实例方法的执行、跨集合投影,以及动态lambda表达式定义等。
OGNL基础
OGNL表达式的计算都是围绕OGNL上下文来进行的,OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类(实现了 java.util.Map接口)来表示。OGNL上下文可以包含一个或多个JavaBean对象,在这些对象中有一个是特殊的,这个对象就是上下文的根 (root)对象。如果在写表达式的时候,没有指定使用上下文中的哪一个对象,那么根对象将被假定为表达式所依据的对象。
在OGNL上下文中,只能有一个根对象,如果你访问根对象,那么在写表达式的时候,直接写对象的属性就可以了;否则,你需要使用“#key”前缀,例如表达式#namager.name。
OGNL表达式
OGNL表达式的基础单元就是导航链,通常简称为链(chain)。最简单的链由下列部分组成:
1、属性名:如name和manager.name;
2、方法调用:如manager.hashCode(),返回manager对象的散列码;
3、数组索引:如emals[0],返回当前对象的邮件列表中的第一个邮件地址。
所有OGNL表达式的计算都是在当前对象的上下文中,一个链简单地使用链中先前链接的结果作为下一步计算的当前对象。我们看如下所示的链:
name.toCharArray()[0].numericValue.toString()
这个表达式按照下列的步骤进行计算:
1、获取根对象的name属性;
2、在String结果上调用toCharArray()方法;
3、从char数组中提取第一个字符;
4、从提取的字符对象上行到numericValue属性(这个字符被表示为Character对象,Character类有一个getNumericValue()方法);
5、在Integer对象结果上调用toString()方法。
这个表达式最终结果是最后返回的toString()方法调用返回的字符串。
常量
OGNL支持的所有常量类型:
1、字符串常量:
以单引号或双引号括起来的字符串。如”hello”,’hello’。
不过要注意的是,如果是单个字符的字符串常量,必须使用双引号。
2、字符常量:
以单引号括起来的字符。如’a'。
3、数值常量:
除了Java中的int、long、float和double外,OGNL还让你使用“b”或“B”后缀指定BigDecimal常量,用“h”“H”后缀指定BigInteger常量。
4、布尔常量:
true和false。
5、null常量。
操作符
OGNL除了支持所有的Java操作符外,还支持以下几种:
1、逗号,
与C语言中的逗号操作符类似。
2、花括号{}
用于创建列表,元素之间用逗号分隔。
3、in和not in
用于判断一个值是否在集合中。
访问JavaBean的属性
假如有一个employee对象作为OGNL上下文的根对象,那对于下面的表达式:
1、name
对应的java代码是employee.getName();
2、address.country
对应的java代码是employee.getAddress().getCountry();
访问静态方法和静态字段
@class@method(args)     //调用静态方法
@class@field           //调用静态字段
其中class必须给出完整的类名(包括包名),如果省略class,那么默认使用的类是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI
索引访问
OGNL支持多种索引方式的访问。
1、数组和列表索引
在OGNL中,数组和列表可以大致看成是一样的。
如:array[0]、list[0]。表达式:{’zhangsan’,'lisi’,'wangwu’}[1]等。
2、JavaBean的索引属性
要使用索引属性,需要提供两对setter和getter方法,一对用于数组,一对用于数组中的元素。
如:有一个索引属性interest,它的getter和setter如下
public String[] interest;
public String[] getInterest(){ return interest;}
public void setInterest(String[] interest){ this.interest=interest;}
public String getInterest(int i){ return interest[i]}
public void setInterest(int i, String newInterest){ interest[i]=newInterest;}
对于表达式interest[2],OGNL可以正确解释这个表达式,调用getInterest(2)方法。如果是设置的情况下,会调用setInterest(2,value)方法。
3、OGNL对象的索引属性
JavaBean的索引属性只能使用整型作为索引,OGNL扩展了索引属性的概念,可以使用任意的对象来作为索引。
对集合进行操作
1、创建集合:
创建列表
使用花括号将元素包含起来,元素之间使用逗号分隔。如{’zhangsan’,'lisi’,'wangwu’}
创建数组
OGNL中创建数组与Java语言中创建数组类似。
创建Map
Map使用特殊的语法来创建     #{”key”:value, ……}
如果想指定创建的Map类型,可以在左花括号前指定Map实现类的类名。如:
#@java.util.LinkedHashMap@{”key”:”value”,….}
Map通过key来访问,如map["key"]或map.key。
2、投影
OGNL提供了一种简单的方式在一个集合中对每一个元素闻调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合,称之为投影。
假如employees是一个包含了employee对象的列表,那么
#employees.{name}将返回所有雇员的名字的列表。
在投影期间,使用#this变量来引用迭代中的当前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
3、选择
OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。
如#employees.{?#this.salary>3000}
将返回薪水大于3000的所有雇员的列表。
#employees.{^#this.salary>3000}
将返回第一个薪水大于3000的雇员的列表。
#employees.{$#this.salary>3000}
将返回最后一个薪水大于3000的雇员的列表。
lambda表达式
lambda表达式的语法是:   :[...]。OGNL中的lambda表达式只能使用一个参数,这个参数通过#this引用。
如:
#fact= :[ #this<=1 ? 1 : #this* #fact ( #this-1) ], #fact(30)
#fib= :[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)

分享到:
评论
3 楼 longgangbai 2009-10-30  
asdf001_ 写道
上面QQ写错了。
正确的:627387074

好像要实现ModelDriven的接口,并实现特定方法:
如下:
类声明如下:
public class LoginAction extends ActionSupport implements ModelDriven<UserVO>
声明的屬性
private UserVO user = new UserVO();
实现方法如下:
public UserVO getModel() {
return user;
}
2 楼 asdf001_ 2009-10-27  
上面QQ写错了。
正确的:627387074
1 楼 asdf001_ 2009-10-27  
我在OGNL时,出了问题,帮我看看可以吗??我QQ:627397074
谢谢。
public class User {
private String username;
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}

public class LoginAction extends ActionSupport {

private User user;

@Override
public String execute() throws Exception {
if ("aaa".equals(user.getUsername())
&& "bbb".equals(user.getPassword())) {
System.out.println(user.getUsername()+ "========"+ user.getPassword());
return SUCCESS;
}
return INPUT;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

页面:
名字属性获取:
<s:property value="user.username" />

请帮我看看?

相关推荐

    Struts2 如何使用OGNL表达式(三十八)

    本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的核心组成部分,它允许开发者在Action类和JSP页面之间灵活地传递和访问数据。在Action类中,你可以设置属性,然后在JSP页面上通过OGNL...

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    Struts2 使用OGNL表达式

    以下是一些关于Struts2中OGNL表达式的关键知识点: 1. **基础语法**:OGNL表达式的格式通常为`object.property`或`object[index]`,用于访问对象的属性或数组/集合的元素。例如,`user.name`将获取名为`user`的对象...

    Struts2的标签库及OGNL表达式语言

    本篇文章将详细探讨Struts2中的OGNL表达式语言以及标签库。 **OGNL(对象图导航语言)** OGNL是一种强大的表达式语言,它允许开发者通过简洁的语法来访问和操作对象的属性。在Struts2框架中,OGNL扮演着至关重要的...

    ognl表达式 ognl表达式

    #### 五、Struts2中的OGNL表达式实现机制 为了使EL表达式能够访问`ValueStack`中的数据,Struts2在`HttpServletRequest`的基础上封装了一个类——`StrutsRequestWrapper`。这个类重写了`getAttribute_r`方法,使其...

    struts2标签和OGNL表达式

    在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`&lt;s:property value="name"/&gt;`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...

    struts2标签和OGNL表达式.pdf

    在Struts2中,OGNL被用于处理各种对象,包括值栈(Value Stack)、请求、会话、应用范围的属性等。它能够对这些对象进行查询、操作和修改。OGNL表达式的格式通常包括对对象、属性和方法的引用。例如,可以使用OGNL...

    struts2-OGNL表达式测试

    在Struts2中,OGNL表达式的用途广泛,包括但不限于以下几点: 1. **动作结果映射**:在struts.xml配置文件中,你可以使用OGNL来决定哪个动作方法将被调用,比如`${method}" /&gt;`,这里的`method`属性可以通过请求...

    struts2 OGNL表达式

    在Struts2中,OGNL被用作默认的表达式语言,用于在Action类和JSP页面之间传递数据,以及在Action上下文中进行动态方法调用。 在Struts2的配置文件中,如struts.xml或struts.properties,你可以看到OGNL表达式的使用...

    Struts2深入学习----OGNL表达式原理

    其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于数据绑定和表示层的数据操作。这篇深入学习的文章主要探讨了OGNL表达式的原理和使用。 首先,我们来理解一下OGNL是什么。OGNL是...

    struts2 ognl表达式

    在Struts2中,OGNL表达式可以嵌入到各种基本标签中,如`s:textfield`, `s:property`, `s:action`等,以实现动态的数据展示和交互。例如,`&lt;s:property value="%{#session.user.name}" /&gt;`会将session中user对象的...

    struts2中ognl表达式的理解和用法

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL表达式的理解和用法。 OGNL的全称是对象图导航语言,它的主要功能是在对象模型...

    struts2_OGNL表达式ActionContext及valuesStack

    本文将深入探讨Struts2中的OGNL表达式,ActionContext以及valuesStack。 首先,OGNL表达式是Struts2中不可或缺的一部分,它允许开发者以一种声明式的方式访问和修改对象的属性。比如,`myBean.getMyProperty()`这样...

    OGNL表达式

    - **#**:通常用于表示OGNL表达式,在Struts2中作为OGNL表达式的开头标记。 - **%**:用于指定JSP页面的编码格式,如`;charset=utf-8" pageEncoding="utf-8" %&gt;`。 - **$**:在JSP页面中表示EL表达式的开头,但在...

    ognl表达式案例

    总的来说,这个案例将帮助我们理解如何在Struts2中使用OGNL表达式来实现数据的展示和操作,以及如何通过Struts2的标签库更好地利用OGNL的功能。通过学习和实践,开发者可以提高Web应用程序的可维护性和灵活性。

    struts2 OGNL 表达式及各种标签的使用

    本文将深入探讨OGNL的基本用法、标签的使用以及其在Struts2中的实际应用。 1. **OGNL基本概念** - OGNL是一种表达式语言,用于获取和设置对象属性。它支持点号和索引访问、方法调用、运算符、集合操作等。 - 例如...

    struts2中的OGNL的源码

    其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...

    JS:ognl表达式

    ### JS:ognl表达式详解 #### 一、OGNL表达式概述 OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛...

    精通struts2的ognl表达式

    ### 精通Struts2中的OGNL表达式 在深入探讨Struts2框架的核心功能时,理解并熟练掌握OGNL(Object-Graph Navigation Language)表达式的应用是至关重要的一步。OGNL是一种强大的表达式语言,它允许开发者通过简洁、...

Global site tag (gtag.js) - Google Analytics