運行: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.表單提交頁面的錯誤
比如上面我的錯誤。