当前位置:编程学习 > JAVA >>

【新手请教】SSH+EasyUI项目报错:No result defined for action and result

非计算机专业大学狗自己跳进Java Web的大坑里,正在做一个物流信息管理系统,SSH框架已经搭好了,现在开始整合UI,我用的是easyui。

【问题】
增加订单点击“提交”后,报错:
 Struts has detected an unhandled exception:
Messages: 
No result defined for action zzmis.action.OrderAction and result addSuccess。
但是在后台数据库是能看到已经新增的订单。而且从报错信息也能看到它能运行action里的return "addSuccess"语句。


【代码】
action类:
public class OrderAction extends BaseAction implements ModelDriven<OrderInfo> {

private OrderInfo oi = new OrderInfo();
private OrderService os;
private List<Order> orders;
private Order order;
private JSONArray rows; //这东西得和grid中的参数对应上,返回json对象
private Json result = new Json();   //可以返回给struts.xml的result
private int total=0;      //记录数量
        
        public String addOrder() throws Exception {
System.out.println(oi.getGoodsName());
System.out.println(oi.getOrderId());
Order o = new Order();
//o.setCar(oi.getCar());
o.setCneeName(oi.getCneeName());
o.setCneePhone(oi.getCneePhone());
o.setDeliveryType(oi.getDeliveryType());
o.setDeparture(oi.getDeparture());
o.setDestination(oi.getDestination());
//o.setFinishDate(oi.getFinishDate());
o.setGoodsName(oi.getGoodsName());
o.setGoodsVolume(oi.getGoodsVolume());
o.setGoodsWg(oi.getGoodsWg());
o.setInsuredPrice(oi.getInsuredPrice());
//o.setOrderDate(oi.getOrderDate());
o.setOrderId(oi.getOrderId());

//o.setOrderStatus(oi.getOrderStatus());
//o.setOrderSum(oi.getOrderSum());
o.setPaymentType(oi.getPaymentType());
//o.setUser(oi.getUser());
if (os.exists(o)) {
result.setMsg("操作失败!编号重复!");
return "addFail";
} else {
result.setSuccess(true);
result.setMsg("操作成功!");
os.addOrder(o);
System.out.println(result.getMsg());
return "addSuccess";
}
}        
       //getters 和 setters就省略了


我自己感觉应该是struts的配置出了问题,因为它报错说找不到对应的结果嘛。但奇怪的是另一个action:getOrderList(查看订单)是没出问题的。
struts.xml:

<struts>
<constant name="struts.objectFactory" value="spring"></constant>
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="GBK"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

<package name="zzmis" namespace="/" extends="json-default">
<action name="orderAction" class="zzmis.action.OrderAction" method="addOrder">
<result name="addSuccess" type="json" >
<param name="root">result</param>
</result>
<result name="addFail" type="json">
<param name="root">result</param>
</result>
</action>
<action name="orderAction" class="zzmis.action.OrderAction" method="getOrderList">
<result name="list" type="json">
<param name="root">rows</param>
</result>
</action>
</package>
</struts>


JSP页面:
javascript:(我的目的是增加订单后能弹出个对话框告诉用户操作成功还是失败,因为我对javascript不熟悉,不知这样写ok不?)

<script type="text/javascript">
    $.ajax({cache:false,  
        type:"post",  
        dataTyp:"json",  
        url:"${pageContext.request.contextPath}/orderAction!getOrderList.action",  
        success:function(data) {
         var obj = $.parseJSON(data); //解析JSON
         var info = obj.result;    
            alert(info); 
        }     
    });       
</script>

提交订单的表单:

<form id="orderonline_addorder" method="post"  action="orderAction!addOrder.action">
        <table width="700">
        <tr>
         <td><h3>货物信息 </h3></td>
</tr>
<tr>
         <div>  
                <td><label for="orderId">订单编号:</label></td>  
                <td><input class="easyui-validatebox" type="text" name="orderId" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
</tr>
        <tr>
            <div>  
                <td><label for="goodsName">货物名称:</label></td>  
                <td><input class="easyui-validatebox" type="text" name="goodsName" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
        
            <div>  
                <td><label for="goodsWg">货物重量(kg):</label></td>  
                <td><input class="easyui-validatebox" type="text" name="goodsWg" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div> 
        </tr> 
        <tr>
            <div>  
                <td><label for="goodsVolume">货物体积(立方米):</label></td>
                <td><input class="easyui-validatebox" type="text" name="goodsVolume" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
       
