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;
} }

03-struts2获得servetAPI的更多相关文章

  1. 03. struts2中Action配置的各项默认值

    Action中的各项默认值 Action各项配置 <action name="helloworld" class="com.liuyong666.action.He ...

  2. Struts2常见面试点

    01.  三层和MVC的区别 http://blog.csdn.net/csh624366188/article/details/7183872 http://www.cnblogs.com/zdxs ...

  3. Java MVC框架性能比较

    Java MVC框架性能比较 - by zvane 现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到采用了struts2框 ...

  4. struts2 笔记03 异常支持、防止页面刷新和后退、方法验证

    Struts2对异常支持(声明式异常.自动的异常处理), 异常处理(运行期异常事务自动回滚) 1. 自定义异常类,继承RuntimeException或Exception实现构造方法. 2. 配置异常 ...

  5. struts2.1笔记03:AOP编程和拦截器概念的简介

    1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用A ...

  6. Struts2笔记03——架构(转)

    原始内容:https://www.tutorialspoint.com/struts_2/basic_mvc_architecture.htm 架构(很重要!尤其是图!) 从一个比较高的层次来看,St ...

  7. ???Struts2框架03 session的使用、登录逻辑【session工作原理】

    1 登录逻辑 1.1 获取登录数据(例如:用户名.密码) 1.2 在控制层调用业务层来验证数据信息 1.3 登录成功:保存用户信息(服务器用session.浏览器用cookie),跳转到主页面 1.4 ...

  8. Struts2+DAO层实现实例03——添加监听器跟踪用户行为

    实例说明 根据上两次的成品进行二次加工. 加入Listener,监听用户的登陆注销情况. 所用知识说明 采用SessionBindingListener对Session进行监听. 同时,Action中 ...

  9. Struts2+Spring+Hibernate step by step 03 整合Spring之中的一个(在DAO层验证username和password)

    注:该系列文章部分内容来自王健老师编写SSH整合开发教程 目的:通过Spring创建数据库的连接,并通过Spring进行事务管理. 第一步:将Spring的包拷贝至当前项目的lib文件夹下,例如以下图 ...

  10. Struts2学习笔记03 之 Result组件

    二.Result原理 1.stream 2.redirectAction 3.Json

随机推荐

  1. C# int?

    int?:表示可空类型,就是一种特殊的值类型,它的值可以为null用于给变量设初值得时候,给变量(int类型)赋值为null,而不是0int??:用于判断并赋值,先判断当前变量是否为null,如果是就 ...

  2. githup上传文件

    GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月不超过10美刀的费用也非常便宜. ...

  3. 【SQL】- 基础知识梳理(七) - 索引

    索引的概念 在关系型数据库中,索引是对数据库表中一列或多列的值进行排序的一种结构. SQL SERVER中有索引的类型:按存储结构区分:“聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引 ...

  4. 「BZOJ 2142」礼物

    题目链接 戳这 Title Solution 这一道题显然可以看出公式为: \[ans=C_{n}^{w_1}*C_{n-w}^{w_2}*...*C_{w_m}^{w_m}\] 然后就可以用扩展Lu ...

  5. Jenkins忘记密码

    当Jenkins密码忘记时,可以去Jenkins的安装目录下的users\用户名_xxxxx\config.conf文件下找下找到<passwordHash></passwordHa ...

  6. Sqoop 遇到的问题

    1.   想用 sqoop 增量的方式导入到 hive.运行下面的命令: sqoop import --connect jdbc:mysql://192.168.7.159:3306/test --u ...

  7. Windows系统如何安装Redis?

    转自 http://blog.csdn.net/lamp_yang_3533/article/details/52024744   一.Redis的下载地址 Redis官方并没有提供Redis的win ...

  8. C# Winform 加载窗体/对象时的等待页面设计

    在设计应用程序过程中,有时候加载对象需时较长,我们可以显示一个Loading等待页面,对用户来说就比较友好了. 这个还是涉及到多线程,下面是步骤. 一.创建好Loading窗体: 一个Panel用于显 ...

  9. SJTU 机试 最小面积子矩阵 压缩+双指针

    链接:https://www.nowcoder.com/questionTerminal/8ef506fbab2742809564e1a288358554来源:牛客网 一个N*M的矩阵,找出这个矩阵中 ...

  10. ansible基本模块-cron

    ansible   XXX   -m   cron   -a   "name=‘XXX ’   job=‘执行的命令’   minute=XXX "                ...