WebWork IoC 特性使用

这两天感觉WebWork的IoC特性还是很有用的,记录下来,避免忘记。

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的方法如下例:

步骤1Action实现需要访问的相应对象接口。

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”);//可以直接使用sessionWebwork框架会自行注入实例。

              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) ;

}

步骤3Action类实现组件类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,不需要自己newWebwork框架会自行注入实例。

              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里的使用方法类似前例。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值