struts2值栈的理解

struts2是如何把后台数据返回到前台的呢?围绕着这个问题展开思考。
struts2封装好了一个容器,用来返回数据的,就是ActionContext,下图是一个没有数据返回的action
在jsp页面使用s标签,点击出现下面页面
这里写图片描述

那么这个包含了什么东西呢,看源码。
//绑定线程的使用空间,即使 Action是多线程的也不会产生线程不安全问题
这里写图片描述

//值栈
这里写图片描述

//session和application
这里写图片描述

不需要我们手动返回把数据添加到值栈中去,struts2会自动的返回,如下:

package cn.jieou.struts.action;

import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.jieou.struts.pojo.User;
public class NewAction extends ActionSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String myValueStack = "MJ_VALUE_STACK";
    private List<User> users;
    public String getMyValueStack() {
        return myValueStack;
    }
    public void setMyValueStack(String myValueStack) {
        this.myValueStack = myValueStack;
    }
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    public String add(){
        users = new ArrayList<User>();  
        User user1 = new User(1, "MJ1", "123");
        users.add(user1);
        User user2 = new User(2, "MJ2", "123");
        users.add(user2);
        User user3 = new User(3, "MJ3", "123");
        users.add(user3);
        User user4 = new User(4, "MJ4", "123");
        users.add(user4);
        User user5 = new User(5, "MJ5", "123");
        users.add(user5);
        return "success";
    }
}

注意:要给每个属性添加getter和setter方法,不然不可以自动添加进去
这里写图片描述

我们还可以向request域,session域和application域存值,如:

 // 获得ActionContext实例,以便访问Servlet API  
        ActionContext ctx = ActionContext.getContext(); 
        // 存入application  
        ctx.getApplication().put("msg", "application信息");  
        // 保存session
        ctx.getSession().put("msg", "seesion信息");  
        // 保存request信息  
        HttpServletRequest request = ServletActionContext.getRequest(); 
        request.setAttribute("msg", "request信息"); 

前台可以用OGNL表达式获取
注意:这几个域都不在值栈里面而是值栈的上下文(Stack Context),所以利用OGNL取值都需要添加#符号

    <h3>访问OGNL上下文和Action上下文</h3>    
    <!-- 使用OGNL访问属性值 --> 
    <p>request.msg: <s:property value="#request.msg" /></p>    
    <p>session.msg: <s:property value="#session.msg" /></p>    
    <p>application.msg: <s:property value="#application.msg" /></p>

这里简单介绍OGNL表达式:
OGNL表达式全称是对象图导航语言(Object-Graph Navigation Language ),是一种强大的表达式语言,它可以在值栈中取得数据。struts2的s标签库就是用OGNL表达式进行操作ActionContext中的数据的。
OGNL的三个符号:
1、#号:用来获取Stack Context里的Map值

<p>request.msg: <s:property value="#request.msg" /></p>

2、$号:在jsp页面中,和EL表达式类似,准确的说应该是struts2对EL表达式进行了增强,取值顺序为page->>request->>ValueStack->>session->>application;在xml文件中也可以使用$符号来获取数据

<p>${username}</p>

3、%号:用来解析标志OGNL表达式,%{}

<s:property value="%{[3].username}"/></p>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级奶爸MJCX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值