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 plain copy
  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 plain copy
  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 plain copy
  1.     <!--URIEncoding 配置服务器反应编码集-->  
  2.     <Connector port="8080" protocol="HTTP/1.1"   
  3.                connectionTimeout="20000"   
  4.                redirectPort="8443"   
  5.                URIEncoding="GBK"/>  

4.设置前台页面字符编码集

[html]  view plain copy
  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θ)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值