以前寫的一點總結,雖然webwork將sPRing的ioc部分引入,取消了原有的IOC,但對于2.1X版本以前的項目,還是可以使用一下。
WebWork相對于Struts支持部分IoC特性,可以減少各組件間的耦合,配合接口編程可以給系統帶來更大的靈活性。另一方面,也方便了單元測試。
第一種、使用WebWork默認提供的對jsp隱含對象的注入支持,不用進行太多的設置就可以在Action中直接使用request,session,application等對象。
對應接口常用的包括:
ParameterAware 頁表表單中傳遞的參數,經WebWork轉換成Map類型。
SessionAware session對象接口,經WebWork轉換成Map類型。
ApplicationAware application對象接口,經WebWork轉換成Map類型。
ServletRequestAware HttpServletRequest對象接口。
只要在Action中加入相應變量,并實現接口方法,就可以在Action中直接使用,不需要手工生成和管理對象。
不使用IoC時調用JSP對象使用方法:
ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
這種手工獲取隱含對象的方法必須依賴Web容器,不便于進行單元測試。
使用IoC的方法如下例:
步驟1、Action實現需要訪問的相應對象接口。
AlarmRecordAction.java
public class AlarmRecordAction extends ActionSupport implements SessionAware {
private Map session = null;//定義session變量
public void setSession(Map arg0) {
this.session = arg0;
}
public String execute() throws Exception {
String str = session.get(“testName”);//可以直接使用session,Webwork框架會自行注入實例。
System.out.println(“JSP Session對象中的變量testName::” + str);
}
}
步驟2、設置xwork.xml文件。
Xwork.xml
<action name="AlarmRecordAction" class="AlarmRecordAction">
<result name="error" type="redirect">
<param name="location">error.jsp</param>
</result>
<result name="sUCcess" type="redirect">
<param name="location">success.jsp</param>
</result>
<interceptor-ref name="defaultStack"/>
</action>
在寫JUnit測試用例時,如下:
AlarmRecordActionTest.java
public class AlarmRecordActionTest extends MockObjectTestCase {
AlarmRecordAction action;
protected void setUp() throws Exception {
super.setUp();
action = new AlarmRecordAction();
}
…
public void testExecute() throws Exception {
action.setSession(new HashMap());
assertEquals("success", action.execute());
}
…
}
這樣就可以傳入需要的session,完成Action單元測試。
第二種、使用components,實現自定義組件的依賴注入。
步驟1、建立需要在其它類中調用的組件類,可以是實現業務的功能類,也可以是POJO,需要提供無參數的構造函數。
AlarmRecord.java
public class AlarmRecord {
private String AlarmRecordID;
private String AlarmRecordType;
public AlarmRecord() {
}
public void setAlarmRecordID(String id) {
this.AlarmReordID = id;
}
public String getAlarmRecordID() {
return this.AlarmRecordID;
}
…
}
步驟2、建立組件類的Aware接口。
AlarmRecordAware.java
public interface AlarmRecordAware {
public void setAlarmRecord(AlarmRecord alarm) ;
}
步驟3、Action類實現組件類Aware接口。
AlarmRecordAction.java
public class AlarmRecordAction extends ActionSupport implements AlarmRecordAware {
....
private AlarmRecord alarm;//定義組件對象
public void setAlarmRecord(AlarmRecord alarm) {
this.alarm = alarm;
}
public String execute() throws Exception {
String str = alarm.getAlarmRecordID();//可以直接使用alarm,不需要自己new,Webwork框架會自行注入實例。
System.out.println(“alarm id ::” + str);
}
...
}
步驟4、編輯components.xml文件,注冊組件。
<components>
<component>
<!—組件存在范圍,可以是request,session,application-->
<scope>session</scope>
<!—組件類-->
<class>AlarmRecord</class>
<!—組件類的Aware接口-->
<enabler>AlarmRecordAware</enabler>
</component>
</components>
步驟5、編輯web.xml文件,加入相關特性支持。
<filter>
<filter-name>container</filter-name>
<filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>container</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
</listener>
步驟6、編輯xwork.xml文件,讓Action支持組件注入。
<action name="AlarmRecordAction" class="AlarmRecordAction">
<result name="error" type="redirect">
<param name="location">error.jsp</param>
</result>
<result name="success" type="redirect">
<param name="location">success.jsp</param>
</result>
<interceptor-ref name="component"/>
<interceptor-ref name="defaultStack"/>
</action>
這樣就實現了組件注入支持。 JUnit里的使用方法類似前例。
(出處:http://m.survivalescaperooms.com)
新聞熱點
疑難解答