Struts之OGNL

来源:互联网 发布:妇科专家在线网络咨询 编辑:程序博客网 时间:2024/06/10 23:00

这篇文章主要是讲一下OGNL(Object-Graph Navigation Language)一些常用的代码,就贴出主要的示例使用代码,一些其他的配置性代码没有贴出

访问普通属性:

访问值栈action的普通属性:<s:property value="name"></s:property><br>  访问值栈中对象的普通属性(get set):<s:property value="password"></s:property><br>  访问值栈中对象的普通属性(get set):<s:property value="user.age"></s:property><br>  访问值栈中对象的普通属性(get set):<s:property value="cat.friend.name"></s:property>

/代码中user是action对象中一个普通的属性,所以使用user.age直接可以访问其属性,但是要记得生成该属性的get和set方法,否则访问不成功,而且不会报错

访问方法:

<hr>  访问值栈action的普通方法:<s:property value="m()"/><br>//访问Action的普通方法  访问值栈中对象的普通方法:<s:property value="cat.miaomiao()"/><br>//访问Action属性方法(cat是Action的一个属性,也是一个对象)  访问值栈中属性的普通方法:<s:property value="name.length()"/><br><span style="color: rgb(0, 130, 0); font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);">//name是一个String类型,所以可以调用String类型具有的方法</span>  <hr>  访问值栈中对象的静态方法:<s:property value="@com.chen.struts.ognl.S@ss()"/><br>//访问静态方法要麻烦一些,S是这个类,ss是这个对象的静态方法  访问值栈中对象的静态属性:<s:property value="@com.chen.struts.ognl.S@s"/><br>//访问静态的属性  访问Math类静态方法:<s:property value="@@max(2,5)"/><br>//这样的写法就是来访问Math类的方法的  <hr>  访问值栈中对象的构造方法:<s:property value="newUser(8)"/><br><span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">//需要注意的是有安全方面的考虑,struts不再支持调用构造方法来新建一个对象,但是你可以在Action当中写方法来新建一个你需要的对象并且返回这个对象</span>
访问容器:
访问值栈中Action的List所有元素:<s:property value="users"/><br>  访问值栈中Action的List某个元素:<s:property value="users[1]"/><br>  访问值栈中Action的List size:<s:property value="users.size()"/><br>  访问值栈中Action的Set元素:<s:property value="dogs"/><br>  访问值栈中Action的Set元素:<s:property value="dogs.size()"/><br>  访问值栈中Action的Map所有元素:<s:property value="dogMap"/><br>  访问值栈中Action的Map某个元素:<s:property value="dogMap['1']"/><br>  访问值栈中Action的Map keys:<s:property value="dogMap.keys"/><br>  访问值栈中Action的Map values:<s:property value="dogMap.values()"/><br>  访问值栈中Action的Map size:<s:property value="dogMap.size()"/><br>
上面的list set map都是在struts创建Action对象的时候执行execute已经全部初始化完毕,所以在jsp页面中通过值栈可以直接访问,写法也都很直观,你可以直接试一试就知道了 注:users dogs dogMap都是对应的集合


投影:

<span style="white-space:pre"></span>投影:<s:property value="users.{?#this.age==1}.{age}"/><br>//返回符合{^#this.age>1}这个这个表达式的对象集合当中,第一个对象的age值,也就是说符合这个表达式的对象可能不止一个,所以是一个集合,^这个符号代表的就是一个的意思,类似正则表达式
  投影:<s:property value="users.{^#this.age>1}.{age}"/><br><span class="comment" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 130, 0); font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);">//这一个和上面一个类似。但是返回的是最后的一个,因为使用的$符号,这个和正则表达式类似</span><span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);">  </span>  投影:<s:property value="users.{$#this.age>1}.{age}==null"/><br>//<span class="comment" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 130, 0); font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;">//判断符合花括号内部表达式的对象的age值是不是为null 返回的是boolean值</span><span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;">  </span>
下面是Action的代码:
import java.util.*;import com.opensymphony.xwork2.ActionSupport;/** * @BenjaminAdministrator */public class UserAction extends ActionSupport{private String name;private String password;private User user;private Cat cat;private List<User> users = new ArrayList<User>();private Set<Dog> dogs = new HashSet<Dog>();private Map<String,Dog> dogMap = new HashMap<String,Dog>();public String execute(){User user1 = new User(1);User user2 = new User(2);User user3 = new User(3);users.add(user1);users.add(user2);users.add(user3);Dog  dog1 = new Dog("1");Dog dog2 = new Dog("2");Dog  dog3 = new Dog("3");dogs.add(dog1);dogs.add(dog2);dogs.add(dog3);dogMap.put("1", dog1);dogMap.put("2", dog2);dogMap.put("3", dog3);return SUCCESS;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Cat getCat() {return cat;}public void setCat(Cat cat) {this.cat = cat;}public String m(){return "m";}public List<User> getUsers() {return users;}public void setUsers(List<User> users) {this.users = users;}public Set<Dog> getDogs() {return dogs;}public void setDogs(Set<Dog> dogs) {this.dogs = dogs;}public Map<String, Dog> getDogMap() {return dogMap;}public void setDogMap(Map<String, Dog> dogMap) {this.dogMap = dogMap;}public User newUser(int age){User u = new User(age);return u;}}

ps:编排可能有点混乱,请大家谅解!
   可能会有纰漏,请指正!
以上所有代码都是在一个Struts Action 内部完成,用到的对象都是同一个,看的时候可以联系上下文 


0 0
原创粉丝点击