Spring+Struts+Ajax Form提交中文处理方法
2008-07-05 11:03
766 查看
基于spring+struts的前台框架,Struts2本身已经提供了ajax的封装.但是我们在项目开发中没有采用.现在发现需要将大量通过普通提交的内容都改为Ajax提交方式.为了对代码尽量少的修改,我们不得不自行实现解决方案.
原本为了解决中文提交的问题,已经提供了一个SetCharacterEncodingFilter过滤器.这个解决方案也是网上流行的方法.过滤器的写法也大同小异.
但是当进行ajax提交时,就出现了问题.无论怎么提交,后台得到的总是乱码内容.我分析,这可能是客户端,服务端以及页面,过滤器中都在处理代码转换的 问题,而且各自为政.因此过滤器可以解决客户端自动提交的中文问题,但是如果脚本提交时,客户端的某个部分没有参与编码传递的工作,这样就打乱了整个工作 程序.导致最终得到的乱码.所幸,无论怎么样的打论编码工序,ascII码是共通的低层格式.
针对这个问题,我参考了网上的一些方法,总结出了一套解决方案,就是将数据全部以ascII码传递.然后,到了后台,再统一转回UTF-8.在后台部分由拦截器来实现统一的内码转换.
ajaxform.js
JSP页面中原本的提交改为:
后台拦截器:
拦截器配置:
Struts Action配置:
如此,就可以将普通提交的Form改为ajaxform. 不过我,总是想,应该有办法不需要在后台转换,在前台用ajax完全模拟普通提交.
原本为了解决中文提交的问题,已经提供了一个SetCharacterEncodingFilter过滤器.这个解决方案也是网上流行的方法.过滤器的写法也大同小异.
但是当进行ajax提交时,就出现了问题.无论怎么提交,后台得到的总是乱码内容.我分析,这可能是客户端,服务端以及页面,过滤器中都在处理代码转换的 问题,而且各自为政.因此过滤器可以解决客户端自动提交的中文问题,但是如果脚本提交时,客户端的某个部分没有参与编码传递的工作,这样就打乱了整个工作 程序.导致最终得到的乱码.所幸,无论怎么样的打论编码工序,ascII码是共通的低层格式.
针对这个问题,我参考了网上的一些方法,总结出了一套解决方案,就是将数据全部以ascII码传递.然后,到了后台,再统一转回UTF-8.在后台部分由拦截器来实现统一的内码转换.
ajaxform.js
//------------------------------------------------------- //本脚本提供了将原始form提交改由ajax方式实现. //实现范例: // submitByAjax(form); // submitByAjax(form,function(){ // ...... // }); //------------------------------------------------------- /** * 通过ajax进行表单提交 */ function submitByAjax(form,callbackNam) { var url = form.action; var content = getFormQueryString(form); //alert("参数:"+content); if (form.method.toLowerCase()!="post") { url += ("?"+content); content = null; } if (callbackNam==null) { callbackNam = function(s){ document.open(); document.clear(); document.write(s); document.close(); }; } //提交 ajax_request(url,callbackNam,form.method,content); } //------------------------------------------------------- // Date : 2007/01/25 // Desc : Get all the from object // include type : hidden,text,select, checkbox,radio,file // none-include : button,submit,reset,image // Params : frmID: Form's ID or Name //------------------------------------------------------- function getFormQueryString( frmID ) { var i,queryString = "", and = ""; var item; // for each form's object var itemValue;// store each form object's value for( i=0;i<frmID.length;i++ ) { item = frmID[i];// get form's each object if ( item.name!='' ) { if ( item.type == 'select-one' ) { itemValue = item.options[item.selectedIndex].value; } else if ( item.type=='checkbox' || item.type=='radio') { itemValue = item.value; } else if ( item.type == 'button' || item.type == 'submit' || item.type == 'reset' || item.type == 'image') {// ignore this type continue; } else { itemValue = item.value; } itemValue = encodeURIComponent(itemValue); itemValue = encodeURIComponent(itemValue); //据说要2次 //itemValue = encodeURI(itemValue); queryString += and + item.name + '=' + itemValue; and ="&"; } if ( item.checked == false ) { continue; } } return queryString; } //ajax提交 function ajax_request(url, deal,method,content) { if (method == null) { method = "get"; } var http_request = null; if(window.ActiveXObject) { try { http_request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { http_request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } else if(window.XMLHttpRequest) { http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml'); } } if(!http_request) { return; } if(method.toLowerCase()=="post") { //alert("ajax xml"); http_request.open(method, url, false); //http_request.setRequestHeader('Content-Type','text/xml;charset=gbk'); http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } else{ http_request.open(method, url, false); } http_request.onreadystatechange = function() { if(4 == http_request.readyState) { if(200 == http_request.status) { deal(http_request.responseText); } else { alert(http_request.status); } } } http_request.setRequestHeader('If-Modified-Since','0'); http_request.send(content); }
JSP页面中原本的提交改为:
<form onsubmit="submitByAjax(document.forms[0]);"> ...... </form>
后台拦截器:
package com.simlink.emr.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import java.net.URLDecoder; import java.util.Iterator; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; /** * Ajax form 拦截器.主要职责是将前台的中文解码. * @author Ma Yichao */ public class AjaxFormInterceptor extends AbstractInterceptor { private static Log log = LogFactory.getLog(AjaxFormInterceptor.class); @Override public String intercept(ActionInvocation actionInvocation) throws Exception { HttpServletRequest req = ServletActionContext.getRequest(); HttpSession session = req.getSession(); for (Iterator it = req.getParameterMap().entrySet().iterator(); it.hasNext();) { Entry entry = (Entry) it.next(); Object value = entry.getValue(); if (log.isDebugEnabled()) { log.debug("==========================="); log.debug("key=" + entry.getKey()); log.debug("old value=" + value); } if (value instanceof String) { //entry.setValue(URLDecoder.decode((String) value, "utf-8")); value = URLDecoder.decode((String) value, "utf-8"); }else if(value instanceof String[]){ //Struts中传递对象时,多用String[]而非String. String[] values = (String[])value; for (int i = 0; i < values.length; i++) { String string = values[i]; values[i] = URLDecoder.decode((String)string, "utf-8"); } } entry.setValue(value); if (log.isDebugEnabled()) { log.debug("new value=" + entry.getValue()); log.debug("---------------------------"); } } return actionInvocation.invoke(); } }
拦截器配置:
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="interceptor" extends="struts-default"> <interceptors> <interceptor name ="ajaxformInterceptor" class ="com.simlink.emr.interceptor.AjaxFormInterceptor"/> <interceptor-stack name="ajaxformStack"> <interceptor-ref name="ajaxformInterceptor" /> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> ...... </package> </struts>
Struts Action配置:
<action name="updateXXX" class="xxxAction" method="updateXXX"> <interceptor-ref name="ajaxformStack"/> <result name="success" type="redirect"> ...... </result> </action>
如此,就可以将普通提交的Form改为ajaxform. 不过我,总是想,应该有办法不需要在后台转换,在前台用ajax完全模拟普通提交.
相关文章推荐
- Extjs6关于Ajax和form表单提交以及store请求session超时的处理方法
- jQuery实现Ajax提交form表单的简单方法
- jquery中ajax方法提交数据时,中文乱码问题解决。
- Spring3.0_MVC中解决提交表单时产生的中文乱码的方法
- jquery实现ajax提交form表单的方法总结
- 利用AjaxSubmit()方法实现Form提交表单后回调功能
- JQuery中Ajax提交在IE下中文乱码的解决方法
- jQuery实现form表单基于ajax无刷新提交方法详解
- Asp.net 更改Alert样式和后台注册Jquery的Ajax异步提交事件[包括处理前操作、处理后操作(注明:此方法只是作为参考,如有需要可自行修改)]
- jQuery基于ajax()使用serialize()提交form数据的方法
- ajax post 提交中文java后台获取参数出现乱码解决方法
- Jquery基于Ajax方法自定义无刷新提交表单Form实例
- Struts:把页面数据提交到Form的原理及使用方法
- jquery的ajax提交form表单的两种方法小结(推荐)
- spring mvc 4.x 版本在返回给ajax调用的json数据时候,出现中文显示???的处理方法
- 通过form的action属性提交表单并接收处理返回值的方法(页面不跳转)
- JQuery中Ajax的Post提交在IE下中文乱码的解决方法
- Ajax提交中文乱码问题解决方法
- jquery序列化form表单使用ajax提交后处理返回的json数据
- spring 自带filter解决form提交中文乱码