首先,我必须弄清楚,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强耦合;