Struts2:在 Action 中访问 WEB 资源

时间:2022-08-03 13:40:33

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。