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和使用表单域验证的时间。