Tomcat 5/6 GBK 编码下完美解决中文表单问题的过滤器


常 见的 Tomcat 5 表单编码提交后乱码的解决方案有很多, 有改 Tomcat Connector 属性的, 有加过滤器的. 但是 Tomcat 自带的那个过滤器只解决了 POST 方式的乱码却不能处理 GET 方式的乱码.  在这里那我就给出一个不需要修改任何 Tomcat 配置文件的完美解决中文问题的过滤器的代码:

 

index.jsp

<%@ page language="java"
 import="java.util.*"
 pageEncoding="GBK"
%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>
<html>
  <head>
   
    <title>表单测试页面</title>

  </head>
  
  <body>
   <form action="action.jsp"
>
   GET 方式: <input type=text name="name"
 value
="GET 中文"
>
   <input type=submit>
   </form>
   
      <form action="action.jsp"
 method="POST"
>
   POST 方式: <input type=text name="name"
 value
="POST 中文"
>
   <input type=submit>
   </form>
  </body>
</html>

和普通的表单没有任何区别.

然后就是表单提交页面 action.jsp:

<%@ page language="java"
 pageEncoding="GBK"
%>
<html>
  <body>
   参数: <%=request.getParameter("name"
) %> <br>
  </body>
</html>

接着是过滤器的配置文件 web.xml (用 2.5 版本也可以):

<?
xml
 version
="1.0"
 encoding
="UTF-8"
?>

<
web-app
 version
="2.4"
 
    xmlns
="http://java.sun.com/xml/ns/j2ee"
 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>

    <
filter
>

    <
filter-name
>
TomcatFormFilter</
filter-name
>

    <
filter-class
>
filters.TomcatFormFilter</
filter-class
>

    </
filter
>

    
    <
filter-mapping
>

    <
filter-name
>
TomcatFormFilter</
filter-name
>

    <
url-pattern
>
*.jsp</
url-pattern
>

    </
filter-mapping
>

    
  <
welcome-file-list
>

    <
welcome-file
>
index.jsp</
welcome-file
>

  </
welcome-file-list
>

</
web-app
>

最后最关键的就是我们的过滤器代码了, 对 GET 方式使用请求包装器, 而 POST 方式则用 setCharacterEncoding():

package filters;

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.ServletException;
import  javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

public
 class
 TomcatFormFilter implements Filter {
    /**

      * Request.java

      * 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest

      * 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的

      * request 对象即可.

      */


    class
 Request extends HttpServletRequestWrapper
    {

        public
 Request(HttpServletRequest request) {
            super(request);
        }

        /**

         * 转换由表单读取的数据的内码.

         * 从 ISO 字符转到 GBK.

         */

        public
 String toChi(String input) {
            try
 {
              byte
[] bytes = input.getBytes("ISO8859-1"
);
              return
 new
 String(bytes, "GBK"
);
            }
            catch
 (Exception ex) {
            }
            return
 null
;
        }

        /**

         * Return the HttpServletRequest holded by this object.

         */

        private
 HttpServletRequest getHttpServletRequest()
        {
            return
 (HttpServletRequest)super.getRequest();
        }

        /**

         * 读取参数 -- 修正了中文问题.

         */

        public
 String getParameter(String name)
        {
            return
 toChi(getHttpServletRequest().getParameter(name));
        }

        /**

         * 读取参数列表 - 修正了中文问题.

         */

        public
 String[] getParameterValues(String name)
        {
              String values[] = getHttpServletRequest().getParameterValues(name);
              if
 (values != null
) {
                for
 (int
 i = 0; i < values.length; i++) {
                  values[i] = toChi(values[i]);
                }
              }
              return
 values;
        }
    }
    public
 void
 destroy() {
        
    }

    public
 void
 doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpreq = (HttpServletRequest)request;
        if
(httpreq.getMethod().equals("POST"
)) {
            request.setCharacterEncoding("GBK"
);
        } else
 {
            request = new
 Request(httpreq);
        }

        chain.doFilter(request, response);
    }

    public
 void
 init(FilterConfig filterConfig) throws ServletException {
    }

}

怎么样, 是不是很简单也很方便呢?

成都市作为中国西部地区具有战略地位的核心都市,其人口的空间分布状况对于城市规划、社会经济发展及公共资源配置等研究具有基础性数据价值。本文聚焦于2019年度成都市人口分布的空间数据集,该数据以矢量格式存储,属于地理信息系统中常用的数据交换形式。以下将对数据集内容及其相关技术要点进行系统阐述。 Shapefile 是一种由 Esri 公司提出的开放型地理空间数据格式,用于记录点、线、面等几何要素。该格式通常由一组相互关联的文件构成,主要包括存储几何信息的 SHP 文件、记录属性信息的 DBF 文件、定义坐标系统的 PRJ 文件以及提供快速检索功能的 SHX 文件。 1. **DBF 文件**:该文件以 dBase 表格形式保存与各地理要素相关联的属性信息,例如各区域的人口统计数值、行政区划名称及编码等。这类表格结构便于在各类 GIS 平台中进行查询与编辑。 2. **PRJ 文件**:此文件明确了数据所采用的空间参考系统。本数据集基于 WGS84 地理坐标系,该坐标系在全球范围内广泛应用于定位与空间分析,有助于实现跨区域数据的准确整合。 3. **SHP 文件**:该文件存储成都市各区(县)的几何边界,以多边形要素表示。每个多边形均配有唯一标识符,可与属性表中的相应记录关联,实现空间数据与统计数据的联结。 4. **SHX 文件**:作为形状索引文件,它提升了在大型数据集中定位特定几何对象的效率,支持快速读取与显示。 基于上述数据,可开展以下几类空间分析: - **人口密度评估**:结合各区域面积与对应人口数,计算并比较人口密度,识别高密度与低密度区域。 - **空间集聚识别**:运用热点分析(如 Getis-Ord Gi* 统计)或聚类算法(如 DBSCAN),探测人口在空间上的聚集特征。 - **空间相关性检验**:通过莫兰指数等空间自相关方法,分析人口分布是否呈现显著的空间关联模式。 - **多要素叠加分析**:将人口分布数据与地形、交通网络、环境指标等其他地理图层进行叠加,探究自然与人文因素对人口布局的影响机制。 2019 年成都市人口空间数据集为深入解析城市人口格局、优化国土空间规划及完善公共服务体系提供了重要的数据基础。借助地理信息系统工具,可开展多尺度、多维度的定量分析,从而为城市管理与学术研究提供科学依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值