struts2_关于valueStack的数据

来源:互联网 发布:修改mysql配置文件 编辑:程序博客网 时间:2024/06/18 07:40

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对象压入到了valueStackModelDriven 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中的数据)