如何在Struts 2的单个视图中使用多个表单/操作

我有一个搜索框,显示在每个页面上.搜索框的JSP代码通过切片插入到每个页面中.

搜索框有一个表单和一个动作类SearchAction,需要为下拉框预加载一些属性. SearchAction类有一个input()方法,它执行此初始化.

有些页面在主区域也有自己的形式.还有自己的动作类.它们还有一个input()方法,它可以进行一些预加载.

>是否可以在同一视图中使用两个动作?
>每个表单如何访问自己的操作属性.
>如何在呈现JSP之前调用两个动作类的输入方法?

更新:

我正在添加一个修剪过的例子,因为它可能不清楚我想要做什么.它是一个寄存器页面register.jsp,带有RegisterAction.该页面还包含搜索表单. (顺便说一句:我省略了getter / setter以及动作类中的其他内容以保持简短):

register.jsp:

<s:form action="executeSearch">
    <s:textfield key="name" label="Name"/>
    <s:textfield key="age"  label="Age"/>
    <s:submit/>
</s:form>

<s:form action="executeRegister">
    <s:textfield key="firstName" label="First Name"/>
    <s:textfield key="lastName" label="Last Name"/>
    <s:textfield key="age" label="Age"/>
    <s:submit/>
</s:form>

struts.xml中:

<action name="*Search" class="action.SearchAction" method="{1}">
    <result name="success">/searchresult.jsp</result>
</action>

<action name="*Register" class="action.RegisterAction" method="{1}">
    <result name="input">/register.jsp</result>
    <result name="success">/registerOk.jsp</result>
</action>

SearchAction.java:

public class SearchAction extends ActionSupport {

    private String name;
    private int age;

    @Override
    public String input() throws Exception {
        // preload the search form with some demo data
        name = "test";
        age = 20;
        return INPUT;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    ...
}

RegisterAction.java:

public class RegisterAction extends ActionSupport {

    private String firstName;
    private String lastName;
    private int age;

    @Override
    public String input() throws Exception {
        // preload the register form with some demo data
        firstName = "John";
        lastName = "Rambo";
        age = 10;
        return INPUT;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    ...
}

假设我调用了动作inputRegister.action.然后调用RegisterAction.input().属性已设置.结果SUCCESS导致register.jsp被渲染.

但是我的搜索表单呢.如何访问搜索操作及其模型.当然,这些都不在ValueStack上.而且我也没有看到任何方法来调用SearchAction的任何方法来初始化它的模型.我故意选择年龄参加两个动作课程.在渲染页面中,您可以看到搜索表单还访问了RegisterAction属性(因为它位于ValueStack之上).但它需要访问SearchAction.它必须显示20而不是10.

我显然做错了.但即使经过大量的谷歌搜索,我仍然没有找到正确的方法来做到这一点.

最佳答案 正如我发现的那样(请更正我):在向用户显示之前,需要在自己的操作中启动两种表单,当您要求注册表单时,搜索表单不会被启动,因为它的操作从未被调用.

这是一个常见问题,可以使用Ajax轻松处理,不要加载所有页面数据.请看一下http://struts.jgeppert.com/struts2-jquery-showcase/index.action.有一个主题选择选择框,已经启动一次.加载页面的其他部分将通过Ajax完成,因此主题选择,启动选择框的操作,不需要重新运行.您可以轻松使用struts 2 jquery插件来实现它.

如果你不能使用Ajax(有任何理由),那就没有简单的方法了.您应该在EACH操作中手动启动搜索表单项,以确保您的struts标记可以读取搜索表单启动的数据.您可以根据需要考虑一下,在您的所有操作中剪切和粘贴搜索动作的主体!

点赞