Struts 2 个操作未被调用

Struts 2 Action not getting called

我遇到这样一种情况,如果允许编辑项目的表单有一个空字段,则不会调用 Struts 操作。通过 freeMarker 模板自定义的页面。调用到达拦截器并成功通过,然后在调用操作方法之前被丢弃。因此,我没有看到任何错误消息来弄清楚出了什么问题。 如果该字段不为空,则操作完成并更新项目。

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

<interceptors>
    <interceptor name="loginInterceptor" class="login.interceptor.LoginInterceptor" />      
    <interceptor-stack   name="appStack">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="loginInterceptor"/>
    </interceptor-stack>
</interceptors>
<default-interceptor-ref name="appStack" />

这是 Struts.xml

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

item.ftl 中的字段如下所示

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

另一个令人费解的因素是,由于这是一个小型内部应用程序,因此多年未更新,但这个问题是几周前开始的。如果我在网页中完全删除了该字段,或者如果我在数据库中为该字段设置了一个值,以便在加载时它不为空 - 更新就会完成。如果有任何想法可以解释发生了什么,我将不胜感激。

您很可能会遇到以下情况之一:

  • 一个转换错误,因为你的变量是一个原始数字,而你发送的是一个空值,这是不允许的,或者
  • a 验证错误,因为你在某处进行了一些验证(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>