【问题标题】:Struts 2 Action not getting calledStruts 2 Action没有被调用
【发布时间】:2017-03-23 22:54:46
【问题描述】:

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

这是我的拦截器的 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>

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

【问题讨论】:

  • 你给的代码还不够给你思路,只能猜,永远解决不了。

标签: validation jsp configuration struts2 freemarker


【解决方案1】:

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

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

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

转换错误和字段验证错误在 FieldErrors 映射中携带错误消息,而不是在 ActionErrors 映射中(您可能会在页面顶部打印&lt;s:actionerror /&gt; 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. 或手动将&lt;s:fielderror/&gt; tags 附加到您的字段:

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

【讨论】:

  • 现在尝试第二个建议后,我看到 item.prevOrdNum 消息的无效字段值。它起源于尝试将其转换为 Integer 时,因为当我将字段类型更改为 String 时,它就消失了。但它不是源于提交之前发生的表单验证,因为我删除了它并且它仍然发生。我对此字段没有任何 @Column(nullable=false) 注释,所以我不知道何时以及为什么会发生这种情况。
  • 我会接受这个作为答案,因为它符合问题的原始范围,并指示我看看哪里出了问题才能找到解决方案。我的服务器端变量是Integer,所以这不是问题。最终我通过将字段更改为 String 并添加验证以确保输入是数字来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多