如何在Struts 2中使两个动作一起工作

时间:2016-02-01 19:32:02

标签: java design-patterns struts2 post-redirect-get

我需要从表中加载一些数据以在JSP页面中显示。

然后,当用户按下按钮时,他们会发送表单以保存在数据库中。

我想知道我是否可以创建一种仅加载init数据的方法(我不想调用方法execute,这将保存数据)。

我已经使用implements Preparable尝试了它,但它调用了execute方法。在Struts2中,我有一个名为init的方法来加载数据,但我无法在Struts2中执行此操作。

我该怎么做,创建一个加载数据的动作(用execute方法加载)和另一个保存数据的动作?

2 个答案:

答案 0 :(得分:0)

您可以在动作类中创建一个方法,并根据需要调用它,并将此方法映射到该动作。此方法应返回JSP页面作为结果。您在同一个文件中配置的所有内容。当您需要在没有执行操作的情况下返回结果时,prepare非常有用,例如验证失败时的输入结果。

在Struts2中,过滤器映射的每个请求都是一个动作,它有一个动作上下文。请求有两种最流行的GETPOST方法。您为GET和POST请求创建了两个单独的操作。实际上需要遵循PRG pattern

答案 1 :(得分:0)

操作是Struts映射的方法(在struts.xml中,或带有注释)。

您只能映射该类,因此将使用execute()方法。但没有什么能阻止你在一个类中使用多个方法并使它们成为不同的操作。操作是方法,而不是文件。

例如,如果您需要一个操作来阅读而另一个操作需要写入,则以下两种方法都是正确的:

  1. 两个不同的文件:

    public class ReadAction extends ActionSupport {
        public String execute(){ ... }
    }
    
    public class WriteAction extends ActionSupport {
        public String execute(){ ... }
    }
    
    <action name="read" class="foo.bar.ReadAction">
        <result>page.jsp</result>
    </action>
    
    <action name="write" class="foo.bar.WriteAction">
        <result>page.jsp</result>
    </action>
    
  2. 同一档案中有两种不同的方法:

    public class ReadWriteAction extends ActionSupport {
        public String read(){ ... }
        public String write(){ ... }
    }
    
    <action name="read" class="foo.bar.ReadWriteAction" method="read">
        <result>page.jsp</result>
    </action>
    
    <action name="write" class="foo.bar.ReadWriteAction" method="write">
        <result>page.jsp</result>
    </action>
    
  3. 很明显,如果你在行动之间有共同的代码,为了避免冗余,你需要以某种方式加入它们:

    • 由两者扩展的BaseAction,或
    • 类中的一个方法,其中两个操作都是。

    该方法可以是您想要的任何方式。 prepare()方法是PrepareInterceptor在实现Preparable接口的操作上运行的一种特殊方法,可用于预加载数据,例如在验证失败时。

    如何设计应用程序取决于您,但如果您有两个逻辑操作,一个用于在页面中加载和显示数据,另一个用于写入数据,然后再次加载并将其显示在页面中,你需要两个动作(加载)和PRG pattern->表示returns):

      
        
    • 加载-> JSP
    •   
    • ->(redirectAction)加载-> JSP
    •