6.OGNL表达式(struts2笔记)

OGNL是一种表达式语言,可以存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。(工程Struts2_1900_OGNL)。
这里需要做的试验较多,我们一个一个讲解。

1.访问值栈中的action的普通属性

ognl.jsp

  • 1.访问值栈中的action的普通属性: username =
  • OgnlAction.java

        //试验1-------
        private String username;
        private String password;
        //试验1-------
        
        public String execute(){
            return SUCCESS;
        }
    

    说明:这里的action中我们只有两个属性,我们通过OGNL表达式value="username"可以直接从值栈中取得属性的值。我们可以在值栈中找到对应属性的值。

    2.访问值栈中对象的普通属性

    ognl.jsp

  • 2.访问值栈中对象的普通属性(get set方法): | | | wrong: <%----%>
  • OgnlAction.java

        //试验2-------
        private User user ;
        //试验2-------
    

    User.java

    package com.bjsxt.struts2.ognl;
    public class User {
        private int age = 8;
    
        public User(){}
        
        public User(int age) {
            super();
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "user" + age;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    说明:

    • 当我们使用地址http://localhost:8080/Struts2_1900_OGNL/ognl.action?username=u&password=p访问时我们在值栈中发现user对象是null,之前我们知道struts2会帮我们实例化对象,但是这必须有个条件,就是地址后面必须跟上相应的值,如:
      http://localhost:8080/Struts2_1900_OGNL/ognl.action?username=u&password=p&user.age=10这时struts2才会帮我们实例化对象,同时我们的对象中必须有无参构造函数,因为struts2在实例化时需要用到。当然我们也可以自己在action方法中直接将user对象new出来,这相当于自己实例化对象了。
    • 这里我们给出了几种取得普通属性的OGNL表达式,注意其区别。

    ognl.jsp

  • 3.访问值栈中对象的普通属性(get set方法):
  • OgnlAction.java

        //试验3-------
        private Cat cat ;
        //试验3-------
    

    Cat.java

    package com.bjsxt.struts2.ognl;
    public class Cat {
        private Dog friend;
    
        public Dog getFriend() {
            return friend;
        }
    
        public void setFriend(Dog friend) {
            this.friend = friend;
        }
        
        public String miaomiao(){
            return "miaomiao";
        }
    }
    

    Dog.java

    package com.bjsxt.struts2.ognl;
    public class Dog {
        private String name ;
    
        public Dog(){
            
        }
        
        public Dog(String name) {
            super();
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        public String toString(){
            return "dog:" + name;
        }   
    }
    

    说明:此时这里就构成了一个对象图,我们可以使用地址http://localhost:8080/Struts2_1900_OGNL/ognl.action?cat.friend.name=oudy进行访问,我们通过就可以取得相应的值。

    3.访问值栈中对象的普通方法

    ognl.jsp

  • 4.访问值栈中对象的普通方法:
  • 5.访问值栈中对象的普通方法:
  • 说明:访问普通属性中的方法我们可以直接调用,而访问对象中的方法也类似,这个比较简单。

    4.方法值栈中action的普通方法

    OgnlAction.javaa中有个名为m的方法,我们调用可以这样:
    ognl.jsp

  • 6.访问值栈中action的普通方法:
  • 5.访问静态属性和方法

    ognl.jsp

  • 7.访问静态方法:
  • 8.访问静态属性:
  • 9.访问Math类的静态方法:
  • S.java

    package com.bjsxt.struts2.ognl;
    public class S {
        public static String STR = "STATIC STRING";
        
        public static String s(){
            return "static method";
        }
    }
    

    说明:我们在访问静态方法时一定要在struts.xml中设置。访问格式是:@完整类名@静态方法/属性
    而只有在访问Math类的时候使用两个@。

    6.访问普通类的构造方法

    ognl.jsp

  • 10.访问普通类的构造方法:
  • 说明:类中我们覆写了toString方法,但是我在做试验的时候却失败,不知道为什么,语法应该没有错误,如果有谁看到,希望能帮我解决一下,不知道是不是struts2的设置变了。

    7.访问集合(或数组)

    ognl.jsp

  • 11.访问List:
  • 12.访问List中某个元素:
  • 13.访问List中元素某个属性的集合:
  • 14.访问List中元素某个属性的集合中的特定值: |
  • 15.访问Set:
  • 16.访问Set中某个元素:
  • 17.访问Map:
  • 18.访问Map中某个元素: | |
  • 19.访问Map中所有的key:
  • 20.访问Map中所有的value:
  • 21.访问容器的大小: |
  • OgnlAction.java

        //试验4-------
        private List users = new ArrayList();
        //试验4-------
        
        //试验5-------
        private Set dogs = new HashSet();
        //试验5-------
        
        //试验6-------
        private Map dogMap = new HashMap();
        //试验6-------
        
        
        public OgnlAction(){
            //试验4-------
            users.add(new User(1));
            users.add(new User(2));
            users.add(new User(3));
            
            //试验5-------
            dogs.add(new Dog("dog1"));
            dogs.add(new Dog("dog2"));
            dogs.add(new Dog("dog3"));
            
            //试验6-------
            dogMap.put("dog100", new Dog("dog100"));
            dogMap.put("dog101", new Dog("dog101"));
            dogMap.put("dog102", new Dog("dog102"));
        }
    

    最后我们给出试验结果:

    11.访问List:[user :1, user :2, user :3]
    12.访问List中某个元素:user :2
    13.访问List中元素某个属性的集合:[1, 2, 3]
    14.访问List中元素某个属性的集合中的特定值:1 | 1
    15.访问Set:[dog:dog3, dog:dog1, dog:dog2]
    16.访问Set中某个元素:
    17.访问Map:{dog100=dog:dog100, dog101=dog:dog101, dog102=dog:dog102}
    18.访问Map中某个元素:dog:dog101 | dog:dog101 | dog:dog101
    19.访问Map中所有的key:[dog100, dog101, dog102]
    20.访问Map中所有的value:[dog:dog100, dog:dog101, dog:dog102]
    21.访问容器的大小:3 | 3
    

    说明:

    • 1.注意在ongl中花括号可以代表一个集合,于是users.{age}表示的是age的一个集合。
    • 2.访问集合和访问数组的方式类似,这里不做试验。
    • 3.Set集合中是没有顺序的,所以第16个中取不到值。
    • 4.在ognl中单引号可以表示一个字符串。

    8.投影(过滤)

    ognl.jsp

  • 22.投影(过滤):
  • 23.投影:
  • 24.投影:
  • 25.投影:
  • 说明:

    • 1.这里this表示当前对象,因为users是一个集合,于是会进行一个循环,循环到哪个对象,this就表示哪个对象。
    • 2.投影中只有上面三种方式:?#、^#、$#。第22表示判断哪个user对象的age为1,如果不加后面的[0],则打印出对象,同时对象加了中括号,如[user1],这就表示是一个集合,因为可能有多个对象的age复合条件。
    • 3.^#表示第一个age符合条件的对象。$#表示最后一个age符合条件的对象。

    9.用 [] 访问元素

    ognl.jsp

  • 26.[]:
  • 说明:

    • 1.当我们使用value="[0]"访问时会打印出值栈中从上到下的所有对象。如
      26.[]:[com.bjsxt.struts2.ognl.OgnlAction@1360826f, com.opensymphony.xwork2.DefaultTextProvider@5c053d81]
    • 2.当我们使用value="[0].username"访问时则会在action中找username这个属性,当在第一个action中找不到我们想要的属性时会到第二个action中去找,而一般我们什么时候值栈中才会有多个action呢?

    ognl.xml

    
    
    
        
            
                /ognl.jsp
            
            
                ognl
            
        
        
    
    

    可以看到当result的类型type="chain"时会出现多个action。此时我们使用地址:http://localhost:8080/Struts2_1900_OGNL/tesst.action进行访问,这时我们就可以在值栈中看到两个action。

    最后我们给出struts.xml

    
    
    
        
        
        
        
    
    

    你可能感兴趣的:(6.OGNL表达式(struts2笔记))