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 页面,这并没有错,但仅凭这一点还不足以知道 INPUT
和 SUCCESS
结果已返回。
转换错误和字段验证错误在 FieldErrors 映射中携带错误消息,而不是在 ActionErrors 映射中(您可能用 <s:actionerror />
tag 在页面顶部打印)。
使用默认主题 XHTML
,每个 fieldError
都打印在它所属的字段附近;然而,您已经为标签使用了 simple
主题,因此不会自动打印字段错误。
你有两个选择:
在页面顶部打印所有字段错误:
<style type="text/css">
.error { border: 5px solid red; }
</style>
<@s.if test="hasFieldErrors()">
<div class="error">
<@s.fielderror />
</div>
</@s.if>
或手动将 <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>
我遇到这样一种情况,如果允许编辑项目的表单有一个空字段,则不会调用 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 页面,这并没有错,但仅凭这一点还不足以知道 INPUT
和 SUCCESS
结果已返回。
转换错误和字段验证错误在 FieldErrors 映射中携带错误消息,而不是在 ActionErrors 映射中(您可能用 <s:actionerror />
tag 在页面顶部打印)。
使用默认主题 XHTML
,每个 fieldError
都打印在它所属的字段附近;然而,您已经为标签使用了 simple
主题,因此不会自动打印字段错误。
你有两个选择:
在页面顶部打印所有字段错误:
<style type="text/css"> .error { border: 5px solid red; } </style> <@s.if test="hasFieldErrors()"> <div class="error"> <@s.fielderror /> </div> </@s.if>
或手动将
<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>