首先,我必须弄清楚,struts2为什么要和Servlet API解耦呢?

struts2与1有很大区别,struts1与Serlvlet API耦合紧密:

1.exectue必须使用HttpServletResponse、HttpServletRequest方法,这样很不利于单元测试;

那么,既然解耦了,怎么调用Servlet API呢?有三种方法;

   1.直接调用:IoC方式(控制反转)

         必须在action中实现一些接口才可调用,如ServletContextAware、ServletRequestAware、ServletResponseAware、SessionAware。

注:

  •    接口名称                                        说明

ServletContextAware :  实现该接口的action可以直接访问ServletContext对象,实现该接口的action必须                                              实现 void setServletContext()方法。

ServletRequestAware:   实现该接口的action可以直接访问HttpServletRequest对象,实现该接口的action                                        必须实现void setServletRequest()方法;

ServletResponseAware:   必须实现   void setServletResponse()

SessionAware:  必须实现  void setSessionAware();

 

2.直接调用:非IoC方式

struts2提供ServletActionContext类获得Servlet API。

该类提供getPageContext()、getRequest()、getResponse()方法实现直接访问;

推荐使用非IoC方式,实现简单,代码量少。

3.间接访问:

ActionContext类

 

另:struts1与2区别:

struts1:ActionForm必须继承AcionForm基类;Action必须继承Action基类;

                与servlet API强耦合;