1 原理

三个域合一的时候相同的键值对以小的域为准。
ActionContext 对象创建:每次请求的时候都会创建一个与请求对应的 ActionContext 对象。
ActionContext 销毁:请求处理完 ActionContext 销毁。

ActionContext 的生命周期由其中生命周期最短的 request 域限制了。

问题 1:application 不应该是一个项目种只有一个吗?你每次请求都会创建 application 域
吗?

答:ActionContext 不能反过来影响其它域的生命周期。ActionContext 每次的创建只是负
责把以前那些域收集过来,然后销毁的时候只是仅仅销毁 ActionContext,并没有销毁掉
ActionContext 域。域还是以前的域,下次创建 ActionContext 对象的时候,再把
ActionContext 域取出来,然后收录进来。

问题 2:项目种可能同时存在多个 ActionContext 对象吗?

答:对。一个请求创建一个,如果是 10 个请求,就会创建 10 个 ActionContext 对象。
问题 3:如何获得当前请求的 ActionContext 对象?
答:struts2 设计的是,将 ActionContext 对象创建好后,将 ActionContext 与当前线程绑
定。我们要获得 ActionContext 对象,只需要从 ThreadLocal 获取即可。

2 通过 ActionContext

package www.test.b_api;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; //如何在action中获取原生的serveltAPI
public class Demo5Action extends ActionSupport { public String execute() throws Exception { //request域===>Map (Struts2并不推荐使用原生的request域)
//不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request"); //推荐
ActionContext.getContext().put("name", "ActionContextTom"); //获得session域==>Map
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom"); //获得application域===>Map
Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom"); return SUCCESS;
} }

3  通过 ServletActionContext

package www.test.b_api;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; //如何在action中获得原生ServletAPI
public class Demo6Action extends ActionSupport { //并不推荐
public String execute() throws Exception {
//获得原生的request
HttpServletRequest request = ServletActionContext.getRequest();
//原生的session
HttpSession session = request.getSession();
//原生的application
ServletContext servletContext = ServletActionContext.getServletContext(); return SUCCESS;
} }

4 通过实现接口方式

package www.test.b_api;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class Demo7Action extends ActionSupport implements ServletRequestAware {

    private HttpServletRequest request;

    @Override
public String execute() throws Exception {
System.out.println("原生的request:"+request);
request.setAttribute("name", "zhagnsan");
return SUCCESS;
} @Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
} }

最新文章

  1. iOS 修改状态栏字体的颜色
  2. HQL查询——select子句
  3. Spring + Spring MVC+Hibernate框架整合详细配置
  4. &lt;转&gt;VPN技术原理
  5. StringUtilsd的isEmpty、isNotEmpty、isBlank、isNotBlank
  6. CentOS 安装 Sun JDK
  7. HDOJ --- 1258
  8. C# 内存管理优化畅想----前言
  9. 在QTreeWidget中删除QTreeWidgetItem
  10. Python pip 安装包
  11. sqlserver生成随机数 2011-12-21 15:47 QQ空间
  12. C语言 进程控制---创建进程fork()函数
  13. Springmvc+Spring+Mybatis实现员工登录注册功能
  14. 更新pip和setuptools
  15. java使用指定的国际化文件
  16. shell(2)图片重命名
  17. 获取当前 服务 路径 .net
  18. Luogu 3421 [POI2005]SKO-Knights - Exgcd
  19. [Android]Recovery调用外部Shell脚本,Shell脚本使用ui_print方法
  20. ansible 循环register

热门文章

  1. is/as操作符
  2. mysql 新建数据库与表
  3. sqlServer基础知识
  4. 「POJ 1741」Tree
  5. PHP+JQuery实现ajax跨域
  6. &amp;(引用) 和 *(指针)
  7. docker构建mysql容器及Navicat 远程连接
  8. php 百万级数据文件导出
  9. 修改两行代码,让nginx支持phpinfo模式
  10. Sql server if-else以及switch