1.一次session创建一个Action实例
2.valueStack依然有些生疏,导致有些时候数据回显搞了半天才反应过来
3.关于数据回显,翻看了以前的资料,由于资料存在缺陷我百度了一个比较符合我认知的答案:
数据回显
对于数据回显,必须要用struts标签!
例如下面这个标签有两种方式实现回显:
<span style="font-size:18px;"><td><s:textfield name="user.username"/></td></span></span></span>
1) 将user作为action的实例变量
Action跳转时是这样的->
<span style="font-size:18px;">public class UserAction extends ActionSupport {
private User user;
......
public String editUI()
{
user = userService.findById(user.getId());
return "editUI";
}
}</span>
2)如果user不是实例变量,要想完成数据回显,应该这样写:
<span style="font-size:18px;">public String editUI() {
User user = new User();
ActionContext ac = ActionContext.getContext();
/************* 数据回显***************/
// 获取值栈
ValueStack vs = ac.getValueStack();
vs.pop();// 移除栈顶元素
vs.push(user); // 入栈
// 进入修改页面
return "editUI";
}</span>
并且这时的标签可以简写为:
<span style="font-size:18px;"><s:textfield name="username"/></span>
能这样简写的原因我也翻看了一些资料:
OgnlValueStack类里有一个List类型的root变量,存放了一组对象,处于第一位的对象叫栈顶对象。
(list集合的 索引为0为栈顶)。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象
的属性,索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,
如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
综上所述,要想完成数据回显,必须将要回显的对象放在ValueStack的根元素上。这样Ognl表达式才能取到值,实现回显。
觉得作者只是做了个总结,为了方便以后回过头看,上传一个有关valueStack的图表,方便理解
4.struts的iterator标签遍历元素时,会将正在遍历中的元素放入栈顶