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


浙公网安备 33010602011771号