解決JSP參數傳遞亂碼的問題

 

 

jsp頁面間的參數傳遞有以下幾種方式:

1、表單(form)的提交。

2、直接使用URL後接參數的形式(超級鏈接)。

3、如果兩個jsp頁面在兩個不同的窗口中,並且這兩個窗口是父子的關係,子窗口中的jsp也可以使用javascript和DOM(window.opener.XXX.value)來取得父窗口中的jsp的輸入元素的值。

解決辦法:

1.post提交的方式:使用過濾器,將到達頁面前的request對象中的字符編碼設定成跟你頁面統一的編碼。

在過濾器中使用request.setCharacterEncoding(this.charset); 設置。

*注:request.setCharacterEncoding(this.charset);只適用post方式,只處理Request的body部分。

2.get提交的方式:先以字符編碼ISO-8859-1拆分,再用跟頁面編碼一樣的編碼來重組。

  1. <%String str = new String(request.getParameter("content").getBytes("ISO-8859-1"),"utf-8"); %> 

這樣的字符串重組的方法。

3.超級鏈接方式:先將鏈接url中的漢字用java.net.URLEncoder.encode("paramValue","charset")方法處理一下,下面的做法參照2。

Encodingfilter代碼:

  1. public class EncodingFilter implements Filter {     
  2.          
  3.     private String charset;     
  4.     @Override     
  5.     public void destroy() {     
  6.         // TODO Auto-generated method stub     
  7.     }     
  8.     
  9.     @Override     
  10.     public void doFilter(ServletRequest request, ServletResponse response,     
  11.             FilterChain chain) throws IOException, ServletException {     
  12.         //用init方法取得的charset覆蓋被攔截下來的request對象的charset     
  13.         request.setCharacterEncoding(this.charset);     
  14.         //將請求移交給下一下過濾器,如果還有的情況下。     
  15.         chain.doFilter(request, response);     
  16.     }     
  17.     
  18.     @Override     
  19.     public void init(FilterConfig config) throws ServletException {     
  20.         //從web.xml中的filter的配製信息中取得字符集     
  21.         this.charset = config.getInitParameter("charset");     
  22.     }     
  23. }    

要想這個過濾器生效,還得到web.xml里加入下面的配製信息。

 

  1.  <filter>     
  2.    <filter-name>EncodingFilter</filter-name>     
  3.    <filter-class>cn.eric.encodingtest.filter.EncodingFilter</filter-class>     
  4.    <init-param>     
  5.        <param-name>charset</param-name>     
  6.        <param-value>UTF-8</param-value>     
  7.    </init-param>     
  8. </filter>     
  9. <filter-mapping>     
  10.    <filter-name>EncodingFilter</filter-name>     
  11.    <url-pattern>/*</url-pattern>     
  12. </filter-mapping>    
  13. <filter>  
  14.     <filter-name>EncodingFilter</filter-name>  
  15.     <filter-class>cn.eric.encodingtest.filter.EncodingFilter</filter-class>  
  16.     <init-param> <param-name>charset</param-name>  
  17.     <param-value>UTF-8</param-value>  
  18.     </init-param>  
  19. </filter>  
  20. <filter-mapping>  
  21.     <filter-name>EncodingFilter</filter-name>  
  22.     <url-pattern>/*</url-pattern>  
  23. </filter-mapping>   

 

直接使用URL後接參數的形式(超級鏈接)和form的get方式的區別:

直接使用URL後接參數的形式(超級鏈接):

  1. <a href="./jstlresult.jsp?content=世界盃">Go South Africa 

form的get方式:

  1. http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=%E4%B8%96%E7%95%8C%E6%9D%AF 

超級鏈接時瀏覽器不會將參數重新編碼,form的時候纔會。

 

詳情請參考原文:http://www.blogjava.net/tbwshc/archive/2012/06/18/381005.html

 

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