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

nha*_*rer 5 java jsp struts2 ognl valuestack

我有一个显示在每个页面上的搜索框。搜索框的 JSP 代码通过图块插入到每个页面中。

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

一些页面在主区域也有自己的表单。还有自己的动作类。他们还有一种input()方法可以进行一些预加载。

  1. 是否可以在同一视图中使用两个操作?
  2. 每个表单如何访问它自己的操作的属性。
  3. 我怎样才能在渲染 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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;
    }
    
    ...
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
    
    ...
}
Run Code Online (Sandbox Code Playgroud)

假设我调用该操作inputRegister.action。然后就RegisterAction.input()被调用了。属性已设置。结果SUCCESSregister.jsp被渲染。

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

渲染的 Jsp 页面

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

Rom*_*n C 1

视图的概念用于执行任意数量的操作,并且任何操作都可以有任意数量的结果。结果用于返回视图。返回视图的操作放置在 的顶部,ValueStack以便通过评估 OGNL 表达式轻松访问。结果视图可以映射到任何操作类中的任何操作。它对调用它的操作一无所知,但它可以再次使用 OGNL 来确定它。您可以将操作映射到同一操作类的不同方法,因此不需要有很多input()方法。

编辑:

你的问题是你的有界表单字段错误。每个表单应该有一个单独的存储以正确显示它。字段受名称限制,您最好有一个用于搜索条件变量的表单 bean,并将其放在操作上下文中的某个位置。

<s:form action="executeSearch">
    <s:textfield key="searchBean.name" label="Name"/>
    <s:textfield key="searchbean.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> 
Run Code Online (Sandbox Code Playgroud)

注意:该key属性生成namelabelvalue

每个操作都需要初始化 a searchBean,除非它具有会话范围。如果你将一个 bean 放入会话中,那么你应该使用#session.前缀。您可以在文档页面上找到有关OGNL的更多信息。