Struts 2 –没有为动作和结果输入定义结果
时间:2020-02-23 14:36:05 来源:igfitidea点击:
在Struts 2项目上收到一条奇怪的错误消息"没有为操作和结果输入定义结果(No result defined for action and result input
.)"。
Struts2 –No result defined for action and result input
让我们看一个简单的场景,在该场景中,我们将显示错误消息"没有为操作和结果输入定义结果"。
我的项目有一个简单的JSP页面,如下所示。
login.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <%-- Using Struts2 Tags in JSP --%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Login Page</title> </head> <body> <h3>Welcome User, please login below</h3> <s:form action="login"> <s:textfield name="name" label="User Name"></s:textfield> <s:textfield name="pwd" label="Password" type="password"></s:textfield> <s:submit value="Login"></s:submit> </s:form> </body> </html>
并对应的动作类为:
LoginAction.java
package com.theitroad.struts2.action; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { @Override public String execute(){ //Some complex business logic return SUCCESS; } @Override public void validate(){ if("".equals(getName())){ addFieldError("name", "UserName can't be empty"); } if("".equals(getPwd())){ addFieldError("pwd", "Password can't be empty"); } } //Java Bean to hold the form parameters private String name; private String pwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
我的struts 2配置文件如下所示。
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "https://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.convention.result.path" value="/"></constant> <package name="user" extends="struts-default"> <action name="home"> <result>/login.jsp</result> </action> <action name="login" class="com.theitroad.struts2.action.LoginAction"> <result name="SUCCESS">/welcome.jsp</result> <result name="ERROR">/error.jsp</result> </action> </package> </struts>
一切看起来都很好,当将调用登录操作时,LoginAction将进行处理。
如果成功,将在任何错误的情况下将welcome.jsp作为响应或者error.jsp发送。
但是,每当我尝试调用登录操作而不传递用户名或者密码值时,都会收到404错误和浏览器响应,如下所示:
没有为动作com.theitroad.struts2.action.LoginAction和结果输入定义结果。
在服务器日志中,我得到以下异常堆栈跟踪:
Sep 14, 2013 11:40:25 PM com.opensymphony.xwork2.util.logging.jdk.JdkLogger error SEVERE: Exception occurred during processing request: No result defined for action com.theitroad.struts2.action.LoginAction and result input No result defined for action com.theitroad.struts2.action.LoginAction and result input at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
修复问题
一段时间以来,我一无所知,然后查看了消息,并说"输入没有定义任何结果"。
因此,我修改了我的登录操作,如下所示。
<action name="login" class="com.theitroad.struts2.action.LoginAction"> <result name="SUCCESS">/welcome.jsp</result> <result name="ERROR">/error.jsp</result> <result name="input">/login.jsp</result> </action>
这个简单的更改解决了问题,我得到了Login.jsp页面作为响应,并在LoginAction的validate()方法中设置了错误消息。
原因是,只要验证传递给操作的参数有问题,"输入"就是Struts 2返回的默认结果。
我希望这种快速的解决方案可以节省使用Struts 2和使用表单域验证的时间。