Struts2 值栈和ognl
来源:互联网 发布:网络综艺节目受众人群 编辑:程序博客网 时间:2024/05/02 04:58
值栈(ValueStack)是ActionContext中的一个对象。存放的数据是Action对象。我们可以使用<s:debug/>
查看context对象中的值
OGNL表达式
- OGNL查询是在根对象(Struts2的跟对象是ValueStack)查询
- 由于Action对象存在ValueStack中,因此Action中的所有属性可以通过OGNL直接读取到
- 除了ValueStack中的值,其他ActionContext的内容需要增加#来标识,告诉OGNL不要在根对象中查找,而在其他上下文中寻找相关值
- 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的值
- Struts2-值栈和OGNL
- Struts2 值栈和ognl
- Struts2 值栈和OGNL
- Struts2中的值栈和OGNL
- Struts2值栈和ognl表达式
- Struts2值栈和ognl表达式
- OGNL和Struts2中的值栈
- Struts2之 OGNL表达式和值栈
- Struts2值栈和OGNL表达式
- struts2--值栈以及OGNL
- Struts2的值栈-OGNL
- Struts2-OGNL与值栈
- 《研磨struts2》第七章 值栈和OGNL 之 7.2 OGNL
- 《研磨struts2》第七章 值栈和OGNL 之 7.3 使用OGNL访问复杂对象
- Struts2.x教程(二) OGNL和值栈
- 走进Struts2(五)— 值栈和OGNL
- Struts2基础学习(七)—值栈和OGNL
- Struts2中关于值栈和OGNL表达式的理解
- Sticks POJ
- javaee学习日记之java基础之类和对象
- (三)libevent源文件结构
- JAVA中的反射机制
- memcached会话共享+分布式+Thinkphp5
- Struts2 值栈和ognl
- zookeeper安装(单节点)及基本操作
- “并查集”问题:抢银行问题
- Android组件化之不同模块间 交互(activity互相跳转,数据互相传递,互相调用函数)
- MySql 数据库常用查询
- 互联网级监控平台之内存存储的设计和优化
- nginx 中location和root,你确定真的明白他们关系?
- VS Code python配置问题
- uboot中$(origin variable)详解