Struts2 尚学堂 3 OGNL

来源:互联网 发布:快速效果图制作软件 编辑:程序博客网 时间:2024/06/10 09:16

什么是OGNL

object graphy navigator language:对象图导航语言  ,是一种EL(expression language),用于数据绑定,把界面元素与对象层某个类的属性绑定在一起,修改显示同步 


使用:

OgnlAction.java:

public class OgnlAction extends ActionSupport{
    private String password;
    private String username;
    private Cat cat;
    private Map<String,Dog> dogMap = new HashMap<String,Dog>();
    private Set<Dog> dogs = new HashSet<Dog>();
    private User user;
    private List<User> users = new ArrayList<User>();
    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("dog100value"));
        dogMap.put("dog101"new Dog("dog101value"));
        dogMap.put("dog102"new Dog("dog102value"));
    }
    public String execute(){
        return "succcess";
    }
    public String m(){
        return "hello";
    }
省略set get 方法


ognl.jsp:

<body>
    <ol>
        <li>访问值栈中的action普通属性:username= <s:property value="username"/></li>
        <li>访问值栈中对象的普通属性(get set方法)<s:property value="user.age"/></li>
        <li>访问值栈中对象的普通属性(get set方法)<s:property value="cat.friend.name"/></li>
        <li>访问值栈中对象的普通方法<s:property value="password.length()"/></li>
        <li>访问值栈中对象的普通方法<s:property value="cat.miaomiao()"/></li>
        <li>访问值栈中action的普通方法<s:property value="m()"/></li>
        <hr/>
        <!-- 前面@+类名+@+方法名/属性 -->
        <li>访问静态方法<s:property value="@com.suning.struts2.ognl.S@s()"/></li>
        <li>访问静态方法<s:property value="@com.suning.struts2.ognl.S@STR"/></li>
        <li>访问Math类的静态方法<s:property value="@@max(2,3)"/></li>
        <hr/>
        <li>访问普通类的构造方法<s:property value="new com.suning.struts2.ognl.User(8)"/></li>
        <hr/>
        <li>访问List<s:property value="users"/></li>
        <li>访问List中的某个元素<s:property value="users[1]"/></li>
        <li>访问List中元素的某个属性的集合<s:property value="users.{age}"/></li><!-- {}代表集合 -->
        <li>访问List中元素某个属性的集合中特定值<s:property value="users.{age}[0]"/><s:property value="users[0].age"/></li>
        <li>访问Set:<s:property value="dogs"/></li>
        <li>访问Set中某个元素<s:property value="dogs[1]"/></li><!-- set中是无序的,所以取不到 -->
        <li>访问Map<s:property value="dogMap"/></li><!-- 访问整个Map,输出所有元素 -->
        <li>访问Map中某个元素<s:property value="dogMap.dog101"/>|<s:property value="dogMap['dog101']"/>|<s:property value="dogMap[\"dog1\"]"/></li><!-- \" 转义字符 -->
        <li>访问Map中所有的key<s:property value="dogMap.keys"/></li>
        <li>访问Map中所有的value<s:property value="dogMap.values"/></li>
        <li>访问容器的大小<s:property value="dogMap.size()"/>|<s:property value="dogMap.size"/></li>
        <hr/>
        <!-- {}中是过滤条件:{?#或^#或$#}只有这三种;this:代表循环到的对象 -->
        <!-- 正则表达式中:^:开头    $:结尾  ?:过滤条件  此处稍微有点区别-->
        <li>投影(过滤)<s:property value="users.{?#this.age==1}.{age}"/></li><!-- 拿到users中age==1的那个user -->
        <li>投影<s:property value="users.{^#this.age>1}.{age}"/></li><!-- 大于1的元素集合中的开头那个users -->
        <li>投影<s:property value="users.{$#this.age>1}.{age}"/></li><!-- 大于1的元素集合中结尾的那个 user-->
        <li>投影<s:property value="users.{$#this.age>1}.{age}==null"/></li><!-- 大于1的元素集合中age为null的那个 user-->
        <hr/>
        <!-- 用[]来访问里面的元素   我们刚刚访问的action永远在栈顶      从上往下数元素--><!-- 在服务器跳转,会把用到的action都压入栈 -->
        <li>[]:<s:property value="[0]"/></li><!--[0]代表从第0个位置一直到栈底  -->
        <li>[]:<s:property value="[0].username"/></li><!-- 当第一个action没有找到username属性时,会自动去找第二个action-->
    </ol>
    <s:debug></s:debug>
  </body>

0 0
原创粉丝点击