Java 从Action';创建新Struts Action实例时有任何问题吗;s execute()方法?

Java 从Action';创建新Struts Action实例时有任何问题吗;s execute()方法?,java,struts,instance,Java,Struts,Instance,我正在使用Struts 1.1(不要让我开始),升级现在不是一个选项。不幸的是,整个单例操作方法让我发疯,使操作变得相当复杂,因为我们不能使用实例变量等,这意味着所有必要的对象都需要作为参数传递给所有方法。我更喜欢使用实例变量,因此我希望为来自Action的execute方法的每个请求创建一个新的Action实例,如下所示: public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletReque

我正在使用Struts 1.1(不要让我开始),升级现在不是一个选项。不幸的是,整个单例操作方法让我发疯,使操作变得相当复杂,因为我们不能使用实例变量等,这意味着所有必要的对象都需要作为参数传递给所有方法。我更喜欢使用实例变量,因此我希望为来自Action的execute方法的每个请求创建一个新的Action实例,如下所示:

public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    return (new SaveUserDataAction()).instanceExecute(mapping, form, request, response);
}

public ActionForward instanceExecute (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // all normal execute stuff goes here
}
这很好,但我想知道你们是否能想出这种方法的任何问题。我知道,由于额外的对象创建,这将需要一些额外的CPU周期,但是现在的智慧是,每个请求都会有大量的对象创建,而且还会有一个被忽略;更不用说提高可读性和可维护性是值得的。还有其他更严重的缺点吗

还有,有没有比这种半笨拙的方法更简单的方法呢?也许Struts支持的方法不打算执行业务逻辑:

在Struts应用程序中,大多数业务逻辑都可以使用JavaBeans表示。操作可以调用JavaBean的属性,而不知道它实际上是如何工作的。这封装了业务逻辑,因此操作可以专注于错误处理和转发控制的位置


问题不在于您正在创建一个额外的实例,而在于您正在创建一个额外的动作实例,而不是某个助手/dao。

感谢您的回复。我对为业务逻辑创建这个新的动作实例不感兴趣,而是对典型的动作逻辑感兴趣。我希望能够使用实例变量,这将反过来在业务层中创建各种对象来执行业务逻辑?您的操作应该只是一层薄薄的胶水,因为数据验证属于ValidatorForms,访问控制应该放在过滤器中,数据库操作应该放在模型的JavaBeans中。你在做什么?恐怕我们的胶水太多了!具体地说,虽然我们在表单中执行了很多验证,但有些验证依赖于数据,而数据的加载成本很高;因为它很昂贵,而且在以后的操作中需要数据(传递到业务层方法中),所以我们在操作中加载数据并在那里进行验证。对于某些授权,答案是一样的——简单的授权在别处完成,但在加载昂贵的数据之前,其他授权无法完成。如果我们每个操作都有一个操作,那么会有很大的改进,但遗憾的是,它们是分组的,而且这种情况不会很快消失。我的建议是在表单的
validate()
末尾加载昂贵的数据,如果没有其他验证失败,则在那里进行检查。如果表单通过了验证,那么在操作和业务逻辑层的请求期间,数据将进一步可用。简单的授权可以留在操作中,但更复杂的内容属于业务逻辑。Struts操作不是单例。在Struts 1.1中,它们被视为单例,即相同的实例在不同的线程中使用。