WEB开发网
开发学院软件开发Java WebWork IoC 特性使用 阅读

WebWork IoC 特性使用

 2007-12-23 12:31:01 来源:WEB开发网   
核心提示: 以前写的一点总结,虽然webwork将sPRing的ioc部分引入,WebWork IoC 特性使用,取消了原有的IOC,但对于2.1X版本以前的项目,让Action支持组件注入,<action name="AlarmRecordAction" class="AlarmRecord

 

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


Tags:WebWork IoC 特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接