我有一个搜索框,显示在每个页面上.搜索框的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标记可以读取搜索表单启动的数据.您可以根据需要考虑一下,在您的所有操作中剪切和粘贴搜索动作的主体!