Struts 2:没有为命名空间映射的操作
我是Struts 2的新手,我一直在关注Struts 2(Koushik)的video教程。 我已经创build了与本教程中创build的相同的Struts.xml,动作类和JSP。 但它给出了以下例外。
例外:
Jan 13, 2014 9:30:48 PM org.apache.struts2.dispatcher.Dispatcher warn WARNING: Could not find action or result: /Struts2Starter/getTutorial.action There is no Action mapped for namespace [/] and action name [getTutorial] associated with context path [/Struts2Starter]. - [unknown location] at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185) at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63) at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37) at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:552) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
在struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="getTutorial" class="org.koushik.javabrains.action.TutorialAction"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
在web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts2Starter</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <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> </web-app>
TutorialAction.java(我正在使用的Action类)
package org.koushik.javabrains.action; public class TutorialAction { public String execute(){ System.out.println("Hello from execute"); return "success"; } }
项目结构
success.jsp和error.jsp是正常的一些文本的jsp文件。 我做了很多事情来解决这个问题,谷歌search。 但没有什么不能解决这个问题。 请让我知道,如果有人知道这是什么。 我非常感谢。 🙂
将Struts.xml
命名约定重命名为struts.xml
将会起作用。
来自错误的消息清楚地表明这一点
没有与上下文path[/ Struts2Starter]关联的名称空间[/]和动作名称[getTutorial]映射的操作
这意味着操作configuration在运行时不可用。 查看config-browser插件来debuggingconfiguration问题。
要正确地将url映射到操作,需要两个参数:操作名称和命名空间。
Struts在启动时加载xmlconfiguration,它应该知道struts.xml
的位置。 默认情况下,它在类path上查找名称类似struts.xml
的文件。 然后它parsing文档并创build一个运行时configuration。 该configuration用于为动作urlfind适当的configuration元素。 如果在请求期间没有find这样的元素,404错误代码将返回消息: There is no Action mapped for namespace and action name
。
此消息还包含用于查找操作configuration的名称空间和操作名称。 然后你可以在struts.xml
检查你的configuration设置。 有时存储在ActionMapping
的动作名称和命名空间指向错误的动作。 这些值由ActionMapper
确定,它可以有不同的实现,被插件使用。
还有另一个可能会影响这个映射器和映射的设置,但是如果你得到这个消息,那么这个点是一样的,那么在运行时configuration中使用的URL不会映射任何动作configuration。 如果你不知道你应该使用哪个URL,你可以尝试使用config-browser插件来查看可用的URL列表。
改变你的Struts.xml
并把Struts.xml
<constant name="struts.devMode" value="true" />
Development mode or devMode
它启用额外的debugging,并帮助debugging下面的代码尝试
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="getTutorial" class="org.koushik.javabrains.action.TutorialAction"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
ü只需要检查的行动名称是不变的无处不在…我也有同样的问题,我通过删除命名空间解决,因为它是没有必要的,我看到你没有提到,也有不同的动作名称loginpage.jsp和支柱。 XML页面..所以只是看到你的行动名称
您的JSP文件不应位于WEB-INF文件夹下,而应位于Web文件夹下。 我附上了一张图片来向您展示正确的层次结构。
文件夹系统
我只是做了教程,并有同样的问题。 原来问题是struts.xml文件位于错误的位置。 确保你的struts.xml文件位于:/Struts2Starter/src/struts.xml