struts2中的request,session等问题

来源:互联网 发布:管家婆打印软件 编辑:程序博客网 时间:2024/05/18 02:10

学到struts的数据处理的时候,发现有几种获得request和session的方式,那么几种获取数据,以及显示有什么不同呢?
一般来说,在struts中的数据处理分为三个阶段

  1. 请求数据封装
  2. 调用Service处理业务逻辑,拿到结果数据
  3. 数据保存到域中

其实现方式也有三种

一、直接拿到servletAPI,执行操作

HttpServletRequest request=ServletActionContext.getRequest();HttpSession session = request.getSession();ServletContext application=ServletActionContext.getServletContext();// 操作request.setAttribute("request_data", "request_data1");session.setAttribute("session_data", "session_data1");application.setAttribute("application_data", "application_data1");

在jsp上拿数据:

requset数据:<s:property value="#request.request_data"/>session数据:<s:property value="#session.session_data"/>application数据:<s:property value="#application.application_data"/>

在网页上的结果:
requset数据:request_data1 session数据: application数据:application_data1
注意:

  1. 该方法用法与servlet中用法相同
  2. ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象时独立的建立了一个req。
  3. 用struts2如果处理get传参是中文,只能使用该方法进行处理乱码问题

二、解耦的方式实现对数据的操作

        // Struts中对数据操作,方式2: 通过ActionContext类         ActionContext ac = ActionContext.getContext();        // 得到Struts对HttpServletRequest对象进行了封装,封装为一个map        // 拿到表示request对象的map        Map<String,Object> request = (Map<String, Object>) ac.get("request");        // 拿到表示session对象的map        Map<String, Object> session = ac.getSession();        // 拿到表示servletContext对象的map        Map<String, Object> application = ac.getApplication();        // 数据        request.put("request_data", "request_data1_actionContext");        session.put("session_data", "session_data1_actionContext");        application.put("application_data", "application_data1_actionContext");

在debug时的结构图:
这里写图片描述

在jsp上拿数据:

requset数据:<s:property value="#request.request_data"/>session数据:<s:property value="#session.session_data"/>application数据:<s:property value="#application.application_data"/>

在网页上的结果:
requset数据:request_data1_actionContext
session数据:session_data1_actionContext
application数据:application_data1_actionContext

三、AOP方式

实现接口:

    public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{    private Map<String, Object> request;    private Map<String, Object> session;    private Map<String, Object> application;    // struts运行时候,会把代表request的map对象注入    @Override    public void setRequest(Map<String, Object> request) {        this.request = request;    }    // 注入session    @Override    public void setSession(Map<String, Object> session) {        this.session = session;    }    // 注入application    @Override    public void setApplication(Map<String, Object> application) {        this.application = application;    }    @Override    public String execute() throws Exception {        // 数据        request.put("request_data", "request_data1_actionAware");        session.put("session_data", "session_data1_actionAware");        application.put("application_data", "application_data1_actionAware");        return SUCCESS;    }}

在jsp的取值和网页显示与上面相同。

0 0
原创粉丝点击