最近在做一个人力资源管理的项目,由于前期与师兄沟通不畅,导致了现在这个小模块的产生。这个小模块主要是做个人工资计算用的;分为三个部分: 1)基本工资部分 2)个人保险部分 3)个人所得税部分 除了第三部分之外,其他两部分都可以依据用户需求手动添加基本工资项和个人保险项,考虑到用户在进行工资计算的时候势必要对照自己所填信息,于是采用ajax技术与后台进行交互,但是ajax由于与浏览器的兼容问题,于是我又选择了jquery技术的ajax来解决。从后台传回来的值因为有三个(工资总和,个人保险总和,个人所得税),所以只能选用json作为传回值。在网上查找了很多资料,都不尽相同,试了几个都没什么效果,最后看到一篇文章很不错:http://hi.baidu.com/driftice/blog/item/2f7d2a89472af3ba0e244452.html,照着他的思路把我的模块实现了。
先对模块进行技术分析,因为要手工添加基本工资项和个人保险项,这就需要使用前台的js来实现,这个地方我使用的是上一个亚美项目的现成代码来实现的比较简单,后来想用jquery来实现,但是发现貌似没那么简单,于是就把资料放在那,一直懒得研究了。
关键代码如下:
function addBasicItem(){ var tdFile = document.getElementByIdx_x("basic"); var tableRow = tdFile.insertRow(tdFile.rows.length-1); var i=tdFile.rows.length; tableRow.id = "rowr" + (i-1); var cell0 = tableRow.insertCell(0); cell0.className="th"; cell0.innerHTML ="基本工资"+(i-1); var cell1 = tableRow.insertCell(1); cell1.innerHTML =" 元 删除";}//删除一行function deleteBasicItem(rowId){ var tableDetail = document.getElementByIdx_x("basic"); tableDetail.deleteRow(document.getElementByIdx_x(rowId).rowIndex);}
解决了这个问题,那前台的问题就剩下格式校验了,话说这个问题也是比较好做的,这里不做详述了。之后就是jquery ajxa的应用,前面说到,因为返回的时候是三个值,所以采用的是json,故需要很多包的支持 1.java包的支持,想使用json,必须导入以下jar包: “json-lib-2.3-jdk15.jar”,同时需导入JSON依赖包“commons-logging-1.0.4.jar”,“commons-lang.jar”,“commons-collections.jar”,“commons-beanutils.jar”,“ezmorph-1.0.4.jar”; 2 js相关的文件,一共有两个:需引入"jquery-1.4.2.min.js"与"json2.js" 这样所有的准备工作已经完毕,现在jsp页面写出我们要提交表单的js代码关
键代码如下:
jQuery(function($) { // 使用 jQuery 异步提交表单 $('#myForm').submit(function() { $.ajax({ url: 'cal', data: $('#myForm').serialize(), type: "post", cache : false, dataType:'json', success: function(data){ $("#edTaxSum").attr("value",data.personTax); $("#fullSum").attr("value",data.tatolWages); $("#edInsSum").attr("value",data.instrument); } }); return false; }); });
这段即包含了提交表单的一些设置,还提供了返回值的处理函数,在返回值的处理函数中,我将返回的数值分别赋值到三个input中。前台所有的关键技术已经结束了。
现在讲介绍servlet如何对ajax数据进行处理并返回。
servlet对ajax数据的处理和post提交没有区别,主要是在如何生成json并返回这个地方。关键代码如下:
//构建一个JSONObject JSONObject resultJSON = new JSONObject(); resultJSON.accumulate("personTax", personTax); resultJSON.accumulate("instrument", instrument); resultJSON.accumulate("tatolWages", tatolWages); //需要设置ContentType为"application/x-json" resp.setContentType("application/x-json"); PrintWriter out = resp.getWriter(); //向客户端输出JSONObject字符串 out.println(resultJSON.toString()); out.flush(); out.close();
很简单,前台只需要设定好接受函数就可以了,虽然现在看来很简单的一个东西,但是在一开始,还是搞得我焦头烂额的,用了一个下午的时间才真正搞定它