Struts_OGNL(Object Graph Navigation Language) 对象图导航语言
1、访问值栈中的action的普通属性:
请求:
1 <a href="ognl.action?username=u&password=p">访问属性</a>
对应的action代码,getter和setter方法一定要加上:
1 private String username; 2 3 private String password; 4 5 public String getUsername() { 6 return username; 7 } 8 9 public void setUsername(String username) { 10 this.username = username; 11 } 12 13 public String getPassword() { 14 return password; 15 } 16 17 public void setPassword(String password) { 18 this.password = password; 19 }
页面进行访问:
1 username = <s:property value="username" /> | password = <s:property value="password" />
2、访问值栈中对象的普通属性(get set方法)
如果请求没有将 user的值传过去,那么在值栈就会看到 user=null,只有为user赋值了,struts2才会构造一个User对象然后赋给user。
只有传才会构造。
想初始化 domain model,可以 new,也可以传参数值,但这时候需要提供参数为空的构造方法。
请求:
action 中的代码:
1 private User user; 2 3 public User getUser() { 4 return user; 5 } 6 7 public void setUser(User user) { 8 this.user = user; 9 }
属性访问:
1 <s:property value="user.age" />
3、案例三
现在定义了 Dog 类:
1 package com.bjsxt.struts2.ognl; 2 3 public class Dog { 4 5 private String name; 6 7 public Dog(){} 8 9 public Dog(String name){ 10 this.name = name; 11 } 12 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 20 public String toString(){ 21 return "dog:" + this.name; 22 } 23 24 }
Cat 类,类中有个friend 是 Dog 类
1 package com.bjsxt.struts2.ognl; 2 3 public class Cat { 4 5 private Dog friend; 6 7 public Dog getFriend() { 8 return friend; 9 } 10 11 public void setFriend(Dog friend) { 12 this.friend = friend; 13 } 14 15 public String miaomiao(){ 16 return "miaomiao"; 17 } 18 }
在 Action 中定义了 Cat 对象
1 private Cat cat; 2 3 public Cat getCat() { 4 return cat; 5 } 6 7 public void setCat(Cat cat) { 8 this.cat = cat; 9 }
请求:
显示:
4、案例四:OGNL表达式调用值栈中对象的方法
action中是有定义password属性的。
类似案例:
Cat类中是由miaomiao()方法的。
5、调用action的普通方法
action 先定义一个普通方法:
public String m(){ return "hello"; }
页面调用:
1 <s:property value="m()"/>
========================================================================
访问静态方法:
先在struts.xml设置允许访问静态方法
1 <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
定义的示例类:
1 package com.bjsxt.struts2.ognl; 2 3 public class S { 4 5 public static String STR = "STATIC STRING"; 6 7 public static String s(){ 8 return "this is a static method()."; 9 } 10 11 }
访问代码:
1 访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/> 2 访问静态变量:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/> 3 访问Math类的静态方法:<s:property value="@@max(2,3)"/>
6、访问普通类的构造方法
1 访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)" />
结果:
7、访问集合元素
数组访问方式跟访问List一样
8、投影
User 代码:
1 package com.bjsxt.struts2.ognl; 2 3 public class User { 4 5 private Integer age = 10; 6 7 public User(){} 8 9 public User(int age){ 10 this.age = age; 11 } 12 13 public Integer getAge() { 14 return age; 15 } 16 17 public void setAge(Integer age) { 18 this.age = age; 19 } 20 21 public String toString(){ 22 return "user" + age; 23 } 24 25 }
名称为 users 的List
1 private List<User> users = new ArrayList<User>(); 2 users.add(new User(1)); 3 users.add(new User(2)); 4 users.add(new User(3)); 5 users.add(new User(4));
页面代码:
1 <li>投影(过滤):<s:property value="users.{?#this.age==1}.{age}"/></li><!-- ?#后面接过滤条件 这句话是取所有age大于1的所有值 --> 2 <li>投影:<s:property value="users.{^#this.age>1}.{age}" /></li><!-- ^#开头 这句话是取age大于1的第一个值 --> 3 <li>投影:<s:property value="users.{$#this.age>1}.{age}" /></li><!-- $#结尾 这句话是取age大于1的最后那个值--> 4 <li>投影:<s:property value="users.{^#this.age>1}.{age} == null" /></li>
结果:
9、[]
[] 访问的是值栈
[索引] 访问对应位置的对象
[索引].对象名 访问索引对象包含的Property
1 <s:property value="[0].locale"/>
小问题:一个请求从一个Action容器内跳转到另一个Action,那么在值栈中就会有两个Action。例子如下:
struts.xml
TestAction
1 package com.bjsxt.struts2.ognl; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class TestAction extends ActionSupport { 6 7 private static final long serialVersionUID = 7420682335394931465L; 8 9 public String execute(){ 10 return SUCCESS; 11 } 12 }
OgnlAction
1 public OgnlAction(){ 2 users.add(new User(1)); 3 users.add(new User(2)); 4 users.add(new User(3)); 5 users.add(new User(4)); 6 7 dogs.add(new Dog("dog1")); 8 dogs.add(new Dog("dog2")); 9 dogs.add(new Dog("dog3")); 10 11 dogMap.put("dog100", new Dog("100")); 12 dogMap.put("dog101", new Dog("101")); 13 dogMap.put("dog102", new Dog("102")); 14 } 15 16 public String execute() throws Exception { 17 return super.execute(); 18 }
调用了两个Action后,ValueStack中的内容 TestAction 先进栈,OgnlAction 后进栈:
OGNL 常用的就上面这些。
链接: http://pan.baidu.com/s/1c8Hima 密码: gkch