您的位置:首页 > 移动开发

struts2获取request,session,application作用域的几种方式

2016-07-07 15:37 459 查看
先来总结一下 jsp 4大作用域的生命周期吧(scope)(PS:如有总结不到位或有误的地方还请指点)

page:页面作用域,仅限当前页面,页面跳转或者页面关闭后都失效。

request:请求作用域,从http请求到相应的整个过程,也可以是跨越forward前后的两个页面。

session:会话作用域,用户首次访问浏览器会产生一个会话,这个会话直到浏览器关闭或者会话超时才会失效,也就是说从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。

application:应用作用域,从应用启动到应用关闭,生命周期最长,如果不进行收到删除会一直存在。

总结:application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page, request, session都是完全隔离的,无论如何修改都不会影响其他人的数据。按照生命周期时间长短排序:page<request<session<application

下面就来总结一下action获取4大作用域的4种方法

1.实现ServletRequestAware接口通过IOC机制注入request,IoC方式(即使用ServletRequestAware拦截器)(此方法最麻烦,不推荐使用)

public class TestAction extends ActionSupport implements ServletRequestAware {

private static final long serialVersionUID = 1L;

private HttpServletRequest request;
private HttpSession session;
private ServletContext application;

public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}

@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}

}


2.实现Servlet Aware接口通过IOC机制注入request(此方法与第一种类似)

public class TestAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {

private static final long serialVersionUID = 1L;

private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;

public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;

}

@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}

@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}

@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}

}

3.使用ActionContext类(此方法与servlet解耦,推荐使用)

@SuppressWarnings({"rawtypes","unchecked" })
public class TestAction extends ActionSupport {
private static final long serialVersionUID = 1L;

private Map request;
private Map session;
private Map application;

public TestAction() {
request = (Map) ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}

public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}

}

4.使用ServletActionContext类(此方法与servle耦合)

public class TestAction extends ActionSupport {

private static final long serialVersionUID = 1L;

private HttpServletRequest request;
private HttpSession session;
private ServletContext application;

public TestAction() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}

public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息