我有一个struts2表单。 在此表单中,要求用户填写几个字段。 其中2个字段是通过从另一个操作中选择一个对象来填充的。
事实上: 主要形式=>取件按钮=>填写新表单的新操作=>返回主窗体并填写相应的字段。
我的问题是,在用户完成子操作后,我想返回主窗体但不会丢失之前填充的所有内容...
我不知道如何处理这个问题,我应该从主窗体传递给每个字段的子作法吗?
答案 0 :(得分:1)
有几种方法可以考虑,取决于因素将决定最适合你的方式。
1)每次发送您想要保留的所有参数。最简单的方法是使用隐藏字段。模型驱动在这里也可能有意义,或者将几个动作放在一个类中,无论是哪种方式都强调这些动作共享一组共同的属性。
2)将值存储在会话中,如Vasily推荐的但是Struts2有范围拦截器......如果你需要这样做,那么值得一看(参见页面上的最后一个例子):http://struts.apache.org/2.3.1.2/docs/scope-interceptor.html但是这样做是有点棘手的,因为如果这是一个办公应用程序,用户就像我一样,我们将在任何给定的时间打开十几个窗口。在这种情况下,您还需要考虑向每个“流程”添加一个令牌(请参阅:struts2 token tag),这会阻止十几个窗口中的一个进行刷新以从我的内容中获取最新数据期望而不是从一些所有行动都使用的全球商店中受到污染。还有一些其他方法来处理流/对话...例如有人写了一个插件,我想它会实现刚才解释的:http://code.google.com/p/struts2-conversation/
总是值得快速浏览一下struts2插件,以确保你没有重新发明轮子,虽然我必须说我不能担保该插件。
3)不要让他们离开页面。这非常光滑......如果你需要选择其他参数,当他们点击“拾取”按钮时,表格会展开所需的字段,然后当他们点击本小节中的“更新”时,它会关闭并更新其余的的领域。您需要在客户端使用JS的组合,通常需要XML或JSON响应。对于您自己的页面,JSON是更简单的方法,可以生成JSON响应,请参阅struts2-json-plugin。
在大多数情况下,我会选择#3。如果我知道动作只会从调用动作中使用和/或我想要一个非常书签安全的形式(如果可能的话,通过GET传递所有参数),那么可能是#1。 #2在更复杂的情况下需要多个动作进行协作,而我出于某种奇怪的原因无法使用ajax。注意#3和#2不是很友好的书签,如果不使用客户端存储,它们通常不是非常友好的状态。
答案 1 :(得分:0)
将主变形存储在会话中。
public class Test extends ActionSupport implements Preparable {
private MainForm form;
public void prepare(){
form = (MainForm)ServletActionContext.getRequest().getSession().getAttribute("mainForm");
if(form == null) {
form = new MainForm();
}
}
public String execute(){
//Do something useful
//Do something useful
//Do something useful
return SUCCESS;
}
public MainForm getForm() {
return form;
}
public void setForm(MainForm form) {
this.form = form;
}
“准备”方法是Preparable interfeice的一部分。每次调用acton时,它将在所有参数读数之前和“执行”方法之前执行。
答案 2 :(得分:0)
您需要以下内容才能拥有一个有效的struts2平台:
然后完成以下过程: