java web中配置Filter解決jsp中文亂碼問題

<Connector port="8180" redirectPort="8443" acceptCount="100"
connectionTimeout="20000"  URIEncoding="UTF-8"/>

需要通過filter過濾器設置:response.setContentType("text/html;charset=UTF-8");
 不能這樣設置: 
response.setCharacterEncoding(“UTF-8”);
讀取.txt文本文件時也使用UTF-8編碼:BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8")); FileOutputStream writerStream = new FileOutputStream(filePath, true); BufferedWriter oWriter = new BufferedWriter(new OutputStreamWriter(writerStream, "UTF-8")); .txt文件也要是以UTF-8編碼格式保存的才行,以其他編碼格式保存也會是亂碼。



BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8")); 

  1. FileOutputStream writerStream = new FileOutputStream(filePath, true);  
  2. BufferedWriter oWriter = new BufferedWriter(new OutputStreamWriter(writerStream, "UTF-8"));  


在Tomcat下conf文件夾下server.xml
找<Connector port="8081" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="gbk"/>
這個各個機子不一樣~
主要是在後面加disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="gbk"

  1. <Connector port="8080" protocol="HTTP/1.1"   
  2.            connectionTimeout="20000"   
  3.            redirectPort="8443"   
  4.     useBodyEncodingForURI="true"  
  5.     IEncoding="utf-8"   
  6.     URIEncoding="utf-8"/>  

<Connector port="8080" maxHttpHeaderSize="8192"                  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"                  enableLookups="false" redirectPort="8443" acceptCount="100"                  compression="on"                   compressionMinSize="2048"                  noCompressionUserAgents="gozilla, traviata"                  compressableMimeType="text/html,text/xml"                  connectionTimeout="20000" disableUploadTimeout="true"                  URIEncoding="UTF-8" />

在apache設置

AddDefaultCharset off

AddDefaultCharset utf-8

在apache均出現亂碼,

因此,Apache和Tomcat集成後,要使服務器支持UTF-8的中文地址,應該設置8009端口的<connector>標籤

最後的方法在tomcat的server.conf裏面設置apache和tomcat的連接爲utf-8

設置如下:

<Connector port="8009" URIEncoding="UTF-8" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

useBodyEncodingForURI參數表示是否用request.setCharacterEncoding  參數對URL提交的數據和表單中GET方式提交的數據進行重新編碼,在默認情況下,該參數爲false。

URIEncoding參數指定對所有GET方式請求進行統一的重新編碼(解碼)的編碼。

 

URIEncoding和useBodyEncodingForURI區別是,

URIEncoding是對所有GET方式的請求的數據進行統一的重新編碼,

而useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding參數對數據進行的重新編碼,不同的頁面可以有不同的重新編碼的編碼

(1)HttpServletRequest.setCharacterEncoding()方法 僅僅只適用於設置post提交的requestboda的編碼而不是設置get方法提交的queryString的編碼。該方法告訴應用服務器應該採用什麼編碼解析post傳過來的內容。
(2) HttpServletRequest.getPathInfo()返回的結果是由Servlet服務器解碼(decode)過的。
(3) HttpServletRequest.getRequestURI()返回的字符串沒有被Servlet服務器decoded過。(1)HttpServletRequest.setCharacterEncoding()方法 僅僅只適用於設置post提交的requestboda的編碼而不是設置get方法提交的queryString的編碼。該方法告訴應用服務器應該採用什麼編碼解析post傳過來的內容。
(2) HttpServletRequest.getPathInfo()返回的結果是由Servlet服務器解碼(decode)過的。
(3) HttpServletRequest.getRequestURI()返回的字符串沒有被Servlet服務器decoded過。




package com.gtxy.dynaActionForm.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* 以 UTF-8 輸入輸出

* @author ZhongHuiQiang

*/

public class FilterChar implements Filter {

  private String config;

  public void destroy() {
    this.config = null;
  }

  /**
    * name="FilterChar" <br>
    * init-param name="config" value="utf-8"<br>
    * mapping url-pattern="/*"<br>
    */

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throwsIOException, ServletException {
    HttpServletRequest req;
    req = (HttpServletRequest) request;

    HttpServletResponse res;
    res = (HttpServletResponse) response;

    req.setCharacterEncoding(config);
    //res.setCharacterEncoding(config);
    res.setContentType("text/html;charset=UTF-8");
    chain.doFilter(req, res);

  }

  /**
    * 獲得web.xml中初始化的參數
    */

  public void init(FilterConfig config) throws ServletException {
    this.config = config.getInitParameter("chars");
  }

}
 


OK,FilterChar類寫完後,就要配置web.xml了!
在web.xml裏面,最主要是下面這段代碼

<filter>
    <filter-name>FilterChar</filter-name>
    <filter-class>
     com.gtxy.dynaActionForm.web.filter.FilterChar
    </filter-class>
    <init-param>
      <param-name>chars</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>FilterChar</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>



簡單配置步驟:
1.在項目web.xml文件添加過濾器標記<filter>和<filter-mapping>;
2.實現過濾器代碼;
3.對Tomcat服務器conf目錄裏的Server.xml文件配置URIEncoding;
4.前臺頁面設置contentType的charset值與web.xml裏設置的值一致。


