Flex與Severlet(Jsp)通信傳遞中文參數亂碼問題的解決

這兩天在做FLEX上傳的時候,遇到一個問題,苦了我一天,今天終於給解決了.問題如下:

我在上傳過程中,除了上傳文件之外,還附帶有參數,我的FLEX中url設置如下:

   

Java代碼
  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.                
  3.             public var myFileReference:FileReference = new FileReference();   
  4.             public var mp3Type:FileFilter=new FileFilter("MP3(*.mp3)","*.mp3");   
  5.             public var allowType:Array=new Array(mp3Type);   
  6.                  
  7.             private function uploadMP3():void{   
  8.             //     System.useCodePage=false;//GBK   
  9.                var musicname:String=music_name.text;   
  10.                var singername:String=singer_name.text;   
  11.                   
  12.                if(musicname==""){   
  13.                   mx.controls.Alert.show("音樂名稱不能爲空");   
  14.                }else if(singername==""){   
  15.                   mx.controls.Alert.show("歌手不能爲空");   
  16.                }else if(musci_sName.text==""){   
  17.                   mx.controls.Alert.show("上傳音樂不能爲空");   
  18.                }else{   
  19.               //    Alert.show("歌手名:"+singername);   
  20.                //   Alert.show("歌曲名"+musicname);   
  21.                  var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp?musicname="+encodeURIComponent(music_name.text)+"&singername="+encodeURIComponent(singer_name.text);   
  22.                     
  23.                  var request:URLRequest = new URLRequest(url);   
  24.                  request.method="post";   
  25.                     
  26.                  try  
  27.                  {   
  28.                   //上傳文件   
  29.                   myFileReference.upload(request);   
  30.                   CursorManager.setBusyCursor();   
  31.                   //  showDetail.text = "upload";   
  32.                }catch (error:Error){   
  33.                   cursorManager.removeBusyCursor();   
  34.                   removeAllEvent();   
  35.                   mx.controls.Alert.show("上傳出錯");   
  36.                      
  37.                }   
  38.                }   
  39.             }   
  40.              
  41.             public function browse():void{   
  42.             //瀏覽本地本地文件   
  43.             myFileReference.browse(allowType);   
  44.             //爲打開選擇框定義事件處理   
  45.             myFileReference.addEventListener(Event.SELECT, selectHandler);   
  46.             //在上傳過程中觸發的事件處理   
  47.             myFileReference.addEventListener(ProgressEvent.PROGRESS, onProcess);   
  48.             //  myFileReference.addEventListener(Event.COMPLETE, onComplete);   
  49.             //在上傳過程中出錯處理   
  50.             myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);   
  51.             //處理返回信息   
  52.             myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);   
  53.                       
  54.             }       
  55.               
  56.             //先擇文件      
  57.             public function selectHandler(event:Event):void{    
  58.                 musci_sName.text=myFileReference.name;    
  59.             }   
  60.                
  61.             //取消文件上傳   
  62.             public function uploadCancel():void{   
  63.                 myFileReference.cancel();   
  64.                 CursorManager.removeBusyCursor();   
  65.                 removeAllEvent();   
  66.             }   
  67.                
  68.             //上傳過程中的事件   
  69.             public function onProcess():void{   
  70.               mx.managers.CursorManager.setBusyCursor();   
  71.             }   
  72.                
  73.   
  74.           import mx.managers.CursorManager;   
  75.           public function returnmsgHandler(event:DataEvent):void{   
  76.                  CursorManager.removeBusyCursor();   
  77.                  var result:Boolean=event.data.toString() as Boolean;   
  78.                  mx.controls.Alert.show("上傳成功");   
  79.                  sendRequestToGetMusicInfo();   
  80.           }   
  81.              
  82.             //上傳過程中出錯處理   
  83.           public function ioErrerHandler(event:IOErrorEvent):void{   
  84.               removeAllEvent();   
  85.               CursorManager.removeBusyCursor()   
  86.               Alert.show("上傳出錯","錯誤");   
  87.           }   
  88.              
  89.           //remove all the listerners   
  90.             public function removeAllEvent():void{   
  91.             myFileReference.removeEventListener(Event.SELECT, selectHandler);   
  92.             //在上傳過程中觸發的事件處理   
  93.             myFileReference.removeEventListener(ProgressEvent.PROGRESS, onProcess);   
  94.            // myFileReference.removeEventListener(Event.COMPLETE, onComplete);   
  95.             myFileReference.removeEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);   
  96.             myFileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);   
  97.          }   
  98.               
//上傳音樂部份
		    
		    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。

 

 

 顯然,當你設置成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章