Struts2在Action中访问WEB资源
2024-08-31 19:29:37
什么是WEB资源?
这里所说的WEB资源是指:HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。
为什么需要访问WEB资源?
B/S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie等等操作均需要用到上述原生的ServletAPI
访问方法
和 Servlet API 解耦的方式:
只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).
> 使用 ActionContext
使用示例:
public class ActionTest { @SuppressWarnings("unchecked")
public String execute() {
// 0、获取ActionContext对象
// ActionContext是Action的上下文,可以从中获取到当前Action需要的相关信息
ActionContext context = ActionContext.getContext(); // 1、获取application域对应的Map对象
// 通过调用上下文对象context的getApplication()方法获取
Map<String, Object> applicationMap = context.getApplication();
applicationMap.put("applicationKey", "applicationValue"); // 2、session
Map<String, Object> sessionMap = context.getSession();
sessionMap.put("sessionKey", "sessionValue"); // 3、request
// ActionContext中并没有提供获取getRequest方法来获取requestMap的方法
// 而是需要调用get方法,并且传入‘request’字符串作为参数来获取
Map<String, Object> requestMap = (Map<String, Object>) context.get("request");
requestMap.put("requestKey", "requestValue"); // 4、获取请求参数对应的map
// 键:请求参数名,值:请求参数的值对应的字符串数组
Map<String, Object> parameters = context.getParameters();
System.out.println(((String[]) parameters.get("name"))[0]);
return null;
} }
> 实现 XxxAware 接口
使用示例:
public class ActionAwareTest implements ApplicationAware, SessionAware, RequestAware, ParameterAware { private Map<String, Object> applicationMap; private Map<String, Object> sessionMap; private Map<String, Object> requestMap; private Map<String, String[]> parameters; @Override
public void setApplication(Map<String, Object> map) {
this.applicationMap = map;
} @Override
public void setSession(Map<String, Object> map) {
this.sessionMap = map;
} @Override
public void setRequest(Map<String, Object> map) {
this.requestMap = map; } @Override
public void setParameters(Map<String, String[]> map) {
this.parameters = map; } public String execute() {
return null; } }
> 选用的建议:
若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用 Aware 接口的方式
session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!
和 Servlet API 耦合的方式:
可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.
> 使用 ServletActionContext
获取方法:
/**
* ServletActionContext 可以从中获取到一切Servlet API相关的方法
* @author Administrator
*
*/
public class ServletActionContextTest { public String execute(){
//获取原生request对象
HttpServletRequest request=ServletActionContext.getRequest();
//获取原生session对象
HttpSession session=request.getSession();
//获取原生application对象
ServletContext application=ServletActionContext.getServletContext(); return null;
}
}
> 实现 ServletXxxAware 接口.
获取方法:
/**
* 通过实现ServletXxxAware接口的方式由Struts2负责注入相关对象
* ServletRequestAware:用来注入request对象
* ServletContextAware:用来注入application对象
* @author Administrator
*
*/
public class ServletAwareActionTest implements ServletRequestAware, ServletContextAware { private HttpServletRequest request; private ServletContext application; private HttpSession session; @Override
public void setServletContext(ServletContext servletContext) {
this.application = servletContext; } @Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
} }
最新文章
- IE6读取不到样式文件bug
- EasyUI DataGrid 实用例子(2015-05-22)
- 解决开启SQL Server sql Always on Group 事务日志增大的问题
- Implement Stack using Queues
- 怎么给OCR文字识别软件重编文档页面号码
- 微信朋友圈分享页面(JS-SDK 1.0)
- Java基础知识强化14:Java死亡竞赛题目解析
- jquery Tab默认情况下自动切换
- CSS3动画之透视
- Core Bluetooth下实现两个设备进行互联
- 改动EditPlus默认模板
- asp.net URL DES加密 什在URL中的使用
- C语言-学生博客汇总
- 修改应用进程open file值
- ubuntu中可以ping通IP地址但是ping不通域名的问题(www.baidu.com)
- 2月第3周业务风控关注|上海网信办复测23个被约谈APP 涉及1号店、小红书等
- libffi-dev : 依赖: libffi6 (= 3.2.1-4) 但是 3.2.1-4kord 正要被安装
- wifidog 源码初分析(4)-转
- Hibernate_day03讲义_使用Hibernate完成一对多的关系映射并操作
- Scala入门系列(二):条件控制与循环