我有一个显示在每个页面上的搜索框。搜索框的 JSP 代码通过图块插入到每个页面中。
搜索框有一个表单和一个操作类SearchAction
它需要为下拉框预加载一些属性。这SearchAction
类有一个input()
方法,它执行此初始化。
一些页面在主区域中也有自己的表单。还有自己的动作类。他们还有一个input()
进行一些预加载的方法。
- 是否可以在同一视图中使用两个操作?
- 每个表单如何访问它自己的操作的属性。
- 我怎样才能在渲染 JSP 之前调用两个操作类的输入方法?
Update:
我添加了一个精简的示例,因为可能不清楚我要做什么。这是一个注册页面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
. Then RegisterAction.input()
叫做。属性已设置。和结果SUCCESS
causes register.jsp
被渲染。
但是我的搜索表单呢?我如何访问搜索操作及其模型。这些都不在ValueStack
当然。我也没有看到调用任何方法的方法SearchAction
为了初始化它的模型。我刻意选择age
参加两个动作类别。在呈现的页面中,您可以看到搜索表单还访问RegisterAction-*.properties
(因为那是在ValueStack
)。但需要访问SearchAction
。它必须显示 20 而不是 10。
我显然做错了。但即使经过大量谷歌搜索,我仍然没有找到正确的方法。