在JSP页面获取数据除了使用EL表达式之外,Struts2还提供了另外一种访问并显示数据的表达式,那就是OGNL(Object-Graph Navigation Language 对象图导航语言)。
- OGNL表达式功能及特点
1、能存取对象属性、调用对象方法
2、能访问静态方法、静态属性
3、能访问值栈及Stack Context
4、能操作集合对象
5、支付赋值、运算操作、字段类型转化
一、访问值栈
值栈(Value Stack)可以理解为一个用于存储数据的Map,主要用于存放当前Action实例。
- action配置
<action name="gotoHousePage" class="com.pb05.demo01.StudentsAction" method="gotoHousePage">
<result>/jsp/05_OGNL访问值栈和StackContext/01_访问值栈.jsp</result>
</action>
- action类代码(JavaBean方式为例)
public class StudentsAction extends ActionSupport {
private Students students;
private String name;
private int age = 18;
public String gotoHousePage() {
Students students = new Students("张三", "123");
this.setStudents(students);
this.name = "你好!";
return SUCCESS;
}
public Students getStudents() {
return students;
}
public void setStudents(Students students) {
this.students = students;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 输出页面
- 通过action访问的结果
二、访问Stack Context
上面的示例是访问Action中的数据、OGNL同样可以访问Action以外的数据,如request、session、application等,这些数据都存储在Stack Context中,注意,访问Stack Context需要加上”#”
- action配置
<action name="gotoHousePage2" class="com.pb05.demo02.StudentsAction" method="gotoHousePage">
<result>/jsp/05_OGNL访问值栈和StackContext/02_访问StackContext.jsp</result>
</action>
- action类代码
public class StudentsAction extends ActionSupport {
public String gotoHousePage() {
ActionContext.getContext().getSession().put("uname", "张三");
return SUCCESS;
}
}
- 输出页面
<body>
<s:property value="#session.uname"/>
</body>
- 输出结果
三、访问集合
演示使用OGNL访问集合属性
- action配置
<action name="list_*" class="com.pb05.demo03.OgnlAction" method="{1}">
<result>/jsp/05_OGNL访问值栈和StackContext/03_访问集合.jsp</result>
</action>
- action类代码
public class OgnlAction extends BaseAction {
public String list() throws Exception {
ArrayList<User> list = new ArrayList<User>();
User u1 = new User("accp", "accp", "123");
User u2 = new User("pb", "pb", "123");
list.add(u1);
list.add(u2);
request.put("list", list);
return SUCCESS;
}
public String map() throws Exception {
User u1 = new User("accp", "accp", "123");
User u2 = new User("pb", "pb", "123");
HashMap<String, User> map = new HashMap<String, User>();
map.put("m1", u1);
map.put("m2", u2);
request.put("map", map);
return SUCCESS;
}
}
- 输出页面关键代码
<body>
list集合中大小:
<s:property value="#request.list.size()"/>
<hr/>
判断集合是否为空:
<s:property value="#request.list.isEmpty()"/>
<hr/>
集合中的第一个元素:
<s:property value="#request.list[0]"/>
<hr/>
遍历集合中的元素:<br/>
<s:iterator value="#request.list" var="user">
用户名:<s:property value="#user.username"/><br/>
</s:iterator>
<hr/>
map集合大小:
<s:property value="#request.map.size()"/>
<hr/>
map集合keys:
<s:property value="#request.map.keys"/>
<hr/>
map集合values:
<s:property value="#request.map.values"/>
<hr/>
遍历map集合元素:
<br/>
<s:iterator value="#request.map.values" var="keys">
<s:property value="#keys.username"/>
<br/>
</s:iterator>
</body>
- 输出结果