之前在web阶段学习过EL表达式,应用在JSP页面中获取域对象内容
用于struts2里面操作值栈数据,可以结合struts2里面的标签一起使用值栈
注意:ognl不属于struts2的一部分,他是单独存在的。struts2提供了ognl的jar包
第一步:导入jar包,然后引入标签库
之前在使用jstl的时候需要引入标签库,现在也一样,第一步是引入标签库
第二步:结合struts的标签
我们之前把东西放到作用域中,现在可以用struts2提供值栈来存取数据。
每次访问都会创建action,每个action对象拥有独立的一个值栈
第一部分:root,结构是list集合
一般操作都是root里面数据
第二部分: context,结构是map,存放一些固定的键值对
访问action,执行action的方法,把方法的返回值配置到jsp页面中,在jsp里使用这个标签。
先有acton、再有值栈
通过debug,可以看到值栈的结构
方法1: 使用值栈对象里面的set方法
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.set("username","laowang");
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.push("abcd");
效果:栈顶多了String
方法3:在action定义变量,生成变量的get方法。(不需要创建值栈对象)
效果:在action中添加了name ,数据分配在action中,不需要map等开销
步骤: 使用struts2的标签+ognl表达式获取值栈数据
(1)String username;
(2) User user;
(3) List<> list;
(1)
(2)
(3) 对于list,由三种方式可以取数据
第一种方式
第二种方式:迭代器迭代
第三种方式:
类似foreach,遍历list集合,item:user
解释#号:在这种机制下,帮我们从root中得到的值var存入context中
因此我们取值就要到context中取, 因此加上#表示context
1、 set
前戏(action中):用set放数据
stack.set(“username”,“laowang”);
核心(jsp中):
2、push(会把数据放到名称为top的数组,我们根据数组取值)
存:stack.push(“abcd”)
取:
至此,我们可以在struts2里面传递数据了
(1) 向request中放值
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("name","laowang");
(2)用ognl取值
(域对象通常用EL表达式就行,这里只是演示)
如果直接在表单标签里面使用ognl表达式,会不识别,只有加%才能识别
写法:%{ognl表达式}
4、实战,传递数据使用值栈
1、引入标签库
2、在单元格处使用表达式