前两篇博客讲述了前端是如何通过action将数据传递给后端的,以及后端是如何将数据封装处理的。这只是实现了前端数据的单向传递,(虽然我们之前学过的技术jsp(内置对象),servlet可以做到,但是略微有些麻烦),无法满足交互的性能,因此本片就拉开了后端向前端传递数据的序幕,强大的技术-值栈。
后端处理好数据之后,将数据封装到值栈中,前端可以通过值栈拿取数据。从而事件了前后端的交互。
代码能解释一切
-
set方法 将数据放入值栈
做法:
- 获取ActionContext对象,
ActionContext context = ActionContext.getContext();
- 获取值栈对象
ValueStack stack = context.getValueStack();
- 调用set 方法
stack.set(“uname”,“sofency”);//这样前端就可以通过struts标签库进行获取属性了
前端<!--使用的s:property标签是引入的标签库 具体的配置如下 在jsp的页面里面顶部引入 <%@taglib uri="/struts-tags" prefix="s"%> <直接这样就可以 因为标签库已经被封装在ognl的jar包中了> --> <h1><s:property value="uname" /></h1><!--根据名字直接获取--> 假如我们没有将数据放入值栈 我们可以这样写 <h1><s:property value="#uname" /></h1>
如下显示
-
通过push方式
前两步和上面一样 获取ActionContext对象,获取值栈对象
第三步不一样
stack.push("alice")
;//没有相应的属性描述
stack.push("sofency")
;//没有相应的属性描述
stack.push("hello")
;//没有相应的属性描述
那么前端如何获取 类似于栈的先进后出 后进先出原则 一般不这样用
<s:property value="[0].top"/>栈顶
<s:property value="[1].top"/>
<s:property value="[2].top"/>
- 类似于模型驱动封装 不过只是针对于属性而言
package com.sofency.action;
import com.opensymphony.xwork2.ActionSupport;
public class ognlDemo extends ActionSupport{
private String name;//1 设置全局属性
public String getName() {//设置属性的get方法 前端会根据name调用getName()方法获取属性值
return name;
}
@Override
public String execute() throws Exception {
name="sofency";//3.属性的赋值操作
return "success";
}
}
前端的数据获取
<h1><s:property value="#name"></s:property></h1>
和set方法一样根据属性名获取值
最后一种方法和前两种方法的区别
调用<s:debug><s:debug>
在界面中
我们可以发现以下特点
push调用的值栈情况 新增三个java.lang.String的空间存储字符串
set方式 值栈的情况 set的底层是map 所以新增了HsahMap的值栈
而第三种方法值栈情况如下 那么属性存储在action里面
(上面两种方法action里面的name是我在jsp测试页面没有将调用他们的ognl给删除 实际不存在name属性)
综上所述 第三种方法 所操作的属性存储在action里面,而其他两种方法则会在值栈中新开辟空间存储数据,浪费空间,所以一般使用第三种方法进行传递数据
第三种方法不仅是针对属性,还可以是对象 和List集合存放方式雷同,下一篇博客讲述前端是如何取出值栈里面对象和List里面的数据的。
夜很静,我也该睡了,一直熬夜真是顶不住