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