Flex与Severlet(Jsp)通信传递中文参数乱码问题的解决

本文解决在FLEX中上传含有中文参数的文件时出现的乱码问题,通过在FLEX中对中文参数进行UTF-8编码,并在JSP后台进行相应的解码操作,确保中文参数正确传递。

 

Java代码
  1. var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+music_name.text+"
  2. &singername="+singer_name.text;
  1. var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+music_name.text+"
  2. &singername="+singer_name.text;
var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+music_name.text+"
&singername="+singer_name.text; 

 

 

 

显然这里是上传音乐过程,顺便把音乐名及歌手名上传上去,其中音乐名与哥手名是中文,我用自己的机子开启TOMCAT做服务器,然后开启本地浏览器登陆,上传音乐,没一点问题,中文可以在后台打印出来.但是通过IP访问我的服务器时,就出现问题了,浏览器将"musicname="+music_name.text+"&singername="+singer_name.text"

两个参数musicname与singername解析成了一个参数,于是后者在JSP中用request.getParameter("singername");

其结果为null所以就报了空指针错误.自然上传过程中也会报错.那么我是怎么解决的呢?用代码来说明问题.

FLEX中代码如下:

 

 

var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+

encodeURIComponen(music_name.text) +"&singername="+

encodeURIComponent (singer_name.text);

var request:URLRequest = new URLRequest(url); request.method="post";

大家注意看,第二次代码与第一次代码中URL的不同,见红色部分.这里就是对中文参数进行编码,在FLEX中默认编码方式为

UTF-8,这里是对中文参数用UTF-8进行编码,那么在后台我们要对其行进解码.

JSP中,核心代码如下:

 

 

 

String mp3name=new String(musicname.getBytes("ISO8859-1"),"utf-8");

String mp3singer=new String(singername.getBytes("ISO8859-1"),"utf-8");

这是一个解码的过程.

然后经过印,就可得到我们梦寐以求的浏览器传过来的中文参数了.到此,FLEX中上传文件,附代中文参数的问题得到解决.

有些朋友照上面进行操作还可能出现乱码问题,原因可能如下:

即在你的FLEX页面中有如下设置:

System.useCodePage=true;

 

 

System.useCodePage=true;是用你浏览器的编码方式来解行编码,那么你在后台用UTF-8,或者gbk解码都可能出现乱码问题,甚至出现解析参数出错.我们提供的解决方法如下

或者将 System.useCodePage=false;

或者将这句话注释即可(默认为false).

这个问题困惑了我两天,今天终于解决,希望有同样困惑的朋友能早日解决其问题.

下面附上完整代码:

Flex:(附中文参数文件上传部份,这里只写了函数部份,触发函数的组件大家可以自己写)

 

