Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Struts 2'中保持代码干燥;s动作_Java_Design Patterns_Struts2_Spring 3 - Fatal编程技术网

Java 在Struts 2'中保持代码干燥;s动作

Java 在Struts 2'中保持代码干燥;s动作,java,design-patterns,struts2,spring-3,Java,Design Patterns,Struts2,Spring 3,我最近一直在处理一个涉及Struts 2和Spring 3的小项目,我的同事编写了非常糟糕的代码: 我们必须实现两个功能相似的模块:都需要列出/添加/显示/更新/删除JavaBean对象,这两个JavaBean对象有很多共同的字段,它们都有id/content/image\uURL/created\uTime/user,唯一的区别是一个bean有两个字段来存储创建时间中的偏移量,另一个bean必须存储开始时间和结束时间 因此,我的同事决定在一个struts动作类中实现其中一个动作类,并复制代码并

我最近一直在处理一个涉及Struts 2和Spring 3的小项目,我的同事编写了非常糟糕的代码:

我们必须实现两个功能相似的模块:都需要列出/添加/显示/更新/删除JavaBean对象,这两个JavaBean对象有很多共同的字段,它们都有id/content/image\uURL/created\uTime/user,唯一的区别是一个bean有两个字段来存储创建时间中的偏移量,另一个bean必须存储开始时间和结束时间

因此,我的同事决定在一个struts动作类中实现其中一个动作类,并复制代码并进行一些小的更改,然后他有了另一个动作类

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

加:

我试图让这两个动作类扩展同一个基类,不幸的是,Struts 2似乎忽略了父类的setter/getter,并且您也不能使用泛型类型,因为Struts 2同样不知道实例化哪个类并将其提供给动作类中的setter

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

添加2:

我使用stuts2 json插件测试了以下代码(因为更容易观察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>
儿童班:

package com.carllee.exp;

public class ExtendedAction extends BaseAction {

}
如果我运行此测试并转到,结果将是:

{"message" : {"content":"hello"}}
{}
如果我去,结果将是:

{"message" : {"content":"hello"}}
{}
控制台中会出现警告

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

  • 对操作进行子类化并添加其他属性
  • 使用相同的操作但不同的视图
  • 使一个bean包含所有三个字段、不同的视图,不使用时为默认值
  • 使用
    ModelDriven
    并根据单个操作的
    方法
    配置决定实例化哪个模型
  • 等等
有很多选择。哪个是“最好的”取决于我们没有的细节


如果这是你必须处理的坏代码的扩展,想想自己是幸运的——这对重构来说是微不足道的。实际的困难是什么?

我建议创建一个抽象的action类,包含公共部分和两个子类(将被调用的actions)。无法直接调用抽象类


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

不幸的是,Struts 2似乎忽略了父类的setter/getter
uh。。。。什么?你没有提供足够的信息来增强我们的答案。S2不会“忽略父getter/setter”。有很多方法可以聚合功能。。。。从:默认情况下,在“root”对象的基类上定义的属性不会序列化,[…]。文档偶尔有用。如果JSON插件不是您最初的用例,那么引入它可能会误导您。非常感谢您指出它,它让我困惑了这么久/@Dᴀᴠᴇ Nᴇᴡᴛᴏɴ您能解释一下如何在一个模型驱动类中实例化不同的模型吗?我知道必须先指定模型,然后才能使用Action的方法called@CarlLee在调用什么方法之前?使用注释?您可以从
getModel()
返回所需的任何内容。请说得更具体些。@Dᴀᴠᴇ Nᴇᴡᴛᴏɴ如果我的问题太基本,就直接问我;我的意思是,我必须在“ModelDriven”中提供“T”,这是在运行时调用操作的方法(struts.xml中配置的“method”属性)之前