最近在做一个人力资源管理的项目,由于前期与师兄沟通不畅,导致了现在这个小模块的产生。这个小模块主要是做个人工资计算用的;分为三个部分:
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 ="<input type='text' id='incomeAmt"+(i-1)+"' name='incomeAmt' value='0' maxlength='10'/><span class='unit'>元</span> <a href='javascript:deleteBasicItem(""+tableRow.id+"")';><span class='shanchu'>删除</span></a>";
}
//删除一行
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();
很简单,前台只需要设定好接受函数就可以了,虽然现在看来很简单的一个东西,但是在一开始,还是搞得我焦头烂额的,用了一个下午的时间才真正搞定它