首页 新闻 搜索 专区 学院

[SS整合] 遇到问题:Could not find action or result

0
[已解决问题] 解决于 2016-11-29 17:06

新手,在用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

 

然后就出现了这个异常,一直搞不懂。求知道的大哥大姐解答一下。谢谢!!

南小鸟的主页 南小鸟 | 小虾三级 | 园豆:532
提问于:2016-11-17 17:20
< >
分享
最佳答案
0

暂时不明白,但悟道了点什么,既然没人回答,我就先撤吧

南小鸟 | 小虾三级 |园豆:532 | 2016-11-29 17:06

解决后的出现问题的原因是什么呢?

guodaxia | 园豆:87 (初学一级) | 2016-11-29 17:28

@guodaxia: 

对比web.xml 原本的代码看看,我把<init-param>  标签删掉了。就可以了。

其实,我看了struts2+spring+hibernate 框架整合的一本书。但是,在struts2中没有看到有初始化参数什么的,我也看过其它项目的框架,也没有这方面的配置。

刚才我也把它加回去看了下,但是加上去之后,就会出现这个问题。故,目前我还搞不懂为什么,只能了解为暂不能初始化参数吧。

 

 

 

南小鸟 | 园豆:532 (小虾三级) | 2016-11-29 17:48

@南小鸟: 有心思的话你可以看一下struts2的源码,如果是你说的那样的话,可能config在struts2核心控制器内起到了很大的作用,可能读取的就是配置文件。而struts2的配置文件应该不止是struts.xml和struts-default.xml.可以使用断点先不加初始化参数看看过滤器中config的值再和你的config参数的值加了之后过滤器中的值比较。

guodaxia | 园豆:87 (初学一级) | 2016-11-30 09:21
其他回答(2)
0

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页面吧

guodaxia | 园豆:87 (初学一级) | 2016-11-17 19:49

控制台没有输出什么内容;

嗯,是的;没有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();
    }

}

还是一样的异常...

支持(0) 反对(0) 南小鸟 | 园豆:532 (小虾三级) | 2016-11-18 09:21

test1()方法,打少了return "success";   不过还是一样的异常..

支持(0) 反对(0) 南小鸟 | 园豆:532 (小虾三级) | 2016-11-18 09:32
0

action

世事浮云 | 园豆:202 (菜鸟二级) | 2017-11-24 00:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册