Struts表单提交报Unable to find 'success' forward错误求助
问题根因
直接触发Unable to find 'success' forward警告的核心原因是struts-config.xml配置标签嵌套错误,另外代码里还有两处会引发后续运行异常的隐患:
- 转发配置位置错误:当前
<forward name="success" path="/success.jsp" redirect="true" />写在了<action path="/Hello">标签闭合之后,属于<action-mappings>的直接子节点。Struts的配置规则里,只有写在<action>标签内部的<forward>才会被识别为当前Action的局部转发;跨Action共用的全局转发必须包裹在<global-forwards>标签内才会生效。当前写法下Struts根本没有注册名为success的转发映射,调用findForward("success")自然返回空。 - 表单校验空指针隐患:
FormBackup.java的validate方法直接调用name.equals(""),如果请求里name参数为null,会直接抛出空指针异常,导致校验逻辑崩溃。 - 重定向导致请求值丢失:当前success转发开了
redirect="true",重定向是客户端发起的二次请求,第一次请求里存在request域的res属性会被丢弃,就算转发配置修好了,跳转到success.jsp也只会显示null。
修复步骤
1. 修正struts-config.xml的配置结构
把success的forward配置挪到/Hello对应的action标签内部,同时关闭重定向保证request域的值能正常传递,修正后的action-mappings片段如下:
<action-mappings> <action path="/Hello" name="HF" input="/index.jsp" type="beans.FormController"> <!-- forward必须作为对应action的子节点存在 --> <forward name="success" path="/success.jsp" redirect="false" /> </action> </action-mappings>
如果需要配置全局通用的转发,才需要在action-mappings同级添加<global-forwards>节点包裹forward配置,当前单Action场景不需要。
2. 修复表单校验的空指针问题
修改FormBackup.java里validate方法的判断逻辑,先判空再校验空字符串:
@Override public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) { ActionErrors ae = new ActionErrors(); // 增加null判断,避免空指针 if(name == null || name.trim().isEmpty()){ ae.add("name",new ActionMessage("msg")); } return ae; }
3. (可选)优化Action层的取值逻辑
Struts会自动把表单参数注入到绑定的ActionForm对象里,不需要手动从request.getParameter取值,直接从传入的form对象拿值更稳妥:
@Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { FormBackup formBean = (FormBackup) form; request.setAttribute("res", "Hello..." + formBean.getName()); return mapping.findForward("success"); }
修改完成后重启应用服务器,再提交表单就能正常跳转,控制台不会再出现找不到转发的警告。
内容的提问来源于stack exchange,提问作者suriya
相关产品推荐
相关产品推荐

