1,Ognl表达式:
Ognl表达式是Object Graphic navigation Language(对象图导航语言)的缩写,是一个开源项目,Struts2框架使用Ognl作为默认的表达式语言(必须引入ognl.jar)
2,作用:主要用于页面取值
3,主要对象详解:
OgnlContext对象:
是ognl表达式语言的核心,实现了java.utils.Map接口,
使用硬编码熟悉OgnlContext对象如下:
package ognl;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
import org.junit.Test;
//OgnlContext用法
/*
使用ognl表达式语言取值,如果取非根元素的值必须用#
*/
public class OgnlDemo {
@Test
public void testOgnl1() throws Exception{
//创建一个ognl上下文对象
OgnlContext context=new OgnlContext();
//放入数据
User user=new User();
user.setId(100);
user.setName("Jack");
//往非根元素放入数据,取值的时候表达式要用"#"
context.put("user", user);
//获取数据(map)
//先构建一个Ognl表达式,再解析表达式
Object ognl=Ognl.parseExpression("#user.name");
Object value=Ognl.getValue(ognl, context, context.getRoot());
System.out.println(value);
}
//取根元素的值不用带#
@Test
public void testOgnl2() throws Exception{
//创建一个ognl上下文对象
OgnlContext context=new OgnlContext();
//放入数据
User user=new User();
user.setId(100);
user.setName("Jack");
//往根元素放入数据
context.setRoot(user);
//获取数据(map)
//先构建一个Ognl表达式,再解析表达式
Object ognl=Ognl.parseExpression("address.province");
Object value=Ognl.getValue(ognl, context, context.getRoot());
System.out.println(value);
}
//静态方法调用
@Test
public void testOgnl3() throws Exception{
//创建了一个Ognl表达式对象
OgnlContext context=new OgnlContext();
//Ognl表达式语言,调用类的静态方法
// Object ognl=Ognl.parseExpression("@Math@floor(10.9)");
//由于Math类在开发中比较常用,也可以如下书写:
Object ognl=Ognl.parseExpression("@@floor(10.9)");
Object value=Ognl.getValue(ognl, context, context.getRoot());
System.out.println(value);
}
}
ValueStack对象:
值栈对象,是整个Struts数据存储的核心,是数据中转站.
用户每次访问Action,都会创建一个Action实例,ValuesStack实例,ActionContext实例然后把Action对象放入值栈对象中,
把值栈对象放入request中,传入jsp页面(Struts2框架把 ValueStack 对象保存在名为 “struts.valueStack” 的request请求属性中).
开发者只需要通过ActionContext对象就可以访问struts的其他关键对象.(ActionContext是给开发者使用的,便于学习和使用)
4,ValueStack详解:
ValueStack中的数据分为根元素和非根元素,其中根元素取值不需要"#",非根元素取值必须要有"#".
根元素至于CompoundRoot中,存储动作和相关对象,以list的方式存储;非根元素至于OgnlContext中,保存映射关系,以map的方式存储.
struts会把以下元素压入OgnlContext中:
parameters: 该 Map 中包含当前请求的请求参数
request: 该 Map 中包含当前 request 对象中的所有属性
session: 该 Map 中包含当前 session 对象中的所有属性
application:该 Map 中包含当前 application 对象中的所有属性
attr: 该 Map 按如下顺序来检索某个属性: request, session, application
注意:使用Struts标签中的调试标签能查看对象栈(值栈):<s:debug></s:debug>
OgnlContext是Struts2的数据中心(如下图):
注意
Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value="name"/>
4,Struts常用标签
property标签:用于输出指定值:
<s:property value=“#name" default="a default value" />
* default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
* escape:可选属性,指定是否格式化HTML代码。
* value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输
出ValueStack栈顶的值。
<br>1.取根元素的值<br/>
<s:property value="user.id"/>
<s:property value="user.name"/>
<s:property value="user.address.province"/>
<s:property value="user.address.city"/>
<br>2.取非根元素的值<br/>
<s:property value="#request.request_data"/>
<!-- 自动找request/session/application中的数据,找到后立刻返回 -->
<s:property value="#attr.session_data"/>
<!-- 获取请求的参数数据 -->
<s:property value="#parameters.userName"/>
<!-- struts的调试标签:可以观测值栈数据 -->
<s:debug></s:debug>
Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
var: 可选属性,引用变量的名称.
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。
案例:使用迭代标签迭代list集合和map集合:
package ognl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class OgnlDemo03 extends ActionSupport{
@Override
public String execute() throws Exception {
//测试迭代标签
List<User> list=new ArrayList<User>();
Map<Integer,User> map=new HashMap<Integer, User>();
//初始化
for(int i=0;i<11;i++){
User user=new User(i,"Jack"+i);
list.add(user);
map.put(user.getId(), user);
}
//保存
ActionContext.getContext().getContextMap().put("list", list);
ActionContext.getContext().getContextMap().put("map", map);
return SUCCESS;
}
}
<style type="text/css">
.odd{
background-color: red;}
.even{
background-color:blue;}
</style>
</head>
<body>
<br>1.list迭代<br/>
<table border="1" align="left">
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<s:iterator var="user" value="#request.list" status="sta">
<tr class=<s:property value="#sta.even?'even':'odd'"/>>
<td>
<s:property value="#user.id"/>
</td>
<td>
<s:property value="#user.name"/>
</td>
</tr>
</s:iterator>
</table>
<br/>2.map迭代<br/>
<table border="1" align="left">
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<s:iterator var="entry" value="#request.map" status="sta">
<tr class=<s:property value="#sta.even?'even':'odd'"/>>
<td>
<s:property value="#entry.key"/>
</td>
<td>
<s:property value="#entry.value.name"/>
</td>
</tr>
</s:iterator>
</table>
</body>