Struts2註解錯誤There is no Action mapped for namespace [/].....

異常:

警告: Could not find action or result: /s23s41h43/testAction/test

There is no Action mapped for namespace [/testAction] and action name [test] associated with context path [/s23s41h43]. - [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:239)

 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)

 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)

 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)

 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)

 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)

 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)

 at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)

 at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2381)

 at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2370)

 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

 at java.lang.Thread.run(Thread.java:744)


總結:

我用最新版本的Struts2.3.16.3做註解操作的時候,一直出現這個問題。花了近兩個小時才解決,錯誤原因讓人啼笑皆非……

web.xml類:

<?xml version="1.0" encoding="UTF-8"?> 
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
   id="WebApp_ID" 
   version="3.1"> 
  <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> 
 <display-name>s23s41h43</display-name> 
 <welcome-file-list> 
 <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list> 
</web-app>


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> 
<!-- 請求參數的編碼方式 --> 
<constant name="struts.i18n.encoding" value="UTF-8"/> 
<!-- 該屬性指定Struts 2應用所需要的國際化資源文件,如果有多份國際化資源文件,則多個資源文件的文件名以英文逗號(,)隔開 --> 

<constant name="struts.custom.i18n.resources" value="global" /> 
<!-- 將對象交給spring管理 
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/> --> 
<!-- 設置文件上傳大小,最大不超過xxM --> 
<constant name="struts.multipart.maxSize" value="50485760"/> 
<!-- 開啓使用開發模式,詳細錯誤提示 --> 
<constant name="struts.devMode" value="false" /> 
<!-- 指定每次請求到達,重新加載資源文件 (在開發階段將該屬性設置爲true 會更有利於開發,但在產品發佈階段應將該屬性設置爲false)--> 
<constant name="struts.i18n.reload" value="true" /> 
<!-- 指定每次配置文件更改後,自動重新加載 --> 
<constant name="struts.configuration.xml.reload" value="true" /> 
<!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉 --> 
<constant name="struts.serve.static.browserCache" value="false" /> 
<!-- 非註解寫法 start

<package name="tests" namespace="/testAction" extends="struts-default"> 
<action name="test" class="com.xcfh.test.controller.TestAction" method="test"> 
<result name="success">/success.jsp</result> 
<result name="input">/index.jsp</result> 
</action> 
</package>

end 非註解寫法 --> 

</struts>

Action類:

package com.xcfh.test.action;

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 com.opensymphony.xwork2.ActionSupport;

/**

 * @author PineTree

 * @version 1.0

 * 2014-11-22

 */

@ParentPackage("struts-default")

@Namespace("/testAction")

public class TestAction extends ActionSupport{

 private static final long serialVersionUID = 1;

 

 @Action(value="test", results={

   @Result(name="success", location="/index.jsp"),

   @Result(name="input", location="/success.jsp")

 })

 public String test(){

  try{

   System.out.println("------------------------");

   return "success";

  }catch(Exception e){

   e.printStackTrace();

  }

  System.out.println("++++++++++++++++++++++++++++++++++");

  return "input";

 }

 

 

}


目錄結構:

乍一看,是沒有任何問題的!可是隻要一運行就報錯!在百思不得其解後,突然發現我這個包名建的有點特別,問題就出在這裏!將Action或者把你的com.xxx.controller中的controller換成action就可以了,以下是Struts2的原文文檔:

First the Convention plugin finds packages named struts, struts2, action or actions. Any packages that match those names are considered the root packages for the Convention plugin. Next, the plugin looks at all of the classes in those packages as well as sub-packages and determines if the classes implementcom.opensymphony.xwork2.Action or if their name ends with Action (i.e. FooAction).


注意我標紅的內容,也就是說,如果要用Struts2的註解,你還非得將action處理類放在struts, struts2, action, actions包或者其子包中。以前總是習慣性的將所有的action處理類放在com.xxx.action下,以爲僅僅是習慣而已,沒曾想Struts2還就是這麼規定的。


修改後的目錄:

碰到了同樣的問題,以前確實不知道基於註解的 struts 配置 需要將action類 放在 名字爲 action 的package下。

所用JAR包:

asm-3.3.jar //用註解包必須帶這個包

asm-commons-3.3.jar 

commons-fileupload-1.3.1.jar

commons-io-2.2.jar

commons-lang3-3.1.jar

freemarker-2.3.19.jar

javassist-3.11.0.GA.jar

ognl-3.0.6.jar

struts2-convention-plugin-2.3.16.3.jar  //這是註解包

struts2-core-2.3.16.3.jar

xwork-core-2.3.16.3.jar



發佈了23 篇原創文章 · 獲贊 15 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章