Flex发送XML数据中文乱码的解决
[作者:来自网络][日期:2007-12-28][导航:Flash教程 >> Flex >> Flex发送XML数据中文乱码的解决]
本文转自
寅鸣感悟
上篇文章我提到过使用HTTPService向服务器传送数据如果含有中文字符要使用GET方式,否则会出乱码,经过测试中文乱码现象在使用HTTPService传送含有中文的XML内容的时候也存在。
注意:这里说的是HTTPService向后台传送XML数据,不是后台向Flex客户端发送XML数据,后者只要使用UTF-8的编码是没有问题的。经过两天的试验最后问题终于解决。
第一步,在服务器端要有能够进行BASE64编码的java工具类,下载地址:
Encoder.java
Base64Encoder.java
Base64.java
怎么使用怎么修改我不说了,地球上会写java的都知道。
第二步,撰写测试mxml文件,这里只展示关键代码。
<mx:HTTPService id="employeeSrv"
c method="get" url="employee.jsp" resultFormat="xml" result="getMessage()" showBusyCursor="true"/>注意红字的地方不能少。
<mx:RemoteObject id="base64" source="com.zt.util.Base64" result="sendMessage( event.result )" fault="alert(event.fault.faultstring, 'Error')">
<mx:method name="encode"/>
</mx:RemoteObject>声明一个RemoteObject,并使用encode方法对还有中文的XML数据进行编码,结果存放在event.result对象中,并由sendMessage函数进行处理。
<mx:Button label="Submit" click="getContent();" />
function getContent()
{
var xml:XML = new XML();
var rootElement:XMLNode = xml.createElement( "root" );
var contentElement:XMLNode = xml.createElement( "name" );
var textElement:XMLNode = xml.createTextNode( name.text );
contentElement.appendChild( textElement );
rootElement.appendChild( contentElement );
contentElement = xml.createElement( "email" );
textElement = xml.createTextNode( email.text );
contentElement.appendChild( textElement );
rootElement.appendChild( contentElement );
xml.appendChild( rootElement );
base64.encode( xml.toString() );
}当Submit按钮的click事件被触发的时候打包XML数据,并进行BASE64的编码工作。
function sendMessage( obj )
{
var xml:XML = new XML();
var rootElement:XMLNode = xml.createElement( "root" );
var textElement:XMLNode = xml.createTextNode( obj.toString() );
rootElement.appendChild( textElement );
xml.appendChild( rootElement );
employeeSrv.send( xml );
}此函数obj参数就是进行了BASE64编码后的数据,进行二次打包发送到服务器。
第三步,服务器端的处理,这里只是演示是否得到了正确的数据,所以没有业务逻辑,关键代码如下:
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build( request.getInputStream() );
System.out.println( Base64.decode( doc.getRootElement().getText() ) );
控制台上已经打印出了正确的含有中文的原始XML数据。
注意事项:RemoteObject方法的执行和结果的返回是异步机制它不会等到执行结果返回就会执行后面的语句,所以以下的写法是错误的,服务器每次得到的是你上次发送的结果。
var resultObj = null;
function sendMessage()
{
var xml:XML = new XML();
var rootElement:XMLNode = xml.createElement( "root" );
var contentElement:XMLNode = xml.createElement( "name" );
var textElement:XMLNode = xml.createTextNode( name.text );
contentElement.appendChild( textElement );
rootElement.appendChild( contentElement );
contentElement = xml.createElement( "email" );
textElement = xml.createTextNode( email.text );
contentElement.appendChild( textElement );
rootElement.appendChild( contentElement );
xml.appendChild( rootElement );
base64.encode( xml.toString() );
xml = new XML();
rootElement = xml.createElement( "root" );
textElement = xml.createTextNode( resultObj.toString() );
rootElement.appendChild( textElement );
xml.appendChild( rootElement );
employeeSrv.send( xml );
}
[文章热度:]
上一页:Flex与 J2EE进行交互 学习笔记
下一页:修改默认样式 Flex学习笔记