我的母语不是英语,所以如果我犯了一些习惯上的错误,我很抱歉。我是Struts2的新手。我开发了一个web项目,它包含3个JSP页面、一个部署描述符(web.xml)、一个struts配置文件(struts.xml),其中配置了2个操作(一个名为index的操作和一个名为welcome的操作)和一个实现欢迎操作操作逻辑的类。当我尝试索引操作时,它工作得很好,但如果我在URL中调用欢迎操作(welcome.action),我会得到以下错误
Struts Problem Report
Struts has detected an unhandled exception:
Messages:
No result defined for action actions.WelcomeAction and result success
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
...
现在我给你更多关于项目和环境的信息:
开发环境
- 操作系统:Mac OS X 10.10.3
- JRE: 1.8.0_20
- IDE: NetBeans 7.4
- 应用服务器:GlassFish 4.0
- 服务器位置:localhost:8080
- 上下文路径:/AppStruts2Example
- URL项目:http://localhost:8080/AppStruts2Example/
Web项目开发信息
- Java EE Version: 7
- Struts2 Version: 2.3.15
代码如下
web . xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<!-- Configuration for the default package. -->
<package name="default" extends="struts-default">
<action name="index">
<result>/WelcomeFromIndexAction.jsp</result>
</action>
<action name="welcome" class="actions.WelcomeAction">
<result name="success">/WelcomeFromWelcomeAction.jsp</result>
</action>
</package>
</struts>
actions.WelcomeAction.java
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class WelcomeAction extends ActionSupport{
@Override
public String execute(){
System.out.println("Inside of execute method in WelcomeAction.");
System.out.println("Result: " + SUCCESS);
return SUCCESS;
}
}
<<p> index . jsp/strong> <%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index JSP</title>
</head>
<body>
<h1>Welcome to index.jsp!</h1>
</body>
</html>
WelcomeFromIndexAction.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index Action</title>
</head>
<body>
<h1>Welcome From Index Action</h1>
<br />
<h3>Current Page: WelcomeFromIndexAction.jsp</h3>
</body>
</html>
WelcomeFromWelcomeAction.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Welcome Action</title>
</head>
<body>
<h1>Welcome From Welcome Action</h1>
<br />
<h3>Current Page: WelcomeFromWelcomeAction.jsp</h3>
</body>
</html>
当:
- 我直接编写了浏览器上任意JSP的URL 我调用索引操作,如下所示:/index。action或/index ->都将我重定向到WelcomeFromIndexAction.jsp
项目失败时:
- 我调用欢迎动作,如下所示:/welcome。action或/welcome ->都显示了一个带有Struts问题报告的网页,如上面所述
我认为这可能是GlassFish服务器的问题,所以我在VM上安装了一个Debian,并在那里安装了Tomcat 7。我的下一步是从NetBeans"清洁和构建"部署web应用程序。它生成了一个WAR文件,我将其部署到Tomcat 7中,但我遇到了同样的问题。在这个失望之后,我禁用了Debian VM (Tomcat 7),我回来使用GlassFish 4.0
正如您在WelcomeAction.java中看到的,它在execute方法中有一个println语句。当我在浏览器上调用欢迎操作时,我可以看到Struts有效地调用了该方法,这些行被打印在输出上,并且在调用之后,当Struts2必须处理结果时,然后向我显示错误。这证实了我,Struts2没有找到结果,而不是行动,但我不知道为什么。
我尝试配置过滤器调度程序与旧版本的过滤器(FilterDispatcher/strutsprepareanddexecutefilter)。两者都有同样的问题。我尝试在struts.xml中配置与索引操作完全相同的欢迎操作(实际上是默认的),但也不起作用。只有索引操作运行良好。我尝试了许多方法在struts.xml中配置欢迎动作,但都不起作用。
所以,我在这里,需要有人帮助我。谢谢你的回答。
注意:Stackoverflow不允许我张贴图像,因为我是新的。所以,我上传了一个重要的打印画面到我的dropbox。https://dl.dropboxusercontent.com/u/101502868/NetBeans%20Struts2%20Error.png在这个打印屏幕上,您可以看到添加的库、execute方法的执行、定制的打印行和Struts错误的开始。
谢谢的。
在struts.xml中使用自定义方法在action类中命名为editUser,以便控制直接转到特定方法并相应地处理结果
<action method="editUser" name="editUser" class="com.action.EditUserAction">
<result name="true">/jsp/editUser.jsp</result>
<result name="false">jsp/index.jsp</result>
</action>
在你的类中添加自定义方法而不是重载执行方法
class EditUserAction extendes ActionSupport{
public String editUser(){
String status = "false";
/**
do your buisness logic
*/
return status;
}
}
如果问题仍然存在,那么请仔细检查您的配置
解决此问题的最佳方法是使用Maven创建您的项目并管理您可能需要的所有依赖项。那是对我唯一有效的解决办法。
下面是使用Maven创建Struts 2 Web应用程序的官方指南(非常简单的示例):http://struts.apache.org/docs/create-struts-2-web-application-using-maven-to-manage-artifacts-and-to-build-the-application.html如果你没有安装Maven是OS X,你不知道如何安装它,然后按照下面的步骤安装它:
下载Maven(本例使用Maven 3.3.3。压缩文件名称为:apache-maven-3.3.3-bin.tar.gz): http://maven.apache.org/download.cgi解压缩下载的文件(本例假设下载的文件位于/Users/YourUser/Downloads/)。解包后,将创建一个新目录,其名称和路径与下载的maven文件相同。(在本例中:/Users/YourUser/Downloads/apache-maven-3.3.3/)打开终端使用以下命令将maven目录移动到主目录:
mv ~/Downloads/apache-maven-3.3.3/~/
现在,您必须编辑位于主目录(~/.bash_profile)上的.bash_profile文件。要编辑它,我们将使用vi命令,如下所示:
第六~/. bash_profile
打开后必须按i键编辑
现在你可以编辑这个文件了,所以你必须这样写:
出口JAVA_HOME = $ (/usr/libexec/JAVA_HOME)
出口MAVEN = $ HOME/apache-maven-3.3.3/bin
关闭终端并重新打开。这就是全部,Maven应该已经安装好了。使用以下命令验证Maven是否正常工作:
mvn - version
如果你看到Maven, Java和OS X的信息,你正在使用,这是因为Maven工作正常