我有一个搜索框,它显示在每一页上。搜索框的 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;
}
...
}
假设我调用了 action inputRegister.action
。然后RegisterAction.input()
被调用。属性已设置。结果SUCCESS
导致register.jsp
被渲染。
但是我的搜索表单呢?如何访问搜索操作及其模型。当然,这些都不是ValueStack
。而且我也没有看到调用任何方法SearchAction
来初始化它的模型的方法。我故意选择age
参加这两个动作课程。在呈现的页面中,您可以看到搜索表单也访问RegisterAction-*.properties
(因为它位于 顶部ValueStack
)。但它需要访问SearchAction
. 它必须显示 20 而不是 10。
我显然做错了。但即使经过大量的谷歌搜索,我仍然没有找到正确的方法。