struts2学习笔记-------OGNL

OGNL  对象图导航语言

Object Graphe Navigation Language

 

示例如下:

u  若要访问URL中的参数,即访问值栈中的普通属性,则直接用

 

 

 

 

 

u   

l  1:若要访问值栈中对象的普通属性,则应用如下的方法:但是需要注意的是此时的User对象必须要有自己默认的不带参数的构造方法:如下:

此时访问的URL如下;

 

 

 

 

l  2:或者是在Action中new 一个User对象出来, 此时不用在URL中写出具体的User.name和User.age来设置参数:如下

 

 

具体的action中的配置如下:

 

 

 

 

 

User对象中的默认的不带参数的构造方法必须要有,不然会报错:

 

 

 

u

l  1:当类的关系如下,即包含了很多类的时候,

 

 

l  2:想要访问Dog中的URL属性,,应该如下访问:

 

 

 

l  3在Cat类中声明了一个Dog类型的成员变量friend,在Dog类中声明了自己的属性name。

若在URL中访问的时候,用OGNL取出valuestack中的参数值的时候,应该如下:

 

 

l  4:其中辅助代码如下:

 

 

 

 

 

 

 

 

 

 

 

l  5:

 

<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>

结果如下:

 

 

l  6:访问值栈中action的普通方法

<li>访问值栈中action的普通方法:<s:property value="m()"/></li>

结果如下:

 

 

 

l  7访问静态方法名:前面的第一个@后跟类名,后面的@后跟方法名或者属性名,但是访问Math类的方法的时候,须要用两个@@,如下:

<li>访问静态方法:<s:property value="@com.wbs.action.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.wbs.action.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>

主要的代码如下:

public class S {
    public  static String STR="static string";//定义了一个静态属性
    public static String s(){//定义了一个方法s
        return "static method";
    }
}

在浏览器里面查看到的结果如下:

 

 

 

u  访问普通类构造方法

<li>访问普通类的构造方法:<s:property value="new com.wbs.action.User(8)"/></li>

浏览器显示如下

 

 

辅助类为USer:

public class User {
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private int age=8;

    public User(){
        System.out.println("this is constructor");
    }
    public User(int age){
        super();
        this.age=age;
    }
    public String toString(){
        return "user"+age;//这个是访问了构造方法之后返回的字串
    }
}

l  访问List Set Map中的元素的方法:注意此时的相应的类中应该重写toString()方法

<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>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> |
          <s:property value="dogMap[\"dog101\"]"/>
      </li>
      //访问MAP中的某个元素,需要:Map名.Map key就可以了,还有后边两种写法,注意最后一种写法若是双引号需要\转意
<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="users.size"/> </li>

l  浏览器的结果如下:

 

 

 

l  辅助的类如下:

public class Dog {
    private String name;
    public String getName() {return name; }
    public void setName(String name) {this.name = name; }
    public Dog(){

//默认的构造方法
    }
    public Dog(String name){
        super();
        this.name=name;
    }
    public String toString(){//注意这里,一定要写出toString()方法,
        return "dog:"+name;
    }
}

对应的Action中的方法如下:

public class OGNLaction extends ActionSupport {
    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"));

    }
//注意:此时一定要写出相对应的get set方法
    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; }

以上需要注意的地方:

<s:property value="dogMap.size()"/>这个里面的seze()后边的括号可以省略,这是OGNL的特色;

<s:property value="dogMap[\"dog101\"]"/>这种方法取值的时候需要转义一下才行

Set中根本没有顺序的,所以不能获取Set中某个固定的元素

u   

l  投影(过滤)

<li>投影(过滤):<s:property value="users.{?#this.age==1}"/></li>//获得age=1的整个集合
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>//获得age=1的集合中的第一个
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>//获得age>1的开头的那个age值的集合
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>//获得age>1的结尾的那个age值的集合
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>//判断一个集合里面是不是空的

l  结果如下:

 

 

辅助类和上边的那个一样,对应的Action中的方法如下:

public class OGNLaction extends ActionSupport {
    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"));

    }
//注意:此时一定要写出相对应的get set方法
    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; }

注意:^是开头的意思,$是结尾的意思

u   

l  访问中括号[]

<li>[]:<s:property value="[0].username"/></li>//[0].username会访问action,如果第一个action没有username属性,则会找第二个
<li>[]:<s:property value="[0]"/></li>//[0]代表OGNL那个Action的位置,

l  浏览器显示如下:

 

 

u   

l  什么时候有多个Action被放入值栈

当访问一个action时候,被chain到另外的一个action的时候,会依此按照顺序,将先 访问的actin 压到栈底,后边用到的action依次放到栈顶,其中配置如下:

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
    <package name="struts" namespace="/ognl" extends="struts-default">
        <action name="ognl" class="com.wbs.action.OGNLaction">
            <result>
                /ognl.jsp
            </result>
        </action>
        <action name="test" class="com.wbs.action.TestAction" >
            <result type="chain">
                ognl
            </result>
        </action>

    </package>
</struts>

l  TestAction如下:

public class TestAction extends ActionSupport {
    public String execute() throws Exception{
        return super.execute();//这个和直接返回一个Success是一样的,因为父类也是返回的SUCCESS
    }
}

但是在此时,因为没有在URL中传入username的值,所以在访问的时候,值栈中的UserName是空的,所以在最后取值的时候取不到Username的值,访问的JSP页面如下:

<li>[]:<s:property value="[0].username"/></li>//[0].username会访问action,如果第一个action没有username属性,则会找第二个
<li>[]:<s:property value="[0]"/></li>//[0]代表OGNL那个Action的位置,

浏览器结果如下:

 

 

注意:先访问的Action先进栈

l  <s:property value="[1]"/>

这个中value=”[n]”中数字的讲解:

 n是从值栈顶部往下数,第n+1个action开始,直到所有的action结束的所有action

如下所示,将其改为1的时候,则从第二个开始,知道所有的aciton 结束的所有action

此时的JSP页面如下:

<li>[]:<s:property value="[0].username"/></li>//[0].username会访问action,如果第一个action没有username属性,则会找第二个
<li>[]:<s:property value="[1]"/></li>//[0]代表OGNL那个Action的位置,

 

 

注意:上边的value中的值变为了1

 

 

posted @ 2018-04-06 22:51  XiaoPOooo  阅读(120)  评论(0)    收藏  举报