在Struts 2的Action中保持我的代码DRY

时间:2011-12-01 16:37:46

标签: java design-patterns struts2 spring-3

我最近一直在处理一个涉及Struts 2和Spring 3的小项目,我的同事写了很多BAD代码:

我们必须实现两个类似功能的模块:两者都需要列出/添加/显示/更新/删除Java Bean对象,而这两个Java Bean对象有许多共同的字段,它们都有id / content / image_url / created_time / user,唯一的区别是一个bean有2个字段用于存储created_time中的偏移量,另一个用于存储start_time和end_time。

所以我的同事决定在一个struts Action类中实现其中一个并复制代码并进行一些小改动,然后他就有了另一个Action类。

我正在努力解决他的错误,设计模式或实践可以解决我的问题?

ADD:

我试图让这两个Action类扩展相同的基类,不幸的是,Struts 2似乎忽略了父类的setter / getter,而且你不能使用泛型类型,因为Struts 2也不会知道哪个类实例化并赋予Action类中的setter。

我想减少重复的代码,但是由于上面提到的那两个问题,我最终制作了更多重复的代码和太复杂的类结构,这些都处于被破坏的边缘。

ADD 2:

我使用stuts2-json-plugin测试了以下代码(因为它更容易观察JSON格式的数据):

struts.xml中:

<package name="inherit" namespace="/inherit" extends="json-default">
        <action name="base" method="doStuff" class="com.carllee.exp.BaseAction">
            <result type="json">
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
        <action name="extended" method="doStuff" class="com.carllee.exp.ExtendedAction">
            <result type="json">
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
</package>

Java代码

package com.carllee.exp;

import com.carllee.exp.bean.Message;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport {

    private Message message; // and getter/setter
    private String text;     // and getter/setter

    public String doStuff() {
        return SUCCESS;
    }

}

儿童班:

package com.carllee.exp;

public class ExtendedAction extends BaseAction {

}

如果我运行此测试并转到http://localhost:8080/struts2-exp/inherit/base?message.content=hello,结果将是:

{"message" : {"content":"hello"}}

如果我转到http://localhost:8080/struts2-exp/inherit/extended?message.content=hello,结果将是:

{}

并且控制台中会出现警告

这就是为什么我说Struts 2忽略了父类中的setter / getters。

2 个答案:

答案 0 :(得分:1)

  • 对操作进行子类化并添加其他属性?
  • 使用相同的操作但不同的视图?
  • 制作一个包含所有三个字段,不同视图的bean,不使用时默认使用?
  • 使用ModelDriven并根据单个操作的"method"配置决定实例化哪个模型?
  • 等...

很多选择。哪个“最好”取决于我们没有的细节。

如果这是您必须处理的BAD代码的扩展,请认为自己很幸运 - 这对于重构来说听起来微不足道。什么是实际的斗争?

答案 1 :(得分:0)

我建议使用公共部分和两个子类(将被调用的动作)创建一个抽象动作类。无法直接调用抽象类。

在您的应用程序中,子类可以使用父抽象类中的所有代码。