最近在使用的struts2做个小案例时 出现了这个错误啊,控制台提示Could not find action or result,下面是报出的具体细节,我搜索了很多的相关的资料,终于找到了我的错误原因。
下面是控制台输出的异常
2017-07-18 11:07:17,478 [org.apache.struts2.dispatcher.Dispatcher]-[WARN] Could not find action or result
No result defined for action action.OrderAction and result input
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:375)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol AbstractConnectionHandler.process(AbstractProtocol.java:589)atorg.apache.tomcat.util.net.AprEndpoint SocketProcessor.run(AprEndpoint.java:1852)
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:724)
我的JSP代码片段如下:
<form action="order" method="post" enctype = "multipart/form-data>
<input type="hidden" name="op" value="doAdd" />
<table class="input_table" border="0" cellPadding="3" cellSpacing="0">
<tr>
<td class="input_title">订单编号</td>
<td class="input_content">${item.odrId }</td>
<td class="input_title">下单日期</td>
<td class="input_content">${item.odrOrderDate }</td>
</tr>
<tr>
<td class="input_title">客户名称</td>
<td class="input_content">${item.odrCustomerName }</td>
<td class="input_title">送货时间</td>
<td class="input_content">${item.odrDeliverDate }</td>
</tr>
<tr>
<td class="input_title">送货地址</td>
<td class="input_content" colspan="3">${item.odrDeliverAddr }</td>
</tr>
</table>
<table class="data_table" border="0" cellPadding="3" cellSpacing="0">
<tr>
<td class="data_title" style="width:200px;">产品名称</td>
<td class="data_title" style="width:100px;">单价</td>
<td class="data_title" style="width:100px;">数量</td>
<td class="data_title" style="width:100px;">总价</td>
<td class="data_title">操作</td>
</tr>
<s:iterator value="item.saleOrderLines" id="pl">
<tr>
<td class="data_cell">${odlProductName }</td>
<td class="data_cell" style="text-align:right;">${odlProductPrice }</td>
<td class="data_cell" style="text-align:right;">${odlProductCount }</td>
<td class="data_cell" style="text-align:right;">${odlProductPrice * odlProductCount }</td>
<td class="data_cell"><button disabled="disabled">删除</button></td>
</tr>
</s:iterator>
<tr>
<td class="data_cell">
<input type="hidden" name="line.saleOrder.odrId" value="${item.odrId }" />
<s:select name="line.odlProductName" onchange="javascript:setProdPrice(this);" list="prodList" listKey="prodName" listValue="prodName" headerKey="1" headerValue="请选择..." theme="simple">
</s:select>
</td>
<td class="data_cell"><input type="text" name="line.odlProductPrice" readonly="true" size="15" /></td>
<td class="data_cell"><input type="text" name="line.odlProductCount" value="0" onblur="setTotal();" size="15" /></td>
<td class="data_cell"><input type="text" name="total" readonly="readonly" value="0" size="15" /></td>
<td class="data_cell"><button onclick="javascript:doAddDetail();">保存订单行</button></td>
</tr>
</table>
</form>
我的action的代码如下:
public String toAddDetail()
throws ServletException{
ActionContext ac=ActionContext.getContext();
// ActionForward af = null;
//根据id加载SaleOrder
//String id = (String) ac.get("id");
Long orderId = Long.parseLong("30");
SaleOrder item = this.orderService.getWithLines(orderId);
//保存到Form中
// OrderForm myForm = (OrderForm)form;
// myForm.setItem(item);
//产品下拉列表
List prodList = this.productService.getAll();
ac.put("prodList", prodList);
//转发到视图
String ref=INPUT;
// af = mapping.findForward("detail_add");
return ref;//返回input
}
struts.xml的配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="order" extends="struts-default">
<action name="order" class="action.OrderAction"
method="toAdd">
<result name="success">/WEB-INF/jsp/order/add.jsp</result>
<result name="input">/WEB-INF/jsp/order/detail_add.jsp</result>
<result name="addDetail" type="redirect">/order!toAddDetail.action</result>
</action>
</package>
</struts>
出现这个错误之后我分别对jsp页面,action代码和struts.xml进行了检验。
首先我查看了jsp中的form表单中的代码,确认form表单的action和struts.xml中的action相对应。
第二 检查struts.xml中的result和action类中的返回值是否一样,进行统一的编写。
第三 进行测试,在控制台输出信息,查看出错的地方。
最后发现问题了,form表单的action 可以找到对应的Java类,只是在返回结果的时候出现问题,struts2中没有找到对应的结果页面。
解决的方法: 最后直接删除了Myeclipse Stryts2框架自动导入的Myeclipse Liberaries里的 struts-convention-plugin.jar文件,这个jar保具体的功能可能是更改了默认的返回路径。
![直接删除struts-convention-plugin.jar](https://img-blog.csdn.net/20170718111820642?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM4MTYwNDQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)