Struts 2 Action没有被调用

时间:2016-11-10 01:29:13

标签: validation jsp configuration struts2 freemarker

我遇到的情况是,如果允许编辑项目的表单具有空字段,则不会调用Struts操作。该页面通过freeMarker模板自定义。调用来到拦截器并成功传递,然后在调用action方法之前被删除。因此,我没有看到任何错误消息,以弄清楚什么是错误的。 如果该字段不为空,则操作将完成,项目将更新。

这是我对拦截器的Struts配置,看起来没问题。

<action name="upDate" method="upDate" class="com.coll.Item">
    <result name="success">jsp/item.jsp</result>
    <result name="input">jsp/item.jsp</result>
</action>

这是Struts.xml中的操作

<tr>        
    <td>Prior Order Number</td>
    <td><@s.textfield name="item.prevOrdNum" id="prevOrdNum" theme="simple"/></td>
</tr>

item.ftl中的字段如下所示

UIViewController

另一个令人费解的因素是,由于这是一个小型的内部应用程序,它多年来一直没有更新,但这个问题几个星期前就开始了。如果我在网页中完全删除该字段,或者我在数据库中为该字段添加了一个值,那么在加载时它不是空的 - 更新将通过。我很感激任何可以解释最新情况的想法。

1 个答案:

答案 0 :(得分:1)

您最有可能以下列情况之一结束:

  • 转换错误,因为您的变量是原始数字,并且您发送的是空值,这是不允许的,或者
  • 验证错误,因为您在某处(validate()方法,XML,注释等...)进行了一些验证,指定该字段不能为空。

In either case, the Workflow interceptor will return an INPUT result,您已经映射到同一个JSP页面,这没有错,但仅凭这一点还不足以知道INPUTSUCCESS之间的哪一个结果已经退回。

转换错误和字段验证错误会在FieldErrors地图中显示错误消息,而不是在ActionErrors地图中(您可能会在页面顶部打印<s:actionerror /> tag)。

使用默认主题XHTML,每个fieldError都会打印在它所属的字段附近;但是,您已使用simple主题作为标记,因此不会自动打印字段错误。

您有两种选择:

  1. 在页面顶部打印所有字段错误:

    <style type="text/css">
        .error { border: 5px solid red; }
    </style>
    
    <@s.if test="hasFieldErrors()">
        <div class="error">
            <@s.fielderror />
        </div>
    </@s.if>
    
  2. 或手动将<s:fielderror/> tags附加到您的字段:

    <tr>        
        <td>Prior Order Number</td>
        <td>
            <@s.textfield name="item.prevOrdNum" id="prevOrdNum" theme="simple"/>
            <@s.fielderror fieldName="item.prevOrdNum" />
        </td>
    </tr>