            <div>  
                <td><label for="insuredPrice">保价金额(元):</label></td>  
                <td><input class="easyui-validatebox" type="text" name="insuredPrice" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
       </tr>  
       <tr><td> </td></tr>
       <tr>
         <td><h3>运输信息 </h3></td>
</tr>

       <tr>
            <div>  
                <td><label for="departure">发货地址:</label></td>  
                <td><input class="easyui-validatebox" type="text" name="departure" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
        
            <div>  
                <td><label for="destination">收货地址:</label></td>  
                <td><input class="easyui-validatebox" type="text" name="destination" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div> 
        </tr> 
        <tr>
            <div>  
                <td><label for="cneeName">收货人:</label></td>
                <td><input class="easyui-validatebox" type="text" name="cneeName" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
        
            <div>  
                <td><label for="cneePhone">收货人手机:</label></td>  
                <td><input class="easyui-validatebox" type="text" name="cneePhone" data-options="required:true,missingMessage:'此处为必填项'"></input></td>  
            </div>
       </tr>       
       <tr>
            <div>  
                <td><label for="deliveryType">运输方式:</label></td>  
                <td><select id="orderonline_deliveryType"  name="deliveryType" style="width:200px;" data-options="required:true">
                 <option value="精准卡航">精准卡航</option>
<option value="精准水运">精准水运</option>
<option value="精准空运">精准空运</option>
</select>
                </td>                  
            </div>
        </tr>
        <tr><td> </td></tr>
        <tr>
         <td><h3>其他信息 </h3></td>
</tr>
           
