Struts2访问Servlet的API

本文记录Java学习过程中遇到的Struts2访问Servlet的API~

在Struts2中,Action并没有直接和Servlet API进行耦合,也就是说在Struts2的Action中不能直接访问Servlet的API。虽然Struts2中的Action访问Servlet的API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。

尽管Action和Servlet的API解耦会带来很多好处,然而在Action中完全不访问Servlet的API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如:session、request和application等。

在Struts2中,访问Servlet的API有3种方法,具体如下:

通过ActionContext类访问

Struts2框架提供了ActionContext类来访问Servlet的API,ActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象,包括parameters、request、session和application等。

ActionContext类访问Servlet的API的常用方法:

  • void put(String key, Object value):将key-value键值对放入ActionContext中,模拟Servlet的API中的HttpServletRequest的setAttribute()方法;
  • Object get(String key):通过参数key来查找当前ActionContext中的值;
  • Map<String, Object> getApplication():返回一个Application级别的Map对象;
  • static ActionContext getContext():获取当前线程的ActionContext对象;
  • Map<String, Object> getParameters():返回一个包含所有HttpServletRequest参数信息的Map对象;
  • Map<String, Object> getSession():返回一个Map类型的HttpSession对象;
  • void setApplication(Map<String, Object> application):设置Application上下文;
  • void setSession(Map<String, Object> session):设置一个Map类型的Session值。

示例代码:

ActionContext context = ActionContext.getContext();
context.put("name", "oliver");
context.getApplication().put("name","oliver");
context.getSession().put("name","oliver");

通过ActionContext类中的方法调用,分别在request、application和session中放入了键值对。

通过实现特定接口访问

为了在Action中直接访问Servlet的API,Struts2还提供了一系列接口,具体如下:

  • ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例;
  • ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例;
  • SessionAware:实现该接口的Action可以直接访问Web应用的HttpSession实例;
  • ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。

通过ServletActionContext访问

为了直接访问Servlet的API,Struts2框架还提供了ServletActionContext类,该类包含了几个常用的静态方法:

  • static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象;
  • static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象;
  • static ServletContext getServletContext():获取Web应用的ServletContext对象;
  • static PageContext getPageContext():获取Web应用的PageContext对象。

总结:综上三种访问Servlet的API的方式,建议在开发中优先使用ActionContext,以避免和Servlet的API接口。

标签: none