最近完成的项目是传统的MVC项目,前端页面主要采用JSP+jQuery完成,而且没有开发环境,踩坑颇为多,且调试麻烦。本着让以后能更高效(bu na me ku bi)的完成工作,来总结一下自己的踩坑锦集,希望对仍然采用该项目结构的小伙伴有所帮助,后续如果继续写jsp,会一直补充。
好了,不废话,先说说上手体验,毕竟之前一直都是前后端分离,虽然我前后端都写。从springBoot+SpringCloud+react编程,变为SpringMVC+JSP+jQuery,首先是懵逼的,调试效率都变低了,前后端分离的话,写后端会有swagger加持,测试方便的不要不要的,写前端react,也会自己mock数据,bug率一直很低,回到前一代技术,居然云云不知所措,下面来看具体:
1. 工具坑,由于IDEA没有专门配置jsp环境,导致项目打开全都是报错,写码完成后,都不知编译对错,直接提交服务器,看运行结果调试,效率极为地下,因此建议,如果长时间维护该项目,一定要想好本地开发调试方案。当然最后不能一直这样发布去调试,索性直接在服务器上修改代码看结果,并且将修改的代码同步copy到本地,也算是个难过的解决方案吧。
2. jQuery之殇,好久没有用过了,在用jQuery根据id取页面元素一直取不到,经过检查,缺少‘#’号,如下:
// 错误代码
var name = $("name").val();
// 记得带上#号
var name = $("#name").val();
if(name){
// 因为上面取错,导致我无法赋值成功
obj.name = name;
}
3. 使用ajax后端没有按照相应格式返回,导致即使请求成功,也会进入error,该问题由于没有打印日志,所以排查了好长时间,最后想起来之前遇到过,怕不是进入到error里了,结果调试结果,还真是!由此可鉴,日志,以及错误处理不能少,不能偷懒。
function opIndividualWelfare() {
var uid = $("#userId").val();
var userName = $("#realName").val();
$.ajax({
type : "post",//请求形式
url : "${ctx}/memberInfoManage/memberInfo/openingIndividualWelfare",//冻结金额 处理文件路径
data : {
userId : uid,
userName : userName
},
cache : false,
async : false,//是否异步
dataType : "json",//返回的数据类型
success : function(data) {
data = data.data
if ("0000" == data.respCode) { //有数据
$('#error').css('display', 'none');
window.location.reload();
} else { //无此数据
$('#error').css('display', 'block');
window.location.reload();
}
},
error : function(e) {
// 这里异常一定要打印或者处理,不然出现意外难以排查
console.error(e);
}
});
}
4. 细节问题,打印日志的时候formate写错了,都是细节!!!看下面代码,不细看,是不是看不出来0.0
// 错误代码
logger.info(String.format("调整计算完毕后的发送金额为:%s"),amountStr);
// 正确代码
logger.info(String.format("调整计算完毕后的发送金额为:%s",amountStr));
5. JSP标签使用错误:由于在js代码中,需要用到某个JSP表达式,结果我在页面搜索完毕后直接拿走用了,没有看到我拿到的是一个集合对象,直接用来判断不等于空字符串,结果直接报格式转换错误,莫名其妙,排查后发现是个集合。
6. JSP页面上没有进行格式化处理,修改后代码如下,保留两位小数:
<fmt:formatNumber type="number" value="${integralBalance}" pattern="0.00" maxFractionDigits="2"/>