1、什么是 WEB 资源?
HttpServletRequest、HttpSession、ServletContext 等原生的 Servlet API。
2、为什么访问 WEB 资源?
B/S 的应用的 Controller 中必然需要访问 WEB 资源(向域对象中读写属性、读写Cookie、获取 realPath 等)
3、如何访问?
1)、和Servlet API 解耦的方式:只能访问有限的 Servlet API 对象,且只能访问有限的方法。(使用 ActionContext 、实现 XxxAware 接口)。
2)、和 Servlet 耦合的方式:可以访问更多的 Servlet API 对象,可以调用其原生的方法。(使用 ServletActionContext、实现 ServletXxxAware 接口)。
两者区别:若一个 Action 类中有多个 action 方法,且多个方法都需要使用域对象的Map 或 parameters ,则建议使用实现 XxxAware 接口的方式。
具体分析:
一、使用 ActionContext 对象来获取 WEB 资源:
0、获取 ActionContext 对象
//ActionContext 是 Action 的上下文对象。可以从中获取到当前 Action 需要的一切信息。
ActionContext actionContext = ActionContext.getContext();
1、获取 appliction 对应的 Map,并向其中添加一个属性
//通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象。
Map<String, Object> applicationMap = actionContext.getApplication();
//设置属性
applicationMap.put("applicationKey","applicationValue");
//获取属性
applicationMap.get("date");
2、session (可以进行属性的读写操作)
注:session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用 invalidate() 方法,可以使其 session 失效。
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
3、request * (可以进行属性的读写操作)
ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map,需要手工调用 get() 方法,传入 request 字符串来获取。
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey", "requestValue");
4、获取请求参数对应的 Map,并获取指定的参数值。
键:请求参数的名字。值:请求参数的值对应的字符串数组。
注意:1、getParameters 的返回值为在 Map<String, Object>,而不是Map<String, String[]>.
2、parameters 这个 Map 只能读,不能写入数据,如果写入,但不出错,但也不起作用。
二、实现 XxxAware 接口
Action 类通过可以实现某些特定的接口,让 Struts2 框架在运行时向 Action 实例注入 parameters、request、session 和 application 对应的 Map 对象。
implements ApplicationAware, ParameterAware, RequestAware, SessionAware
因为解耦的方式只能获取 Map,有的时候我们需要用到原生的 API。所以需要耦合的方式。
一、使用 ServletActionContext 的方式:可以从中获取到当前 Action 对象需要的一切 Servlet API 相关的对象。
常用的方法:
1、获取 HttpServletRequest:ServletActionContext.getRequest();
2、获取 HttpSession: ServletActionContext.getRequest().getSession();
3、获取 ServletContext:ServletActionContext.getServletContext();
二、实现 ServletXxxAware 接口的方式
implements ServletRequestAware, ServletContextAware, ServletResponseAware
over。