Struts2 值栈和ognl

来源:互联网 发布:网络综艺节目受众人群 编辑:程序博客网 时间:2024/05/02 04:58

值栈(ValueStack)是ActionContext中的一个对象。存放的数据是Action对象。我们可以使用<s:debug/>查看context对象中的值
OGNL表达式

  1. OGNL查询是在根对象(Struts2的跟对象是ValueStack)查询
  2. 由于Action对象存在ValueStack中,因此Action中的所有属性可以通过OGNL直接读取到
  3. 除了ValueStack中的值,其他ActionContext的内容需要增加#来标识,告诉OGNL不要在根对象中查找,而在其他上下文中寻找相关值
  4. attr对象,依次从pageContext,request,session,application中寻找属性

使用OGNL

public class Test {    public static void main(String[] args) throws OgnlException {        Map<String,Object>  map=new HashMap<String,Object>();        map.put("name", "张三");        map.put("age", 125);        User user=new User();        user.setName("李四");        Object  obj=Ognl.getValue("#name",map,user);        System.out.println(obj);//输出张三        Object  obj1=Ognl.getValue("name",map,user);        System.out.println(obj1);//输出李四    }}

看上述案例,跟博主讲的OGNL查询一样。首先,ognl方法是
这也是最常用的

Ognl.getValue(expression, context, root)

上述根对象我们取为user,所以当expression有#号取的是map里面的,即张三,没有说明取根对象里面,即李四
(一般把小数据作为常用的直接取,大数据作为不常用的用#取)


struts2使用ognl表达式是通过struts2的标签来取的
struts2把值栈作为根对象
在jsp中先导入struts2的标签库

<%@taglib prefix="s"  uri="/struts-tags" %>

注意:使用标签是需要通过struts2的过滤器来启动的,如果过滤器配置为*.action,不能直接访问.jsp页面。需要.action跳转标签才能使用。(也就是说,jsp用到了标签取数据,按道理说取不到应该输出null,但是.过滤器这样配置直接访问.jsp没有通过过滤器会报错)

<%--不用表达式 <body>    用户名:${sessionScope.user }-----------------<a href="logout.action">退出</a>  </body> --%>  <!-- 用OGNL表达式 -->   <body>    用户名:<s:property   value="name"/>action值栈的属性    用户名:<s:property   value="#session.user"/>-----------------<a href="logout.action">退出</a>  </body> 

结论:使用OGNL访问action中的属性时,可以直接访问,访问actionContext中的数据时,需要加#


其实我们也可以得到值栈,但是强烈不建议去动值栈

ValueStack vs=ActionContext.getContext().getValueStack();           System.out.println("name="+vs.findString("name"));

查找还好说,但是如果push进一个已经存在的键,那么后面键对应的值就会覆盖前面的,如果要取到前面的,那么就要在value里指定第几个(最上面也就是最后面的是0,就是栈的特性)
如:

ValueStack vs=ActionContext.getContext().getValueStack();            System.out.println("name="+vs.findString("name"));            User user=new User();            user.setName("s");            vs.push(user);
//第二个用户名:<s:property   value="[1].name"/>

标签
除了上述的,常用的还有两个
(1)Iterator
jstl的foreach

<c:foreach  item=${list}  var="bean">    <tr>        <td>${bean.id}</td>

利用Struts2的标签Iterator代替foreach

<s:iterator  value="list">    <tr>        <td><s:property value="id"/></td>

或者

<s:iterator  value="list" var="bean">    <tr>        <td><s:property value="#bean.id"/></td>

(2)if标签

<s:if test=""></s:if>

还有else和elseif标签,这是原来jstl没有的,jstl只有if

当然还有<s:debug/>查看ActionContext的值