struts2的OGNL

来源:互联网 发布:照片组合软件 编辑:程序博客网 时间:2024/06/05 09:21

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能


有如下几种作用:

1.访问Action中的属性

2.访问Action中的方法和Action属性的方法

3.访问Static的方法

4.访问类的构造器

5.访问集合(list,Set,Map,数组)

6.访问Stack Context

7.投影(对于几何元素的过滤

8.特殊符号说明[]

9.特殊符号说明%符号

举例具体说明一下各个作用的用法。

首先是一些要用到的Calss

TestOGNLAction测试Action

package com.zucc.action;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import com.opensymphony.xwork2.ActionSupport;import com.zucc.manager.UserManager;import com.zucc.model.User;public class TestOGNLAction extends ActionSupport{private String username;private int age;private User user;private UserManager userManager;private List<User> userList;private Set<User> userSet;private Map<String, User> userMap;private User[] userArr;public TestOGNLAction(){userManager = new UserManager();}public String getUsername() {return username;}public int getAge() {return age;}public User getUser() {return user;}public UserManager getUserManager() {return userManager;}public List<User> getUserList() {return userList;}public Set<User> getUserSet() {return userSet;}public Map<String, User> getUserMap() {return userMap;}public User[] getUserArr() {return userArr;}@Overridepublic String execute() throws Exception {System.out.println("TestOGNLActopn execute....");this.username = "asd";this.age = 12;this.user = new User();user.setName("user.asd");user.setBirthday(new Date());this.userList = new ArrayList<User>();this.userMap = new HashMap<String, User>();this.userSet = new HashSet<User>();this.userArr = new User[10];for(int i=0;i<10;i++){User u = new User();u.setName("asd_"+i);u.setBirthday(new Date());u.setAge(i+1);this.userList.add(u);this.userSet.add(u);this.userMap.put("key"+i, u);this.userArr[i] = u;}return SUCCESS;}public String sayHello(){return "Hello OGNL";}public void showInfo(){System.out.println("TestOGNLActopn showInfo...");}}

UserDao

package com.zucc.Dao;import com.zucc.model.User;public class UserDao {public int add(User user){System.out.println("UserDao add,username:"+user.getName());return 1;}}


UserManager
package com.zucc.manager;import com.sun.org.apache.regexp.internal.recompile;import com.zucc.Dao.UserDao;import com.zucc.model.User;public class UserManager {private UserDao userDao;public UserManager(){this.userDao = new UserDao();}public UserDao getUserDao(){return userDao;}public void addUser(User user){System.out.println("UserManager addUser,user.name:"+user.getName());}}

User

package com.zucc.model;import java.util.Date;public class User {private String name;private Date birthday;private int age;public User(String name,Date birthday){this.name = name;this.birthday = birthday;}public User(){}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
StringUtil
package com.zucc.util;public class StringUtil {public static String toMD5String(String str){System.out.println("StringUtil toMD5String,str:"+str);return "sdsa";}}


接下来就是在页面上如何对各个作用的具体实现:

1.访问Action中的属性

<h1>访问Action中的属性</h1><ul>普通属性<li>EL:username:${username}</li><li>OGNL:username:<s:property value="username"/></li></ul><ul>引用对象User<li>user.name:<s:property value="user.name"/></li><li>user.birthday:<s:property value="user.birthday"/></li></ul>


2.访问Action中的方法和Action属性的方法
<h1>访问Action中的方法和Action属性的方法</h1><ul><li>Action mothod:String sayHello:<s:property value="sayHello()"/></li><li>Action mothod:void showInfo:<s:property value="showInfo()"/></li><li>Action Attr:userManager.addUser(User user):<s:property value="userManager.addUser(user)"/><li>Action Attr:userManager.userDao.add(User user):<s:property value="userManager.userDao.add(user)"/></ul>

3.访问Static的方法  可以使用@@访问java.lang.Math的所有方法

<h1>访问Static的方法</h1><ul><li>com.zucc.util.StringUtil.toMD5String(String str):<s:property value="@com.zucc.util.StringUtil@toMD5String('123456')"/></li><li>使用@@访问java.lang.Math的所有方法:<s:property value="@@sqrt(9)"/></ul>
注意:要使用OGNL访问Static的方法必须在struts.xml中设置常量struts.ognl.allowStaticMethodAccess为true

4.访问类的构造器

<h1>访问类的构造器</h1><ul><li>com.zucc.model.User():<s:property value="new com.zucc.model.User()"/><li>com.zucc.model.User().name:<s:property value="new com.zucc.model.User().name"/><li>com.zucc.model.User有参构造器:<s:property value="new com.zucc.model.User('asd',new java.util.Date()).name"/></ul>


5.访问集合(list,Set,Map,数组)
<h1>访问集合(list,Set,Map,数组)</h1><ul><li>List:<s:property value="userList"/></li><li>List[0].name:<s:property value="userList[0].name"/></li><li>Arr:<s:property value="userArr"/></li><li>Arr[1]:<s:property value="userArr[1].age"/></li><li>Set:<s:property value="userSet"/></li><!-- Set不能得到Set中的特定的数据--><li>Map:<s:property value="userMap"/></li><li>Map['key2']:<s:property value="userMap['key2'].name"/></li><!-- 推介 --><li>Map.key2:<s:property value="userMap.key2.name"/></li></ul>


6.访问Stack Context  需要使用特殊符号#
<h1>访问Stack Context</h1><ul><li>action.username:<s:property value="#action.username"/></li><li>request.action.username:<s:property value="#request.action.username"/></li></ul>


7.投影 (对于几何元素的过滤 )   ?#满足条件的多个集合,^#满足条件的首个集合,$#满足条件的最后一个集合
<h1>投影(对于几何元素的过滤</h1><ul><li>把userList中年纪等于1的组成一个集合,现实第一个的名字<s:property value="userList.{?#this.age==1}[0].name"/></li><li>显示userList中年纪大于1的第一个集合<s:property value="userList.{^#this.age>1}[0].name"/></li><li>显示userList中年纪大于1的最后一个集合<s:property value="userList.{$#this.age>1}[0].name"/></li><li>把userList中年纪大于等于3的组成一个集合,并显示该集合的所有的姓名<s:property value="userList.{?#this.age>=3}.{name}"/></li></ul>


8.特殊符号说明[]符号

<h1>特殊符号说明[]</h1><ul><li>[0]显示Value Stack Content中的从0到最后所有Action<s:property value="[0]"/></li></ul>


9.特殊符号说明%符号  %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值

<h1>特殊符号说明%符号:构造Map</h1><ul>    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    <li>The value of key "foo1" is <s:property value="#foobar['foo1']" /></li>    <li>不使用%:<s:url value="#foobar['foo1']" /></li>   <li>使用%:<s:url value="%{#foobar['foo1']}" /></li>   </ul>











0 0