新手,在用spring整合struts2的时候,遇到如下问题,望大神解答:
警告: Could not find action or result: /myframework/strutsAction!test1.action There is no Action mapped for namespace [/] and action name [strutsAction!test1] associated with context path [/myframework]. - [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:554) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744)
这是我的目录结构:
struts.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 指定由spring负责action对象的创建 --> <constant name="struts.objectFactory" value="spring"> </constant> <!-- 所有匹配*.action的请求都由struts2处理 --> <constant name="struts.action.extension" value="action"></constant> <!-- 是否启用开发者模式(开发时设置为true),发布到生产环境后设置为false --> <constant name="struts.devMode" value="true"></constant> <!-- struts配置文件改动后,是否重新加载(开发时设置为true,发布到生产环境后设置为false) --> <constant name="struts.configuration.xml.reload" value="true"></constant> <!-- 设置浏览器是否缓存静态内容(开发时设置为false,发布到生产环境后设置为true) --> <constant name="struts.serve.static.browserCache" value="false"></constant> <!-- 请求参数的编码方式 --> <constant name="struts.i18n.encoding" value="utf-8"></constant> <!-- 每次HTTP请求系统都重新加载资源文件,有助于开发(开发时设置为true,发布到生产环境后设置为false) --> <constant name="struts.i18n.reload" value="true"></constant> <!-- 文件上传最大值 --> <constant name="struts.multipart.maxSize" value="104857600"></constant> <!-- 让struts2支持动态方法调用,使用叹号访问方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- Action名称中时候还是用斜线 --> <constant name="struts.enable.SlashesInActionNames" value="false"></constant> <!-- 允许标签中使用表达式语法 --> <constant name="struts.tag.altSyntax" value="true"></constant> <!-- 对于WebLogic,Orion,OC4J此属性应该设置成true --> <constant name="struts.dispatcher.parametersWorkaround" value="false"></constant> <!-- 这个package,应该是访问的action是从这个包下面去寻找、访问,如果定义了空间名称,则从这个包下面的空间下面去寻找、访问 --> <package name="testStruts" extends="struts-default" ></package> </struts>
action类:
package me.gacl.action; import javax.annotation.Resource; import me.gacl.service.UserService; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.springframework.beans.factory.annotation.Autowired; /** * @Action(value="struts2Test") * 使用convention-plugin插件提供的@Action注解将一个普通java类标注为一个可以处理用户请求的action, * Actiond的名称为struts2Test * @Namespace("/") 定义action的命名空间 * */ @ParentPackage("testStruts") @Action(value="strutsAction") @Namespace("/") public class TestAction { @Resource(name="userServiceImpl") private UserService userService; public void test1(){ System.out.println("进入strutsAction"); userService.test(); } }
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>myframework</display-name> <!--1、 配置spring监听器。 这个listener-class可以在jar包里面找到 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--2、 配置spring上下文环境;即 spring启动加载项(即配置文件位置),这个由spring监听器读取加载 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring.xml</param-value> </context-param> <!--1、配置 struts2 核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>classpath:struts.xml,struts-default.xml</param-value> </init-param> </filter> <!--2、 配置 struts2 拦截器 --> <filter-mapping> <filter-name>struts2</filter-name> <!-- 只有以.action结尾的请求才能访问 --> <url-pattern>*.action</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
我在网页上输入的URL是:
http://localhost:8080/myframework/strutsAction!test1.action
然后就出现了这个异常,一直搞不懂。求知道的大哥大姐解答一下。谢谢!!
暂时不明白,但悟道了点什么,既然没人回答,我就先撤吧
解决后的出现问题的原因是什么呢?
@guodaxia:
对比web.xml 原本的代码看看,我把<init-param> 标签删掉了。就可以了。
其实,我看了struts2+spring+hibernate 框架整合的一本书。但是,在struts2中没有看到有初始化参数什么的,我也看过其它项目的框架,也没有这方面的配置。
刚才我也把它加回去看了下,但是加上去之后,就会出现这个问题。故,目前我还搞不懂为什么,只能了解为暂不能初始化参数吧。
@南小鸟: 有心思的话你可以看一下struts2的源码,如果是你说的那样的话,可能config在struts2核心控制器内起到了很大的作用,可能读取的就是配置文件。而struts2的配置文件应该不止是struts.xml和struts-default.xml.可以使用断点先不加初始化参数看看过滤器中config的值再和你的config参数的值加了之后过滤器中的值比较。
public void test1(){ System.out.println("进入strutsAction"); userService.test(); }
你的这段代码,你可以看下控制台有没有输出,这个404的话:
Could not find action or result: /myframework/strutsAction!test1.action There is no Action mapped for namespace [/] and action name [strutsAction!test1] associated with context path [/myframework]. - [unknown location]
要么是没有找到你的action进入方法所以找不到action报的404,要么就是进入了该方法没有对应的result页面,所以你404.估计是没有对应的result页面吧
控制台没有输出什么内容;
嗯,是的;没有result页面,但是我不需要返回什么页面,所以我没写;好像不一定非要有页面的吧?我不想有什么页面,也要返回么?
好吧,我修改如下面所示,还是报错...我把那个strut2.xml改为 strtus.xml了,把它扔到src目录下了。
package me.gacl.action; import javax.annotation.Resource; import me.gacl.service.UserService; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.springframework.beans.factory.annotation.Autowired; /** * @Action(value="struts2Test") * 使用convention-plugin插件提供的@Action注解将一个普通java类标注为一个可以处理用户请求的action, * Actiond的名称为struts2Test * @Namespace("/") 定义action的命名空间 * */ @ParentPackage("testStruts") @Action( value="strutsAction", results={ @Result(name="error",location="/index.jsp",type="redirect"), @Result(name="success",location="/index.jsp",type="redirect") } ) @Namespace("/") public class TestAction { @Resource(name="userServiceImpl") private UserService userService; public void test1(){ System.out.println("进入strutsAction"); userService.test(); } }
还是一样的异常...
test1()方法,打少了return "success"; 不过还是一样的异常..
action