java - 在 Struts 2 中使用 ModelDriven

标签 java jsp struts model-driven struts-action

我正在使用 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 中,如果您可以使用 valueStacktop 中的操作 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/

相关文章:

java - 运行刽子手的程序中的逻辑出错 (Java)

java - 如何为抽象类创建 Junit 测试?

javascript - JSP中如何将多个脚本合并为一个脚本?

mysql - 如何在创建查询中将变量设置为表名

java - 处理 java.lang.NoSuchMethodError 的建议

struts Action 类和业务服务层

java - 执行缓慢并且耗尽堆空间(即使 vm args 设置为 2g)

java - CLOB 到二进制流的转换

java - 我们如何将 "plus"符号放入 html 表单中?

java - 在 Tomcat 中取消请求