詳細配置步驟:
1.配置web.xm文件,在web-app標籤內添加過濾器的配置<filter>和<filter-mapping>

[html] view plaincopy
  1.   <!--中文亂碼處理過濾-->    
  2.     <filter>  
  3.         <filter-name>EncodingFilter</filter-name><!--過濾器名稱,自己起 -->  
  4.         <filter-class>com.filters.SetCharacterEncodingFilter</filter-class><!--過濾器類名稱,包括包名一致、寫全 -->  
  5.         <init-param><!--初始化參數,要指定的字符集編碼 -->  
  6.             <param-name>encoding</param-name><!--參數名稱 -->  
  7.             <param-value>GBK</param-value><!--參數值 -->  
  8.         </init-param>  
  9.         <init-param><!--初始化參數,指定是否忽略大小寫 -->  
  10.             <param-name>ignore</param-name>  
  11.             <param-value>true</param-value>  
  12.         </init-param>  
  13.     </filter>  
  14.     <filter-mapping>  
  15.         <filter-name>EncodingFilter</filter-name>  
  16.         <url-pattern>/*</url-pattern> <!--“/*”表示項目下所有資源 -->  
  17.     </filter-mapping>  
  18.   <!--中文亂碼處理過濾 -->    

2.實現過濾器代碼,創建一個SetCharacterEncodingFilter

[java] view plaincopy
  1. package com.filters;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11.   
  12. /** 
  13.  * 自定義字符處理過濾器 
  14.  * 參考自Tomcat目錄webapps\examples\WEB-INF\classes\filters 
  15.  * @author coderlu 
  16.  * @since 2012-12-10 
  17.  */  
  18. public class SetCharacterEncodingFilter implements Filter {  
  19.   
  20.     protected FilterConfig filterConfig = null//初始化配置  
  21.     protected String encoding = null;           //接收字符編碼  
  22.     protected boolean ignore = true;            //是否忽略大小寫  
  23.       
  24.     /* 析構函數 
  25.      * @see javax.servlet.Filter#destroy() 
  26.      */  
  27.     @Override  
  28.     public void destroy() {  
  29.         this.encoding = null;  
  30.         this.filterConfig = null;  
  31.     }  
  32.   
  33.     /* 執行過濾操作 
  34.      * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
  35.      */  
  36.     @Override  
  37.     public void doFilter(ServletRequest request, ServletResponse response,  
  38.             FilterChain chain) throws IOException, ServletException {  
  39.           
  40.         if (ignore || (request.getCharacterEncoding() == null)) {  
  41.             String encoding = selectEncoding(request);  //如果爲空先從web.xml中得到  
  42.             if (encoding != null){  
  43.                 request.setCharacterEncoding(encoding); //設置字符集編碼  
  44.                           response.setContentType("text/html;charset="+encoding);
  45.             }  
  46.         }  
  47.         chain.doFilter(request, response);  
  48.     }  
  49.   
  50.     /* 初始化過濾器 
  51.      * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
  52.      */  
  53.     @Override  
  54.     public void init(FilterConfig filterConfig) throws ServletException {  
  55.         this.filterConfig = filterConfig;     
  56.         this.encoding = filterConfig.getInitParameter("encoding");  //從web.xml文件中讀取encoding的值  
  57.         String value = filterConfig.getInitParameter("ignore");     //從web.xml文件中讀取ignore的值  
  58.         //以下三種情況均爲忽略大小寫  
  59.         if (value == null)  
  60.             this.ignore = true;  
  61.         else if (value.equalsIgnoreCase("true"))  
  62.             this.ignore = true;  
  63.         else if (value.equalsIgnoreCase("yes"))  
  64.             this.ignore = true;  
  65.         else  
  66.             this.ignore = false;  
  67.     }  
  68.       
  69.     /** 
  70.      * 得到字符編碼 
  71.      * @param request 
  72.      * @return 
  73.      */  
  74.     protected String selectEncoding(ServletRequest request) {  
  75.         return (this.encoding);  
  76.     }  
  77. }  

3.修改Tomcat服務器conf\Server.xml文件,加入一個URIEncoding="GBK" 

[html] view plaincopy
  1.     <!--URIEncoding 配置服務器反應編碼集-->  
  2.     <Connector port="8080" protocol="HTTP/1.1"   
  3.                connectionTimeout="20000"   
  4.                redirectPort="8443"   
  5.                URIEncoding="GBK"/>  

4.設置前臺頁面字符編碼集

[html] view plaincopy
  1. <%@ page contentType="text/html;charset=GBK" %>  
//此處的charset的值要和web.xml裏的   <param-value></param-value>值一樣

算圓上的一點的座標

圓心(0,0) 半徑1
已知圓上某點座標 x y
延圓心旋轉θ後 
新的座標是多少?
解:設原來點(x,y)對應的角爲α,則x=cosα,y=sinα.
設所求的新座標爲(m,n),對應的角應爲α-θ,所以m=cos(α-θ),n=sin(α-θ)
展開得m=cos(α-θ)=cosαcosθ+sinαsinθ=xcosθ+ysinθ
n=sin(α-θ)=sinαcosθ-cosαsinθ=ycosθ-xsinθ
所以所求的座標爲(xcosθ+ysinθ,ycosθ-xsinθ)



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