1. valueStack携带的数据
我们都知道valueStack的一个主要应用就是将action中的数据传递到JSP页面中,然后传递过来的数据是怎么样的格式呢?
<1>文本(字符串格式)
1.fieldError 校验数据错误信息提示
2.actionError 关于逻辑操作时错误信息(例如登录失败)
3.message 就是一个信息.
this.addFieldError("msg", "字段错误信息");
this.addActionError("Action全局错误信息");
this.addActionMessage("Action的消息信息");
* fieldError 针对某一个字段错误信息 (常用于表单校验)、actionError (普通错误信息,不针对某一个字段 登陆失败)、 actionMessage 通用消息。
* 在jsp中使用 struts2提供标签 显示消息信息
<s:fielderror fieldName="msg"/>
<s:actionerror/>
<s:actionmessage/>
<2>复杂数据
可以用valueStack储存。
在action中存储数据:
List<User> users = new ArrayList<User>();
users.add(new User("tom", "123", 20, "男"));
users.add(new User("james", "456", 21, "男"));
users.add(new User("fox", "789", 26, "男"));
如果使用的是push存储数据:vs.push(users);
在页面上获取数据:
使用了<s:iterator>标签来迭代集合。
<s:iterator value="[0].top" var="user"> 这是将集合中迭代出来每一个元素起个名称叫user,而user是存储在context中,不在root中.
<s:iterator value="[0].top" var="user">
username:<s:property value="#user.username"/><br>
password:<s:property value="#user.password"/>
<hr>
</s:iterator>
注意:如果我们在使用<s:iterator>进行迭代时,没有给迭代出的元素起名.
<s:iterator value="[0].top">
username:<s:property value="username"/><br>
password:<s:property value="password"/>
<hr>
</s:iterator>
如果使用的是set储存:vs.set("users", users);
<hr>
<s:property value="users" />
<br>
<s:iterator value="users" var="user">
username:<s:property value="#user.username" /><br>
password:<s:property value="#user.password" />
<hr>
</s:iterator>
<hr>
<s:iterator value="users">
username:<s:property value="username" /><br>
password:<s:property value="password" />
<hr>
</s:iterator>
2. 哪些数据被默认压入valueStack中?
有些数据会被默认压入valueStack当中,其中默认压入valueStack中的数据有以下几个:
<1>访问的action对象会被压入到valueStack中。
在DefaultActionInvocation中,有个init方法 stack.push(action);
* Action如果想传递数据给 JSP,只有将数据保存到成员变量,并且提供get方法就可以了
<2>.ModelDriveInterceptor会执行下面操作。
//将实现了ModelDrive接口的action中getModel方法的返回值,也就是我们所说的model对象压入到了valueStack
ModelDriven modelDriven = (ModelDriven) action;
ValueStack stack = invocation.getStack();
Object model = modelDriven.getModel();
if (model != null) {
stack.push(model);
}
3. 为什么EL能够访问valueStack中的数据?
struts2框架中所使用的request对象,是增强后的request对象。
${username}---->request.getAttribute("username");
增强后的request,会首先在request域范围查找,如果查找不到,会在valueStack中查找。
StrutsPreparedAndExecuteFilter的doFilter代码中
request = prepare.wrapRequest(request);
* 对Request对象进行了包装 ,StrutsRequestWrapper
* 重写request的 getAttribute
Object attribute = super.getAttribute(s);
if (attribute == null) {
attribute = stack.findValue(s);
}
访问request范围的数据时,如果数据找不到,就回去值栈中去查找。因为request对象具备访问值栈数据的能力。(查找root中的数据)