JSP亂碼的困擾

1、關於JSP頁面getparameter中文出現亂碼解決方案

在用JSP做開發時,當頁面參數有中文時,需要用request.getParameter得到並使用參數時,如果不轉換會出現亂碼,解決方法:
    若頁面編碼用"iso-8859-1", get方式做下字符轉換並輸出,
<%
        String title=new String(request.getParameter("title").getBytes("iso-8859-1"),("gb2312"));
        out.print(title);
%>
這樣就不會出現亂碼了。

    若從javascript對參數進行賦值,即使用了過濾器也解析不了亂碼問題。當頁面編碼用"UTF-8", get方式做下字符轉換並輸出,

//javascript賦值

<script type="text/javascript">

。。。

form1.content.value="jsp編碼的問題";

。。。

</script>

//jsp頁面text控件

。。。

 <input type="text" name="content"> 

。。。

//jsp頁面的Java代碼
<%
        String str=new String(request.getParameter("content").getBytes("iso-8859-1"),"UTF-8");
       System.out.println("str="+str);

%

    這樣可以正常輸出。


另外我簡單介紹一下JSP文件執行的過程

      第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java),如果pageEncoding設定錯了,或沒有設定,出來的就是中文亂碼。

     第二階段是由JAVAC的JAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什麼編碼方案,經過這個階段的結果全部是UTF-8的encoding的java源碼。

      JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8 encoding的二進制碼(即.class),這是JVM對常數字串在二進制碼(java encoding)內表達的規範。

       第三階段是Tomcat(或其的application container)載入和執行階段二的來的JAVA二進制碼,輸出的結果,也就是在客戶端見到的,這時隱藏在階段一和階段二的參數contentType就發揮了功效。

 

2、用過濾器代碼解決亂碼

   1)web.xml配置

   在文件末尾,</web-app>之前加入

<!-- 配置編碼過濾器 -->
 <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>com.filter.EncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>utf-8</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <servlet-name>action</servlet-name>
 </filter-mapping>


2)在包com.filter編寫EncodingFilter.java如下:

package com.filter;

import java.io.IOException;
import javax.servlet.*;

public class EncodingFilter implements Filter {
 
 String encoding = null;
 FilterConfig filterConfig = null; 

 //初始化方法
 public void init(FilterConfig filterConfig) throws ServletException {
  // TODO Auto-generated method stub
  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");
 }

 //過濾處理方法
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  // TODO Auto-generated method stub
  if (encoding!=null){
   //對請求進行編碼設置
   request.setCharacterEncoding(encoding);
  }
  //將處理權轉交給下一個處理器
  chain.doFilter(request,response);
 }

 //銷燬方法
 public void destroy() {
  // TODO Auto-generated method stub
  this.encoding = null;
  this.filterConfig = null;
 }
}

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