我正在使用 Hibernate、Struts 2 和 Spring 开发一个项目,但我的问题出在 Struts 上。
我创建了 3 个扩展 ActionSupport
的类并正在实现ModelDriven
对于所有这些中的同一类。我已经实现了一些在调用操作时执行的方法。
类的结构如下
Class1Action.java:
public class Class1Action extends ActionSupport implements ModelDriven<ModelDrivenClass> {
private ModelDrivenClass modelDrivenClass;
// getter and setter for modelDrivenClass
public String methodName() {
System.out.println("Entrou!");
return SUCCESS;
}
@Override
public Sensor getModel() {
return getSensor();
}
}
在 struts.xml
我使用下一个结构创建了 3 个操作
struts.xml:
<action name="actionName1" method="methodName" class="Class1Action">
<interceptor-ref name="validation">
<param name="excludeMethods">methodName</param>
</interceptor-ref>
<result name="success" >success.jsp</result>
<result name="input" >input.jsp</result>
</action>
此外,我有一个 JSP,其中有 3 个按钮引用不同的 Struts 操作,还有几个字段表示 3 个操作类中使用的模型驱动类的字段,以及 <s:push>
内的所有字段。标签。
问题是当我填充字段时,单击任何按钮后,字段中的数据丢失。
我尝试删除从验证中排除方法的 3 条 Struts 行,但字段不是空的,而是在我第二次按下同一按钮时,他返回一个输入并重定向到 input.jsp。
下一个代码来自success.jsp
,即起始页:
成功.jsp:
<form method="post" >
<s:push value="modelDrivenClass">
<s:textfield label="FieldLabel1" name="modelDrivenClassAttribute1" />
<s:textfield label="FieldLabel2" name="modelDrivenClassAttribute2" />
<s:textfield label="FieldLabel3" name="modelDrivenClassAttribute3" />
<s:textfield label="FieldLabel4" name="modelDrivenClassAttribute4" />
<s:textfield label="FieldLabel5" name="modelDrivenClassAttribute5" />
</s:push>
<s:submit action="actionName1" name="Submit1" value="Submit1" />
<s:submit action="actionName2" name="Submit2" value="Submit2" />
<s:submit action="actionName3" name="Submit3" value="Submit3" />
</form>
我不知道这是否是正确的方法,但当我只使用一个实现 ModelDriven
的类时,我就让它工作了。这个类拥有所有 3 个方法。
我只是尝试这种方式,因为我想让我的代码清晰,并且不要只在一个类中包含所有方法。
最佳答案
如果您要将旧的 Struts 代码迁移到新代码,使用 ModelDriven
操作类的方法非常有用,因此它简化了 FormBean
的概念。
在较新的 Struts 2 中,如果您可以使用 valueStack
的 top
中的操作 bean 以及仅在其名称前面关联的模型,则无需使用 ModelDriven
。
注意:当覆盖操作配置中的拦截器配置时,defaultStack
会消失。因此,最好创建自己的堆栈或至少引用 basicStack
以确保调用必要的拦截器。在你的情况下 modelDriven
interceptor .
如果您在堆栈上使用此拦截器,它会将模型推送到操作前面,因此您无需在结果中s:push
它。
模型对象应初始化为模型类的实例,并由模型的 getter 返回。在验证模型的字段时,还可以考虑使用访问者 validator 。
拥有三个在调用之间共享数据的操作需要使用 Preparable
准备一个模型从 session
填充字段或使用 session 对象引用为字段提供默认值以保存它们。
注意:使用prepare
需要更改拦截器调用的顺序,以便在填充模型之前推送模型。
关于java - 在 Struts 2 中使用 ModelDriven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11758643/