如何在 Struts 2 中使两个动作协同工作
How to make two actions to work together in Struts 2
我需要从 table 加载一些数据以显示在 JSP 页面中。
然后,当用户按下按钮时,他们将发送表单以保存在数据库中。
我想知道我是否可以创建一个方法来仅加载 init
数据(我不想调用方法执行,这将保存数据)。
我已经用工具 Preparable
试过了,但它调用了 execute 方法。在 Struts2 中,我有一个名为 init 的方法来加载数据,但我无法在 Struts2 中执行此操作。
怎么办,创建一个加载数据的动作(用execute方法加载)和另一个保存数据的动作?
您可以在操作中创建方法 class 随意调用它并将此方法映射到操作。此方法应该 return 一个 JSP 页面作为结果。您在同一个文件中配置的所有内容。 prepare
当您需要 return 一个没有执行操作的结果时非常有用,比如验证失败时的输入结果。
在Struts2中,过滤器映射的每个请求都是一个动作,并且它有一个动作上下文。一个请求有两种最流行的方法GET
和POST
。您为 GET 和 POST 请求创建两个单独的操作。这实际上是需要遵循PRG pattern。
action 是 class 的 method 映射 Struts(在 struts.xml 中,或带有注释)。
您只能映射 class,因此将使用 execute()
方法。但是没有什么能阻止您在单个 class 中使用多个方法并使它们执行不同的操作。动作是方法,而不是文件。
比如你需要一个动作读,另一个动作写,下面两种方式都是正确的:
两个不同的文件:
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>
同一文件中的两种不同方法:
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>
很明显,如果您在操作之间有公共代码,为避免冗余,您需要以某种方式加入它们:
- 由他们两个扩展的 BaseAction,或者
- class 中的一个方法,其中两个操作都是。
方法可以是任何你想要的。 prepare()
方法是 PrepareInterceptor 对实现 Preparable 接口的操作的一种特殊方法 运行,可用于预加载数据,例如在验证失败时。
如何设计您的应用程序取决于您,但是如果您有两个逻辑操作,一个是在页面中加载和呈现数据,另一个是写入数据,然后再次加载并在页面中呈现页面,你需要两个动作(加载和写入)和一个PRG pattern(->
意味着returns
) :
- Load
->
JSP
- Write
->
(redirectAction) Load ->
JSP
我需要从 table 加载一些数据以显示在 JSP 页面中。
然后,当用户按下按钮时,他们将发送表单以保存在数据库中。
我想知道我是否可以创建一个方法来仅加载 init
数据(我不想调用方法执行,这将保存数据)。
我已经用工具 Preparable
试过了,但它调用了 execute 方法。在 Struts2 中,我有一个名为 init 的方法来加载数据,但我无法在 Struts2 中执行此操作。
怎么办,创建一个加载数据的动作(用execute方法加载)和另一个保存数据的动作?
您可以在操作中创建方法 class 随意调用它并将此方法映射到操作。此方法应该 return 一个 JSP 页面作为结果。您在同一个文件中配置的所有内容。 prepare
当您需要 return 一个没有执行操作的结果时非常有用,比如验证失败时的输入结果。
在Struts2中,过滤器映射的每个请求都是一个动作,并且它有一个动作上下文。一个请求有两种最流行的方法GET
和POST
。您为 GET 和 POST 请求创建两个单独的操作。这实际上是需要遵循PRG pattern。
action 是 class 的 method 映射 Struts(在 struts.xml 中,或带有注释)。
您只能映射 class,因此将使用 execute()
方法。但是没有什么能阻止您在单个 class 中使用多个方法并使它们执行不同的操作。动作是方法,而不是文件。
比如你需要一个动作读,另一个动作写,下面两种方式都是正确的:
两个不同的文件:
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>
同一文件中的两种不同方法:
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>
很明显,如果您在操作之间有公共代码,为避免冗余,您需要以某种方式加入它们:
- 由他们两个扩展的 BaseAction,或者
- class 中的一个方法,其中两个操作都是。
方法可以是任何你想要的。 prepare()
方法是 PrepareInterceptor 对实现 Preparable 接口的操作的一种特殊方法 运行,可用于预加载数据,例如在验证失败时。
如何设计您的应用程序取决于您,但是如果您有两个逻辑操作,一个是在页面中加载和呈现数据,另一个是写入数据,然后再次加载并在页面中呈现页面,你需要两个动作(加载和写入)和一个PRG pattern(->
意味着returns
) :
- Load
->
JSP- Write
->
(redirectAction) Load->
JSP