Java代码
  1. //上传音乐部份
  2. public var myFileReference:FileReference = new FileReference();
  3. public var mp3Type:FileFilter=new FileFilter("MP3(*.mp3)","*.mp3");
  4. public var allowType:Array=new Array(mp3Type);
  5. private function uploadMP3():void{
  6. // System.useCodePage=false;//GBK
  7. var musicname:String=music_name.text;
  8. var singername:String=singer_name.text;
  9. if(musicname==""){
  10. mx.controls.Alert.show("音乐名称不能为空");
  11. }elseif(singername==""){
  12. mx.controls.Alert.show("歌手不能为空");
  13. }elseif(musci_sName.text==""){
  14. mx.controls.Alert.show("上传音乐不能为空");
  15. }else{
  16. // Alert.show("歌手名:"+singername);
  17. // Alert.show("歌曲名"+musicname);
  18. var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp?musicname="+encodeURIComponent(music_name.text)+"&singername="+encodeURIComponent(singer_name.text);
  19. var request:URLRequest = new URLRequest(url);
  20. request.method="post";
  21. try
  22. {
  23. //上传文件
  24. myFileReference.upload(request);
  25. CursorManager.setBusyCursor();
  26. // showDetail.text = "upload";
  27. }catch (error:Error){
  28. cursorManager.removeBusyCursor();
  29. removeAllEvent();
  30. mx.controls.Alert.show("上传出错");
  31. }
  32. }
  33. }
  34. public function browse():void{
  35. //浏览本地本地文件
  36. myFileReference.browse(allowType);
  37. //为打开选择框定义事件处理
  38. myFileReference.addEventListener(Event.SELECT, selectHandler);
  39. //在上传过程中触发的事件处理
  40. myFileReference.addEventListener(ProgressEvent.PROGRESS, onProcess);
  41. // myFileReference.addEventListener(Event.COMPLETE, onComplete);
  42. //在上传过程中出错处理
  43. myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
  44. //处理返回信息
  45. myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
  46. }
  47. //先择文件
  48. public function selectHandler(event:Event):void{
  49. musci_sName.text=myFileReference.name;
  50. }
  51. //取消文件上传
  52. public function uploadCancel():void{
  53. myFileReference.cancel();
  54. CursorManager.removeBusyCursor();
  55. removeAllEvent();
  56. }
  57. //上传过程中的事件
  58. public function onProcess():void{
  59. mx.managers.CursorManager.setBusyCursor();
  60. }
  61. import mx.managers.CursorManager;
  62. public function returnmsgHandler(event:DataEvent):void{
  63. CursorManager.removeBusyCursor();
  64. var result:Boolean=event.data.toString() as Boolean;
  65. mx.controls.Alert.show("上传成功");
  66. sendRequestToGetMusicInfo();
  67. }
  68. //上传过程中出错处理
  69. public function ioErrerHandler(event:IOErrorEvent):void{
  70. removeAllEvent();
  71. CursorManager.removeBusyCursor()
  72. Alert.show("上传出错","错误");
  73. }
  74. //remove all the listerners
  75. public function removeAllEvent():void{
  76. myFileReference.removeEventListener(Event.SELECT, selectHandler);
  77. //在上传过程中触发的事件处理
  78. myFileReference.removeEventListener(ProgressEvent.PROGRESS, onProcess);
  79. // myFileReference.removeEventListener(Event.COMPLETE, onComplete);
  80. myFileReference.removeEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
  81. myFileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
  82. }
  1. //上传音乐部份
  2. public var myFileReference:FileReference = new FileReference();
  3. public var mp3Type:FileFilter=new FileFilter("MP3(*.mp3)","*.mp3");
  4. public var allowType:Array=new Array(mp3Type);
  5. private function uploadMP3():void{
  6. // System.useCodePage=false;//GBK
  7. var musicname:String=music_name.text;
  8. var singername:String=singer_name.text;
  9. if(musicname==""){
  10. mx.controls.Alert.show("音乐名称不能为空");
  11. }elseif(singername==""){
  12. mx.controls.Alert.show("歌手不能为空");
  13. }elseif(musci_sName.text==""){
  14. mx.controls.Alert.show("上传音乐不能为空");
  15. }else{
  16. // Alert.show("歌手名:"+singername);
  17. // Alert.show("歌曲名"+musicname);
  18. var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp?musicname="+encodeURIComponent(music_name.text)+"&singername="+encodeURIComponent(singer_name.text);
  19. var request:URLRequest = new URLRequest(url);
  20. request.method="post";
  21. try
  22. {
  23. //上传文件
  24. myFileReference.upload(request);
  25. CursorManager.setBusyCursor();
  26. // showDetail.text = "upload";
  27. }catch (error:Error){
  28. cursorManager.removeBusyCursor();
  29. removeAllEvent();
  30. mx.controls.Alert.show("上传出错");
  31. }
  32. }
  33. }
  34. public function browse():void{
  35. //浏览本地本地文件
  36. myFileReference.browse(allowType);
  37. //为打开选择框定义事件处理
  38. myFileReference.addEventListener(Event.SELECT, selectHandler);
  39. //在上传过程中触发的事件处理
  40. myFileReference.addEventListener(ProgressEvent.PROGRESS, onProcess);
  41. // myFileReference.addEventListener(Event.COMPLETE, onComplete);
  42. //在上传过程中出错处理
  43. myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
  44. //处理返回信息
  45. myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
  46. }
  47. //先择文件
  48. public function selectHandler(event:Event):void{
  49. musci_sName.text=myFileReference.name;
  50. }
  51. //取消文件上传
  52. public function uploadCancel():void{
  53. myFileReference.cancel();
  54. CursorManager.removeBusyCursor();
  55. removeAllEvent();
  56. }
  57. //上传过程中的事件
  58. public function onProcess():void{
  59. mx.managers.CursorManager.setBusyCursor();
  60. }
  61. import mx.managers.CursorManager;
  62. public function returnmsgHandler(event:DataEvent):void{
  63. CursorManager.removeBusyCursor();
  64. var result:Boolean=event.data.toString() as Boolean;
  65. mx.controls.Alert.show("上传成功");
  66. sendRequestToGetMusicInfo();
  67. }
  68. //上传过程中出错处理
  69. public function ioErrerHandler(event:IOErrorEvent):void{
  70. removeAllEvent();
  71. CursorManager.removeBusyCursor()
  72. Alert.show("上传出错","错误");
  73. }
  74. //remove all the listerners
  75. public function removeAllEvent():void{
  76. myFileReference.removeEventListener(Event.SELECT, selectHandler);
  77. //在上传过程中触发的事件处理
  78. myFileReference.removeEventListener(ProgressEvent.PROGRESS, onProcess);
  79. // myFileReference.removeEventListener(Event.COMPLETE, onComplete);
  80. myFileReference.removeEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
  81. myFileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
  82. }
