(6)OGNL--1:访问值栈中的普通属性、对象属性、普通方法、静态方法、自写set、map、list
OgnlAction
//Dog 有属性name
//Cat 有属性ptivate Dog friend
public class OgnlAction extends ActionSupport{
//private User user;
private User user=new User();//手动初始化,User必须含有带空参的构造方法
//user.xxx只有传,才会构造,想要初始化domain model,可以自己new,也可以传参数
private List<User> users=new ArrayList<User>();
private Set<Dog> dogs=new HashSet<Dog>();
private Map<String,Dog> dogMap=new HashMap<String,Dog>();
public OgnlAction(){
//对集合属性,初始化
users.add(new User(1));
users.add(new User(2));
users.add(new User(3));
dogs.add(new Dog("dog1"));
dogs.add(new Dog("dog2"));
dogs.add(new Dog("dog3"));
dogMap.put("dog100", new Dog("dog100"));
dogMap.put("dog101", new Dog("dog101"));
dogMap.put("dog102", new Dog("dog102"));
}
//访问值栈中的action普通属性
private String password;
private String username;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "success";
}
public String m(){
return "hello";
}
}
index.jsp:传数据页面
<body>
访问普通属性:<a href="ognl/ognl?username=u&password=10086">ognl</a><br/>
在OgnlAction中不初始化user 要使得值栈中user有值,应该在前端传值给它:<a href="ognl/ognl?user.age=10">ognl</a><br/>
在OgnlAction中初始化user,访问值栈中对象的普通属性<a href="ognl/ognl?user.age">ognl</a><br/>
在OgnlAction中,访问值栈中cat--dog<a href="ognl/ognl?cat.friend.name=dudu">ognl</a><br/>
</body>
ognl.jsp页面
<ol>
<li>访问值栈中的action普通属性:username=<s:property value="username" /></li>
<li>在OgnlAction中不初始化user,访问值栈中对象的普通属性(get、set方法)<s:property value="user.age"/>|<s:property value="user['age']" /><!-- 在OgnlAction中不初始化user
在显示的debug中user=null,因为前台没有传值 -->
</li>
<li>在OgnlAction中手动初始化user,访问值栈中对象的普通属性(get、set方法)<s:property value="user.age"/>|<s:property value="user['age']" /><!-- 在OgnlAction中初始化user
在显示的debug中user不为空,前台可以得到其值 -->
</li>
<li>访问值栈中对象的普通属性<s:property value="cat.friend.name"/></li>
<!-- <li>访问值栈中的普通方法:<s:property value="password.length()"/></li> -->
<li>访问值栈中的对象的普通方法:<s:property value="cat.miaomiao()"/></li>
<li>访问值栈中的普通方法:<s:property value="m()"/></li><!-- 这是Action中的方法 -->
<s:debug></s:debug>
<!-- -------------------------------------------------------------------- -->
<li>访问静态方法:<s:property value="@com.ognl.S@s()"/></li>
<li>访问静态方法:<s:property value="@com.ognl.S@STR"/></li>
<li>访问Math类中的静态方法:<s:property value="@@max(2,3)"/></li><!-- 只有这一个类这样用 -->
<!-- ------------------------------------------------------------------------- -->
<li>访问普通类的构造方法:<s:property value="new com.ognl.User(8)"/></li><!-- 在页面显示是user8,这是因为重新了 toString方法 -->
<li>访问list:<s:property value="users" /></li><!-- [user1, user2, user3] -->
<li>访问list中元素某个属性的集合<s:property value="users.{age}" /></li><!-- [1, 2, 3] -->
<li>访问list中元素某个属性的集合中的特定值<s:property value="users.{age}[0]" /></li>
<!-- ------------------------------------------------------------------------- -->
<li>访问set:<s:property value="dogs" /></li>
<li>访问set中的某个元素:<s:property value="dogs[1]"/></li><!-- 在ognl中,若不符合语法,不报错,但是不显示。set元素无序,不应该用下标取 -->
<!-- ------------------------------------------------------------------------- -->
<li>访问map:<s:property value="dogMap" /></li>
<li>访问map中的某个元素<s:property value="dogMap.dog101" /></li>
<li>访问map中的所有key<s:property value="dogMap.keys"/>
<li>访问map中所有的value<s:property value="dogMap.values"/>
<li>访问容器的大小<s:property value="dogMap.size()" /></li>
<!-- ------------------------------------------------------------------------- -->
<li>投影(过滤):<s:property value="users.{?#this.age==1}" /></li><!-- 是个集合,因为user.age=1的对象可以有多个 -->
<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><!-- 判断是否有user属性age>1的-->
<!-- ------------------------------------------------------------------------- -->
<li>[]:<s:property value="[0]"/><li><!-- 要用http://localhost:8080/struct_OGNL/ognl/test -->
</ol>
<s:debug></s:debug>