struts2_关于valueStack的数据

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中的数据)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值