//上传音乐部份
		    
		    public var myFileReference:FileReference = new FileReference();
	        public var mp3Type:FileFilter=new FileFilter("MP3(*.mp3)","*.mp3");
	        public var allowType:Array=new Array(mp3Type);
	          
		    private function uploadMP3():void{
		    // 	   System.useCodePage=false;//GBK
		   	   var musicname:String=music_name.text;
		   	   var singername:String=singer_name.text;
		   	   
		   	   if(musicname==""){
		   	      mx.controls.Alert.show("音乐名称不能为空");
		   	   }else if(singername==""){
		   	      mx.controls.Alert.show("歌手不能为空");
		   	   }else if(musci_sName.text==""){
		   	      mx.controls.Alert.show("上传音乐不能为空");
		   	   }else{
		   	  // 	Alert.show("歌手名:"+singername);
		   	   //	Alert.show("歌曲名"+musicname);
		   	     var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp?musicname="+encodeURIComponent(music_name.text)+"&singername="+encodeURIComponent(singer_name.text);
		         
		         var request:URLRequest = new URLRequest(url);
		         request.method="post";
		         
		         try
	             {
		      	  //上传文件
		          myFileReference.upload(request);
		          CursorManager.setBusyCursor();
		          //  showDetail.text = "upload";
	           }catch (error:Error){
	           	  cursorManager.removeBusyCursor();
	           	  removeAllEvent();
		          mx.controls.Alert.show("上传出错");
		          
	           }
		   	   }
		    }
	      
	        public function browse():void{
	        //浏览本地本地文件
	        myFileReference.browse(allowType);
	        //为打开选择框定义事件处理
	        myFileReference.addEventListener(Event.SELECT, selectHandler);
	        //在上传过程中触发的事件处理
	        myFileReference.addEventListener(ProgressEvent.PROGRESS, onProcess);
	        //  myFileReference.addEventListener(Event.COMPLETE, onComplete);
	        //在上传过程中出错处理
	        myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
	        //处理返回信息
	        myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
                   
	        }    
	       
	        //先择文件   
	        public function selectHandler(event:Event):void{ 
	            musci_sName.text=myFileReference.name; 
	        }
	        
	        //取消文件上传
	        public function uploadCancel():void{
	            myFileReference.cancel();
	            CursorManager.removeBusyCursor();
	            removeAllEvent();
	        }
	        
	        //上传过程中的事件
	        public function onProcess():void{
	          mx.managers.CursorManager.setBusyCursor();
	        }
	        

	      import mx.managers.CursorManager;
	      public function returnmsgHandler(event:DataEvent):void{
	      	     CursorManager.removeBusyCursor();
	             var result:Boolean=event.data.toString() as Boolean;
	             mx.controls.Alert.show("上传成功");
	             sendRequestToGetMusicInfo();
	      }
	      
	        //上传过程中出错处理
	      public function ioErrerHandler(event:IOErrorEvent):void{
	          removeAllEvent();
	          CursorManager.removeBusyCursor()
	          Alert.show("上传出错","错误");
	      }
	      
	      //remove all the listerners
	        public function removeAllEvent():void{
	        myFileReference.removeEventListener(Event.SELECT, selectHandler);
	        //在上传过程中触发的事件处理
	        myFileReference.removeEventListener(ProgressEvent.PROGRESS, onProcess);
	       // myFileReference.removeEventListener(Event.COMPLETE, onComplete);
	        myFileReference.removeEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
	        myFileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
	     }
		    

 

 

后代JSP中代码如下:

 

Java代码
  1. String musicname = request.getParameter("musicname");
  2. String singername = request.getParameter("singername");
  3. String mp3name=new String(musicname.getBytes("ISO8859-1"),"utf-8");
  4. String mp3singer=new String(singername.getBytes("ISO8859-1"),"utf-8");
  5. System.out.println("the muicsname:---"+mp3name);
  6. System.out.println("the singer name:++++++++"+mp3singer);

 

来自as3 文档
一个布尔值,它告诉 Flash Player 使用哪个代码页来解释外部文本文件。 当该属性设置为 false 时,Flash Player 使用 Unicode 解释外部文本文件。 (保存这些文件时,必须使用 Unicode 对其进行编码。) 当该属性设置为 true 时,Flash Player 使用运行播放器的操作系统的传统代码页来解释外部文本文件。 useCodePage 的默认值是 false。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值