Struts2 值栈和ognl

本文详细介绍了Struts2框架中OGNL表达式的使用方法,包括如何在Action对象和ActionContext中访问属性,以及如何使用Struts2标签进行OGNL查询。此外还对比了Struts2标签与JSTL标签的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

值栈(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的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值