运行: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:
<?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">
<display-name>20161101-struts2-2</display-name> <!-- 配置struts2的Filter -->
<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> </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>
<!-- package:包,struts2使用package来组织模块
name属性:必须,用于被其他包引用当前包
extends:当前包继承哪个包,即可继承父包的所有配置,通常情况下继承struts-default
--> <package name="helloworld" extends="struts-default"> <!-- 配置一个action:一个struts2的请求就是一个action
name:对应一个struts2的请求的名字(对应着servletPath,但去除/和扩展名)
result:结果
-->
<action name="product-input">
<result>/WEB-INF/pages/input.jsp</result>
</action> <action name="product-save" class="com.tt.struts2.helloworld.Product"
method="save">
<result name="details">/WEB-INF/pages/details.jsp</result>
</action> </package> </struts>
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- "product-input.action"就是servletPath -->
<a href="product-input.action">Product Input</a>
</body>
</html>
input.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- "product-save.action"就是servletPath -->
<form action="product-save.action"> ProductName:<input type="text" name="productName"/>
<br><br> ProductDesc:<input type="text" name="productDesc"/>
<br><br> ProductPrice:<input type="text" name="productPrice"/>
<br><br> <input type="submit" value="Submit"/>
<br><br>
</form> </body>
</html>
details.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
ProductId:${productId }
<br><br> ProductName:${productName }
<br><br> ProductDesc:${productDesc }
<br><br> ProductPrice:${productPrice }
<br><br>
</body>
</html>
Product.java:
package com.tt.struts2.helloworld; public class Product {
private Integer productId; private String productName ;
private String productDesc ;
private double productPrice ; public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
} public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
} @Override
public String toString() {
return "Product [productId=" + productId + ", productName=" + productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
} public String save(){ System.out.println("sava: "+this);
return "details";
}
}
原因分析:
猜测应该是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.表单提交页面的错误
比如上面我的错误。