報錯:HTTP Status 404 - There is no Action mapped for namespace [/] and action name [product-save] associated with context path [/20161101-struts2-2].


運行:index.jsp---->input.jsp----->details.jsp,但是在input.jsp到details.jsp的時候報錯誤。

異常如下:

嚴重: Could not find action or result
/
There is no Action mapped for namespace [/] and action name [] associated with c
ontext path []. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:1
85)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsAct
ionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultA
ctionProxyFactory.java:58)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:534)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOper
ations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilt
er(StrutsPrepareAndExecuteFilter.java:91)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler
.java:1419)
at com.bjhit.eranges.utils.SetCharacterEncodingFilter.doFilter(SetCharacterEnco
dingFilter.java:39)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler
.java:1419)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137
)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java
:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java
:1075)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:
193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:
1009)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135
)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHand
lerCollection.java:255)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.
java:154)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:1
16)
at org.eclipse.jetty.server.Server.handle(Server.java:368)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpCo
nnection.java:489)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpC
onnection.java:942)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplet
e(AbstractHttpConnection.java:1004)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java
:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.
java:628)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.j
ava:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:
608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:5
43)
at java.lang.Thread.run(Thread.java:662)

 

代碼如下:

web.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <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">
 3   <display-name>20161101-struts2-2</display-name>
 4  
 5      <!-- 配置struts2的Filter -->
 6      <filter>
 7         <filter-name>struts2</filter-name>
 8         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 9     </filter>
10 
11     <filter-mapping>
12         <filter-name>struts2</filter-name>
13         <url-pattern>/*</url-pattern>
14     </filter-mapping>
15  
16 </web-app>

struts.xml:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC  3  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  4  "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 
 6 <struts>
 7    <!-- package:包,struts2使用package來組織模塊  8  name屬性:必須,用於被其他包引用當前包  9  extends:當前包繼承哪個包,即可繼承父包的所有配置,通常情況下繼承struts-default 10     -->
11     
12    <package name="helloworld" extends="struts-default">
13    
14          <!-- 配置一個action:一個struts2的請求就是一個action 15  name:對應一個struts2的請求的名字(對應着servletPath,但去除/和擴展名) 16  result:結果 17           -->
18          <action name="product-input">
19               <result>/WEB-INF/pages/input.jsp</result>
20          </action>
21         
22          <action name="product-save" class="com.tt.struts2.helloworld.Product" 
23  method="save">
24               <result name="details">/WEB-INF/pages/details.jsp</result>  
25          </action>   
26          
27    </package>
28  
29 
30 </struts>

index.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2  pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10         <!-- "product-input.action"就是servletPath -->
11         <a href="product-input.action">Product Input</a>
12 </body>
13 </html>

input.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2  pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10           <!-- "product-save.action"就是servletPath -->
11           <form action="product-save.action">
12           
13                 ProductName:<input type="text" name="productName"/>
14                 <br><br>
15                 
16                 ProductDesc:<input type="text" name="productDesc"/>
17                 <br><br>
18                 
19                 ProductPrice:<input type="text" name="productPrice"/>
20                 <br><br>
21                 
22                 <input type="submit" value="Submit"/>
23                 <br><br>
24           </form>
25 
26 </body>
27 </html>

details.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2  pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10  ProductId:${productId } 11                 <br><br>
12                 
13  ProductName:${productName } 14                 <br><br>
15                 
16  ProductDesc:${productDesc } 17                 <br><br>
18                 
19  ProductPrice:${productPrice } 20                 <br><br>
21 </body>
22 </html>

Product.java:

 1 package com.tt.struts2.helloworld;  2 
 3 public class Product {  4     private Integer productId;  5     
 6     private String productName ;  7     private String productDesc ;  8     private double productPrice ;  9     
10     public String getProductName() { 11         return productName; 12  } 13     public void setProductName(String productName) { 14         this.productName = productName; 15  } 16     public String getProductDesc() { 17         return productDesc; 18  } 19     public void setProductDesc(String productDesc) { 20         this.productDesc = productDesc; 21  } 22     public double getProductPrice() { 23         return productPrice; 24  } 25     public void setProductPrice(double productPrice) { 26         this.productPrice = productPrice; 27  } 28     
29     public Integer getProductId() { 30         return productId; 31  } 32     public void setProductId(Integer productId) { 33         this.productId = productId; 34  } 35     
36     
37  @Override 38     public String toString() { 39         return "Product [productId=" + productId + ", productName=" + productName + ", productDesc=" + productDesc 40                 + ", productPrice=" + productPrice + "]"; 41  } 42     
43     public String save(){ 44         
45         System.out.println("sava: "+this); 46         return "details"; 47  } 48 }

 

原因分析:

猜測應該是struts.xml的問題,但是第一個product-input的action都可以正常跳轉(index.jsp---->input.jsp),為什么第二個product-save(input.jsp----->details.jsp)的action無法正常呢?

二者唯一的區別就是第二個action明確指定需要利用反射調用Product類里的save( )方法。但save方法沒問題,最后懷疑表單提交上的問題。

仔細看input.jsp頁面,發現input.jsp里的form表單的提交方式沒有設置method(注意:html提交表單的方式默認為get)。

 

 

解決辦法:將input.jsp里的form添加method="post"問題就解決了。

那么get請求和post請求有何區別呢?見http://www.cnblogs.com/TTTTT/p/6650117.html

 

在網上查找的這個報錯的常見原因如下:

1.struts.xml文件錯誤。

    這種錯誤又分為以下幾種:

    1)struts.xml里配置action的class時,全類名要寫正確。

    2)struts.xml文件名錯誤。一定要注意拼寫問題;

    3)struts.xml文件放置路徑錯誤。一定要將此文件放置在src目錄下。編譯成功后,要確認是否編譯到classes目錄中;

    4)struts.xml文件內容錯誤:啟動頁面一定要是自己工程里有的jsp文件。

     <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
     </welcome-file-list>

    如果你在Eclipse工程的WebContent文件夾下沒有這個index.jsp文件,也會報同樣的錯誤。
    比如我自己定義了一個login.jsp文件,放在WebContent文件夾下,就寫成
    <welcome-file>login.jsp</welcome-file> 
    把login.jsp文件放在WEB-INF下自定義的jsp文件夾下,就寫成
    <welcome-file>/WEB-INF/jsp/login.jsp</welcome-file>

2.表單提交頁面的錯誤

   比如上面我的錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM