【新手请教】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',{按这个来写就行,另外你那个form表单中的url就不需要了,直接去掉。。。 --------------------编程问答--------------------
url:'${ctx}/json/saveBed.action?bed.endemicId='+node.id,
success: function(data){
}
});
还是不行,把form的action url去掉后根本提交不到给action。 --------------------编程问答-------------------- orderAction!getOrderList.action,url为什么这么写,直接写对应的action加上参数不就行了么?
--------------------编程问答-------------------- dataTyp:"json", 少个e --------------------编程问答--------------------
dataTyp:"json", 少个e
orderAction!getOrderList.action,url为什么这么写,直接写对应的action加上参数不就行了么?
怎么看你写的js别扭啊。。。尤其是那个url,为什么这么写,直接用easyui中的表单提交就行了啊。。。$('#Form').form('submit',{按这个来写就行,另外你那个form表单中的url就不需要了,直接去掉。。。
url:'${ctx}/json/saveBed.action?bed.endemicId='+node.id,
success: function(data){
}
});
还是不行,把form的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啦。。。
--------------------编程问答--------------------
你的 Json result 这个Json是第三方的还是自己写的,确认你返回的和你配置的一样是json格式的数据。
这是我改动后的:
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";
}
--------------------编程问答-------------------- 这里有几种方式你对比下,看看主要是配置文件和你后台返回的。 --------------------编程问答--------------------
那个Json是我自己写的,后来我改成了第三方(fastjson)的JSONObject(查看订单我返回的是fastjson的JSONArray,那个没有问题,所以我就改用fastjson的),但是还是不行。
你的 Json result 这个Json是第三方的还是自己写的,确认你返回的和你配置的一样是json格式的数据。
这是我改动后的:
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 开发