以前写的一点总结,虽然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://www.knowsky.com)