例子:
21
实验六:OGNL
OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。 第一个例子 Index.jsp
访问属性 /ognl.action?username=u&password=p\>ognl
Ognl.xml
public class OgnlAction extends ActionSupport {
private String password; private String username; private User user; public User getUser() { }
public void setUser(User user) { }
public String getPassword() { }
public String getUsername() { }
public void setPassword(String password) { }
public void setUsername(String username) {
this.username = username; this.password = password; return username; return password; this.user = user; return user;
22
}
}
User.java
public class User { }
此时的url:
http://localhost:8080/ognl_0100/ognl.action?username=u&password=p 值栈中的内容
访问值栈中的:username =
public User(int age) { }
public int getAge() { }
public void setAge(int age) { }
@Override//重写toString
public String toString() { }
return \ + age; this.age = age; return age; super();
this.age = age;
[Debug]
Struts ValueStack Debug Value Stack Contents
Object com.bjsxt.struts2.ognl.OgnlAction Property Name password locale Property Value p zh_CN 23
user errors actionErrors username texts fieldErrors com.opensymphony.xwork2.DefaultTextProvider texts null {} [] u null {} null errorMessages [] actionMessages [] http://localhost:8080/ognl_0100/ognl.action?username=u&password=p&user.age=9就出来了。
在OGNL表达式的里面传参的时候必须把user.xxx 传进去,Struts才能帮我们构造user方法 只有user.xxx 传,才会构造
1).能不能不在url中传user.xxx直接在Action中直接new 出来,能不能取到user的值呢? Private User user=new User(10);
//原来初始值等于8
结论:也是可以的,因为我们new出Action,Action又new出User,当然就不为null了 2).把User()空的构造方法去掉,能不能取到user的值呢?
http://localhost:8080/ognl_0100/ognl.action?username=u&password=p&user.age=9
把User为空的构造方法去掉之后,它就没有默认为空的构造方法,别人要帮你初始化这个User的时候它确定不了应该调用哪个构造方法,所以取不到值。
java.lang.InstantiationException: com.bjsxt.struts2.ognl.User
实例化User出错,所以一般我们的Domain Model(领域模型)永远都要提供一个默认参数为空的方法;
结论:如果我的Domain Model,也就是User对象我自己没有new,也就是Action里面自己没有new,想让Struts2帮你new的时候必须要给domainModel传值,在它帮你new的过程中你的damainModel必须有一个默认为空的构造方法,否则它不知道new出哪一个。
24
OGNL_2
在原来的OgnlAction.java中增加Cat属性和get set 方法
Cat.java
public class Cat { }
Dog.java
public class Dog { }
public Dog() { }
public Dog(String name) { }
Get,set方法……..
public String toString() { }
return \ + name; super();
this.name = name;
private String name; private Dog friend; public Dog getFriend() { }
public void setFriend(Dog friend) { }
public String miaomiao() { }
return \; this.friend = friend; return friend;
为什么叫做OGNL对象图导航语言?比如说我们访问OgnlAction.java里面通过“user.age”
那么这时候如果我们想访问ognlAction里面的cat的dog该怎么写? Cat.friend.name OGNL
1. user.xxx只有传,才会构造,想初始化domain Model,可以自己new也可以传值,但这时
候必须有默认为空的构造方法。
25