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拦截器)(此方法最麻烦,不推荐使用)
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;
}
}
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;
}
}
相关文章推荐
- Android Manifest 用法
- Angularjs 跨域请求
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- 杰奇登录后的东西都是在session里面的
- 跨越fso、wsh、 application写文件
- IIS 错误 Server Application Error 详细解决方法
- asp 内置对象 Application 详解
- IIS运行错误 Server Application Error 错误代码 Error: 8004的解决方法
- ASP中SESSION无法保存问题的解决办法
- 解决IIS的Server Application Error的2种方法
- Oracle中的Connect/session和process的区别及关系介绍
- Node.js编程中客户端Session的使用详解
- 完美解决ajax访问遇到Session失效的问题
- 浅谈COOKIE和SESSION区别
- 解析PHP的session过期设置
- php中Session的生成机制、回收机制和存储机制探究
- php错误提示failed to open stream: HTTP request failed!的完美解决方法
- php中将一个对象保存到Session中的方法
- 深入解析Session是否必须依赖Cookie