使用Struts2插入数据时频繁报错:No result defined for action [] and result input
错误原因分析
No result defined for action [] and result input 错误的核心原因有两个:
- 未配置
input结果映射:Struts2中,当Action继承ActionSupport时,默认会触发服务器端数据校验(包括类型转换校验),如果校验失败,框架会返回input结果,但你的struts.xml中未为AddTaskAction配置该结果的跳转页面。 - 数据校验/类型转换失败:前端表单提交的数据无法正确转换为
Task类的属性类型(比如due_date如果是Date类型,前端输入的文本格式不匹配),或者字段校验不通过,触发了input结果返回,但无对应跳转配置。
解决办法
1. 补充input结果映射
修改struts.xml中AddTaskAction的配置,添加input结果,指向表单页面,让校验失败时回到任务添加页面:
<action name="AddTaskAction" class="actions.AddTaskAction" method="post"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> <result name="input">/addTask.jsp</result> <!-- 新增input结果映射 --> </action>
2. 处理数据类型转换与校验问题
(1)日期字段类型适配
如果Task类的due_date是Date类型,需要确保前端输入的日期格式与后端转换规则一致:
- 在JSP中使用日期输入控件,限制格式为
yyyy-MM-dd:<input type="date" id="due_date" name="t.due_date" required> - 或者在Struts2配置文件中添加全局日期转换器,在
struts.xml的<struts>标签内添加:<constant name="struts.date.format" value="yyyy-MM-dd" />
(2)添加校验错误提示
在addTask.jsp中引入Struts2标签库,并添加错误信息展示区域,让用户知道校验失败的原因:
<%@ taglib prefix="s" uri="/struts-tags" %> <!-- 在表单上方添加错误提示 --> <s:if test="hasActionErrors()"> <div style="color: red; margin-bottom: 10px;"> <s:actionError /> </div> </s:if>
(3)自定义校验逻辑(可选)
如果需要更灵活的校验,在AddTaskAction中重写validate方法,添加自定义校验规则:
@Override public void validate() { if (t.getName() == null || t.getName().trim().isEmpty()) { addFieldError("t.name", "任务名称不能为空"); } // 其他字段校验逻辑,比如日期格式校验等 }
3. 优化Action方法命名(可选)
避免使用post作为Action方法名(容易与HTTP请求方法混淆),建议重命名为addTask,并修改struts.xml的配置:
// AddTaskAction.java中修改方法名 public String addTask() { // 原有业务逻辑不变 }
<!-- struts.xml中修改method属性 --> <action name="AddTaskAction" class="actions.AddTaskAction" method="addTask"> <!-- 结果映射不变 --> </action>
内容的提问来源于stack exchange,提问作者Arjun kireeti Tulasi
相关产品推荐
相关产品推荐

