【问题标题】:Using ModelDriven in Struts 2在 Struts 2 中使用 ModelDriven
【发布时间】:2012-07-30 07:31:27
【问题描述】:

我正在使用 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 个动作类中使用的模型驱动类的字段,以及 &lt;s:push&gt; 标记内的所有字段。

问题是当我填充字段时,单击任何按钮后,字段中的数据都丢失了。

我试图删除从验证中排除方法的 3 条 Struts 行,但不是字段为空,而是在我第二次按下同一个按钮时,他返回一个输入并重定向到 input.jsp。

下一个代码来自success.jsp,即起始页:

success.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 种方法时,我让它工作了。

我只是在尝试这种方式,因为我想让我的代码清晰,并且不要在一个类中包含所有方法。

【问题讨论】:

    标签: java jsp struts model-driven struts-action


    【解决方案1】:

    如果您要将旧的 Struts 代码迁移到新代码,使用 ModelDriven 操作类的方法非常有用,因此它简化了 FormBean 的概念。

    并且在较新的 Struts 2 中,如果您可以使用来自 top 的动作 bean 和 valueStack 中的动作 bean,则不必使用 ModelDriven 并在其名称前加上模型。

    注意:在操作配置中覆盖拦截器配置时,defaultStack 会消失。因此,最好创建自己的堆栈或至少引用basicStack 以确保调用必要的拦截器。你的情况是modelDriven interceptor

    如果你在堆栈上使用这个拦截器,它会将模型推送到动作前面,所以你不需要在结果中s:push它。

    模型对象应该初始化为模型类的实例,并由模型的getter返回。还可以考虑在验证模型字段时使用访问者验证器。

    要在调用之间共享数据的三个操作需要使用 Preparable 准备模型以填充来自 session 的字段,或使用会话对象引用为字段提供默认值以保存它们。

    注意:使用prepare 需要更改拦截器调用的顺序以在填充模型之前推送模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2018-06-07
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多