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