今天写添加功能,在点添加提交时报了一个“HTTP ERROR 400”的错误,如图,
请求提交的代码死活跳转不到后台,郁闷中,开启debug功能,开始一步步排查,
1、先单独把跳转链接“http://192.168.1.72:8080/securityMonitor_C/device/insert”,放到浏览器中测试,发现可以跳转到后台的insert方法,那么不是跳转方法写错的问题,那是什么原因呢,打开foxfixe浏览器在的开发者工具,如图:
找到了报错的那条请求,原以为是请求中没有域名的问题,看到请求中域名与参数都是有的,那么会是什么错呢?与同事讨论,说会不会是带的参数有问题,好吧
这也是一条思路,把这条请求取出来:
http://192.168.1.72:8080/securityMonitor_C/device/insert?equipmentNo=t001&equipmentType=1&videoUrlLow=d&videoUrlCentre=&videoUrlHigh=&videotapeUrl=&cloudControlUrl=&areaId=®ionId=&status=1&controltId=&namagerUrl=&instalLatitude=d&equipmentModel=&installTime=
先把完整的放在浏览器中测试,浏览器中,果断报错,好吧,算是找到了一点小进步,那么下一步,开始减少传递的参数一步一步的试吧,首先把最后一个参数(&installTime=)去掉,再把链接拿到浏览器中测试,发现没有报错,可以进入后台(庆祝一下),到这一步,可算是找到问题原因了,是因为installTime这个参数的原因
可是问题又来了,为什么它会导致链接跳转不到后台呢?
然后我又回到jsp页面,仔细分析jsp页面代码:
<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ include file="/WEB-INF/views/taglibs.jsp" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
.urlinput{border:1px solid #95b8e7;border-radius:5px;width:200px;padding:2px;}
</style>
</head>
<body>
<form id="form1" action="insert">
<div class="dialogPage">
<div class="om-panel-header">新增</div>
<div class="editDiv">
<table class="editTable">
<tr>
<td><span class="required">*</span>设备编码:</td>
<td><input type="text" id="equipmentNo" name="equipmentNo"></td>
<td><span class="required">*</span>设备类型:</td>
<td><input type="combo" id="equipmentType" name="equipmentType" ></td>
</tr>
<tr>
<td><span class="required">*</span>实时低视频播放URL:</td>
<td colspan="3"><input type="text" id="videoUrlLow" name="videoUrlLow"></td>
</tr>
<tr>
<td>实时中视频播放URL:</td>
<td colspan="3"><input type="text" id="videoUrlCentre" name="videoUrlCentre"></td>
</tr>
<tr>
<td>实时高视频播放URL:</td>
<td colspan="3"><input type="text" id="videoUrlHigh" name="videoUrlHigh"></td>
</tr>
<tr>
<td>录像播放URL:</td>
<td colspan="3"><input type="text" id="videotapeUrl" name="videotapeUrl" ></td>
</tr>
<tr>
<td>云台控制URL:</td>
<td colspan="3"><input type="text" id="cloudControlUrl" name="cloudControlUrl"></td>
</tr>
<tr>
<td>地区:</td>
<td><input type="text" id="areaId" name="areaId"></td>
<td>区域属性:</td>
<td><input type="combo" id="regionId" name="regionId"></td>
</tr>
<tr>
<td><span class="required">*</span>状态:</td>
<td><input type="combo" id="status" name="status"></td>
<td>受控属性:</td>
<td><input type="combo" id="controltId" name="controltId"></td>
</tr>
<tr>
<td>管理url:</td>
<td colspan="3"><input type="text" id="namagerUrl" name="namagerUrl"></td>
</tr>
<tr>
<td><span class="required">*</span>安装位置:</td>
<td><input type="text" id="instalLatitude" name="instalLatitude"></td>
<td>设备规格型号:</td>
<td><input type="text" id="equipmentModel" name="equipmentModel"></td>
</tr>
<tr>
<td>安装时间:</td>
<td><input type="datetime" id="installTime" name="installTime" class="easyui-datetimebox"></td>
</tr>
</table>
<div class="editBtn">
<button type="submit" class="button"> 保存 </button>
<button type="button" class="button" onclick="javascript:art.dialog.close();"> 关闭 </button>
</div>
</div>
</div>
</form>
</body>
<script type="text/javascript">
$(function(){
//调整样式
$("#mobile").css("width","435px");
$("#videoUrlHigh").css("width","435px");
$("#videoUrlCentre").css("width","435px");
$("#videoUrlLow").css("width","435px");
$("#videotapeUrl").css("width","435px");
$("#cloudControlUrl").css("width","435px");
$("#namagerUrl").css("width","435px");
//添加校验
$(\'#equipmentNo\').validatebox({
required:true,
validType:\'maxLength[32]\'
});
$(\'#equipmentType\').validatebox({required:true});
$(\'#videoUrlLow\').validatebox({required:true,validType:\'maxLength[64]\'});
$(\'#videoUrlCentre\').validatebox({validType:\'maxLength[64]\'});
$(\'#videoUrlHigh\').validatebox({validType:\'maxLength[64]\'});
$("#videotapeUrl").validatebox({validType:\'maxLength[64]\'});
$("#cloudControlUrl").validatebox({validType:\'maxLength[64]\'});
$("#namagerUrl").validatebox({validType:\'maxLength[64]\'});
$(\'#instalLatitude\').validatebox({required:true});
//初始下拉列表
$(\'#equipmentType\').combobox({
data:JSON.parse(\'${deviceTypeCombo}\'),
panelHeight:\'auto\',
editable:false,
value:1
});
$(\'#regionId\').combobox({
data:JSON.parse(\'${regionCombo}\'),
panelHeight:\'auto\',
editable:false,
// value:1
});
$(\'#controltId\').combobox({
data:JSON.parse(\'${controltCombo}\'),
panelHeight:\'auto\',
editable:false,
// value:1
});
$(\'#status\').combobox({
data:JSON.parse(\'${statusCombo}\'),
panelHeight:\'auto\',
editable:false,
value:1
});
$(":submit").click(function(){
if(!$("#form1").form(\'validate\')){return false;}
});
});
</script>
</html>
发现installTime是date类型,但这应该不会是引起跳转不到后台的问题吧,(这里要说明一下,我前端框架使用的是easyUI),于是我想是不是后台接收请求,将请求转换成对应的bean时出现问题了呢,后台的接收方法:
@RequestMapping(value = "insert")
public String insert(HttpServletRequest request, Equipment equipment) {
equipment.setCreateOpId(super.getUserObj(request).getUserId()
.shortValue());
equipment.setCreateTime(new Date());
equipmentService.persist(equipment);
return "success";
}
于是,开始一步步做测试,1、先把方法中将请求映射成 equipment对象给去掉,即不让它自动转化为Equipment对象。重启请求,添加数据,提交,OK断点可以进来。这里已经找到问题出现点了。那么开始分析 为什么加上自动转化为Equipment对象会报错呢
会不会Equipment对象的installTime成员变量的类型设置的问题引起的呢,于是打开Equipment对象,发现installTime成员变量的类型设置的是Date类型,目前因为这个类型会导致报错,于是将其改为String类型,然后再重启,测试,ok,测试通过。
错误总结:
bean对象的参数如果是date类型的,那么date类型从页面上转化为bean对象时就会有问题。最好是将存储时间的变量设置为String,这样就可以避免一些问题。当然我得出的结果的前提是在使用easyUI的框架下,其它的jquery框架有没有这个问题,需要待验证