        <tr>
            <div>  
                <td><label for="paymentType">付款方式:</label></td>  
                <td><select id="orderonline_paymentType"  name="paymentType" style="width:200px;" data-options="required:true">
                 <option value="网上支付">网上支付</option>
<option value="现金支付">现金支付</option>
</select>
                </td>  
            </div>
        </tr>         
      <tr><td> </td></tr>
       <tr> 
            <div>  
                <td></td>
                <td><input type="submit" value="下单" ></td>
                <td><input type="reset" value="清空"></td>  
            </div>
       </tr> 
            </table>  
        </form>  

请各位看看到底是什么问题,在线等!3Q JSON javascript STRUTS --------------------编程问答-------------------- 自挽,希望尽快有大神解答。 --------------------编程问答-------------------- 怎么看你写的js别扭啊。。。尤其是那个url,为什么这么写,直接用easyui中的表单提交就行了啊。。。
$('#Form').form('submit',{
url:'${ctx}/json/saveBed.action?bed.endemicId='+node.id,
     success: function(data){
       
     }
});
按这个来写就行,另外你那个form表单中的url就不需要了,直接去掉。。。 --------------------编程问答--------------------
引用 2 楼 hjw506848887 的回复:
怎么看你写的js别扭啊。。。尤其是那个url,为什么这么写,直接用easyui中的表单提交就行了啊。。。
$('#Form').form('submit',{
url:'${ctx}/json/saveBed.action?bed.endemicId='+node.id,
     success: function(data){
       
     }
});
按这个来写就行,另外你那个form表单中的url就不需要了,直接去掉。。。


还是不行,把form的action url去掉后根本提交不到给action。 --------------------编程问答--------------------
引用 3 楼 insonjump 的回复:
Quote: 引用 2 楼 hjw506848887 的回复:

怎么看你写的js别扭啊。。。尤其是那个url,为什么这么写,直接用easyui中的表单提交就行了啊。。。
$('#Form').form('submit',{
url:'${ctx}/json/saveBed.action?bed.endemicId='+node.id,
     success: function(data){
       
     }
});
按这个来写就行,另外你那个form表单中的url就不需要了,直接去掉。。。


还是不行,把form的action url去掉后根本提交不到给action。
orderAction!getOrderList.action,url为什么这么写,直接写对应的action加上参数不就行了么?
--------------------编程问答--------------------  dataTyp:"json",   少个e --------------------编程问答--------------------
引用 5 楼 rui888 的回复:
 dataTyp:"json",   少个e
的确少了,我加上了还是不行。现在问题我觉得是action是执行完了(报错都出现“addSuccess”了),但是执行完之后它不知道要返回什么。



引用 4 楼 hjw506848887 的回复:
Quote: 引用 3 楼 insonjump 的回复:

Quote: 引用 2 楼 hjw506848887 的回复:

怎么看你写的js别扭啊。。。尤其是那个url,为什么这么写,直接用easyui中的表单提交就行了啊。。。
$('#Form').form('submit',{
url:'${ctx}/json/saveBed.action?bed.endemicId='+node.id,
     success: function(data){
       
     }
});
按这个来写就行,另外你那个form表单中的url就不需要了,直接去掉。。。


还是不行,把form的action url去掉后根本提交不到给action。
orderAction!getOrderList.action,url为什么这么写,直接写对应的action加上参数不就行了么?

我OrderAction里共两个方法,一个添加订单addOrder,另一个查看订单getOrderList,所以要用通配符阿(PS:源代码那里应该是orderAction!addOrder.action,因为这里是添加订单而不是查看),我用form的submit就能提交过去了,不需要加参数了。而且现在不是action接收不到参数的问题,后台数据库都能添加数据的,只是返回出错了。 --------------------编程问答-------------------- 你的 Json result  这个Json是第三方的还是自己写的,确认你返回的和你配置的一样是json格式的数据。 --------------------编程问答-------------------- 这个错误是struts报出来的,就应该去后台找原因。

应该是result配置错了。

应该这样配置:

<result name="addSuccess">/success.jsp</result>

后台实现输出json方法有两个:
方法1:把json数据放在request里面,然后在jsp里面打出来。

方法2:不要写result了,直接用resopnse输出到页面。

不过这年代了,还在费劲写XML。。。换annotation啦。。。
--------------------编程问答--------------------
引用 7 楼 rui888 的回复:
你的 Json result  这个Json是第三方的还是自己写的,确认你返回的和你配置的一样是json格式的数据。
那个Json是我自己写的,后来我改成了第三方(fastjson)的JSONObject(查看订单我返回的是fastjson的JSONArray,那个没有问题,所以我就改用fastjson的),但是还是不行。

这是我改动后的:
public class OrderAction extends BaseAction implements ModelDriven<OrderInfo> {

private OrderInfo oi = new OrderInfo();
private OrderService os;
private List<Order> orders;
private Order order;
private JSONArray rows; //这东西得和grid中的参数对应上,返回json对象,不是返回json串  
private JSONObject result;   //可以返回给struts.xml的result
private int total=0;      //记录数量

//添加order
public String addOrder() throws Exception {
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("application/json");
Order o = new Order();
//o.setCar(oi.getCar())……省略

Json r=new Json();

if (os.exists(o)) {
r.setMsg("操作失败!编码重复");
result=(JSONObject) JSONObject.toJSON(r);
} else {
os.addOrder(o);
r.setSuccess(true);
r.setMsg("操作成功!");
result=(JSONObject) JSONObject.toJSON(r);
}
return "add";
}


--------------------编程问答-------------------- 这里有几种方式你对比下,看看主要是配置文件和你后台返回的。 --------------------编程问答--------------------
引用 9 楼 insonjump 的回复:
Quote: 引用 7 楼 rui888 的回复:

你的 Json result  这个Json是第三方的还是自己写的,确认你返回的和你配置的一样是json格式的数据。
那个Json是我自己写的,后来我改成了第三方(fastjson)的JSONObject(查看订单我返回的是fastjson的JSONArray,那个没有问题,所以我就改用fastjson的),但是还是不行。

这是我改动后的:
public class OrderAction extends BaseAction implements ModelDriven<OrderInfo> {

private OrderInfo oi = new OrderInfo();
private OrderService os;
private List<Order> orders;
private Order order;
private JSONArray rows; //这东西得和grid中的参数对应上,返回json对象,不是返回json串  
private JSONObject result;   //可以返回给struts.xml的result
private int total=0;      //记录数量

//添加order
public String addOrder() throws Exception {
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("application/json");
Order o = new Order();
//o.setCar(oi.getCar())……省略

Json r=new Json();

if (os.exists(o)) {
r.setMsg("操作失败!编码重复");
result=(JSONObject) JSONObject.toJSON(r);
} else {
os.addOrder(o);
r.setSuccess(true);
r.setMsg("操作成功!");
result=(JSONObject) JSONObject.toJSON(r);
}
return "add";
}





我刚没看清楚,你用的是struts的json插件来输出json。
你直接用JSON.toJSONString 呢? --------------------编程问答-------------------- 肯定是你前端写的访问路径跟你自己后台配置的不一致,找不到了,你自己找下。 --------------------编程问答-------------------- 估计你代码有异常,然后向外抛异常,struts捕获之后会跳到input指向的页面,但是你没有input返回,你可以捕获下异常一句句调试下。 --------------------编程问答-------------------- 你的action定义重复了  两个action同一个name
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,