第一部分:代码
//前端
访问属性
//web.xml
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false">
<constant name="struts.devMode" value="true">
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<include file="/com/struts2/ognl/ognl.xml/">
</include></constant></constant></struts>
//ognl.xml
<struts>
<package extends="struts-default" name="ognl">
<result>/ognl.jsp</result>
</action>
<result type="chain">ognl</result>
</action>
</package>
</struts>
//类包
//ognl.java
package com.struts2.ognl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;
public class OgnlAction extends ActionSupport {
private String password;
private String username;
private User user;
private Cat cat;
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));
}
public String execute() {
return SUCCESS;
}
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public User getUser() {
return user;
}
public Cat getCat() {
return cat;
}
public List<user> getUsers() {
return users;
}
public Map<string, dog=""> getDogMap() {
return dogMap;
}
public Set<dog> getDogs() {
return dogs;
}
public String m() {
return hello;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public void setDogMap(Map<string, dog=""> dogMap) {
this.dogMap = dogMap;
}
public void setDogs(Set<dog> dogs) {
this.dogs = dogs;
}
public void setPassword(String password) {
this.password = password;
}
public void setUser(User user) {
this.user = user;
}
public void setUsername(String username) {
this.username = username;
}
public void setUsers(List<user> users) {
this.users = users;
}
}
//user.java
package com.struts2.ognl;
public class User {
private int age = 8;
public User() {
}
public User(int age) {
super();
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return user + age;
}
}</user></dog></string,></dog></string,></user></string,></string,></dog></dog></user></user>
//cat.java
package com.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.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;
}
}
?
1
//展示
访问值栈中的action的普通属性: username =
访问值栈中对象的普通属性(get set方法): | | | wrong: <%----%>
访问值栈中对象的普通属性(get set方法):
访问值栈中对象的普通方法:
访问值栈中对象的普通方法:
访问值栈中action的普通方法:
访问静态方法:
访问静态属性:
访问Math类的静态方法:
访问普通类的构造方法:
访问List:
访问List中某个元素:
访问List中元素某个属性的集合:
访问List中元素某个属性的集合中的特定值: |
访问Set:
访问Set中某个元素:
访问Map:
访问Map中某个元素: | |
访问Map中所有的key:
访问Map中所有的value:
访问容器的大小: |
投影(过滤):
投影:1}.{age}/>
投影:1}.{age}/>
投影:1}.{age} == null/>
[]:
第二部分:分析
-> 点击之后,根据配置文件里里面的配置,找到文件包含
-> 查找ognl.xml文件
<struts>
<package extends="struts-default" name="ognl">
<result>/ognl.jsp</result>
</action>
<result type="chain">ognl</result>
</action>
</package>
</struts>
-> 根据xml配置文件里面的action关联的类,构造类对象;
-> 根据ognl.java构造ognl对象;
-> 展示阶段进行取值显示,有几种访问方式需要注意:
-> 访问值栈中属性,值栈中对象的方法,静态方法,静态属性,容器对象;
访问值栈中的action的普通属性
值栈中对象的普通属性
值栈中对象的普通方法
值栈中action的普通方法
静态方法访问方式@类名@方法名
需要在web.xml中设置 value=true>
查看默认设置的方法:/Struts2_1900_OGNL / WebRoot / WEB-INF / lib / struts2-core-2.1.6.jar /default.properties
访问集合
-> 调用方法
?
1
http://localhost:8080/Struts2_1900_OGNL/ognl.action?username=u&password=p&user.age = 19&cat.friend.name =oudy
第三部分;讨论
Object Graph Navigation Language
对象图导航语言
第四部分:有关投影的讨论
投影即过滤功能。
过滤写法:
?
1
投影(过滤):
投影:1}.{age}/>
投影:1}.{age}/>
投影:1}.{age} == null/>
以? ^ $ 开头加上过滤条件,和正则表达式不相同;
this表示循环过程中的对象,帮助你做一些循环;
投影(过滤):
表示从从users中取出age=1的那一个,结果是一个集合;
投影(过滤):
表示从从users中取出age=1的第一个,结果是一个;
投影:1}.{age}/>
表示从从users中取出age>1的集合结尾的那一个;