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

来源:互联网 发布:农村淘宝怎么查看佣金 编辑:程序博客网 时间:2024/05/30 05:42

先来总结一下 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;}@Overridepublic 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;}@Overridepublic void setRequest(Map<String, Object> request) {this.request = request;}@Overridepublic void setSession(Map<String, Object> session) {this.session = session;}@Overridepublic 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;}}


0 0