ҳ-Career-HOME-Сﲿ

Ajax以Post方式提交后台中文乱码解决办法

Ajax以POST方式提交,url形式为”url?param=xx&param2=xx”时,如果传递的参数是中文或日文,后台接收参数将出现乱码,疑似“灏忎紮閮ㄨ惤”。此时我们需要将url编码成UTF-8。调用javascript方法encodeURI(URIstring),后台接收参数调用URLDecoder.decode(String s,String enc) 解码。
工作中遇到这个问题,起初打算用反射循环给属性转码,考虑到反射效率问题,为避免滥用反射。于是想到BeanUtils工具包赋值前能不能自定义操作呢?还真行。下面给出工作中遇到的实例,页面通过jQuery序列化所有表单使之成为url参数形式字符串,通过Ajax提交。后台Struts封装的FormBean取得所有参数值,调用BeanUtils工具包copyProperties(Object dest, Object orig)方法将FormBean复制到ValueBean,在复制对象属性之前,自定义String编码转换器,转换器中通过URLDecoder.decode(String s,String enc)对Value进行转码。对象的所有属性将会通过自定义转换器过滤转码成中文。

Ajax以Post方式提交后台中文乱码解决实例:

if(confirm("确定保存吗?")){
	var url = "xxAction.do?method=xxMethod";
	var data = $("form:first").serialize();
	data = encodeURI(data); // 提交数据URL通过encodeURI(URIstring)编码
	$.ajax({
		type:"POST",
		url:url,
		data:data,
		success:function(msg){
			alert(msg);
		}
	}); 
}
private void formBeanToValueBean(ZmxgzzmsyVB vb, ZmxgzzmsyFB fb)
		throws Exception {
	// 自定义转换String编码转换器
	ConvertUtils.register(new Converter() {
		public Object convert(Class type, Object value) {
			if (value == null) {
				return null;
			} else {
				String val = "";
				try {
					// 通过URLDecoder.decode(String s,String enc)解码
					val = URLDecoder.decode(value.toString(), "UTF-8");
				} catch (Exception e) {
					e.printStackTrace();
				}
				return val;
			}
		}
	}, String.class);
	BeanUtils.copyProperties(vb, fb);
	ConvertUtils.deregister();
}
关于作者