Java 解决中文乱码问题

Java 解决中文乱码问题一:服务端解析客户端二:客户端解析服务端三:Filter设置编码四:Get提交中文乱码

大家好,又见面了,我是你们的朋友全栈君。

一:服务端解析客户端

<% request.setCharacterEncoding("GB18030") %>

      在服务端解析客户端的编码设置(即服务器接收浏览器发送的数据),采用GB18030的方式,但是这样有一点不好,如果我有1000个页面(.jsp)需要设置需要重复写这样的语句1000条,重复工作,针对此问题的解决,下面给出了解决方案


二:客户端解析服务端

<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>

      客户端解析服务端返回的数据的编码方式(即浏览器呈现的页面的编码方式),如果一个.html 想改为.jsp,必须添加此句


三:Filter设置编码

public class CharsetEncodingFilter implements Filter { 
   
    private String encoding="";
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
        //设置字符集,拦截request请求
        request.setCharacterEncoding(this.encoding);
        //继续往下执行,这体现了职责链模式
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化时,通过参数读取filter的配置文件的value值,即读取设置的编码方式
        this.encoding = filterConfig.getInitParameter("encoding");
    }
}

需要注意的几点:

  • Filter是在tomcat启动时new的,生命是由tomcat控制的
  • Filter只对Post请求起作用
  • Filter其实是对Request和Response请求进行了拦截
  • Filter可看作是一种横切性的技术,面向切面的变成
  • Filter体现了“职责链模式”
  • 实现Filter需要实现javax.servlet.Filter接口,还要在web.xml文件中进行配置
  • Filter提供了一种声明式服务,声明式服务非常强大,具有可插拔能力
    • 声明式服务
      • 只需要声明在哪里where做什么what,而不需关心如何实现how(体现为要在web.xml声明对哪个文件wher设置那种编码what,具体怎么实现写在了filter类中)
    • 编程式服务
      • 需要以具体的代码表达在哪里where做什么what,如何实现how
        配置文件web.xml设置如下:
<filter>
        <filter-name>CharsetEncodingFilter</filter-name>
        <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> <!-- 具体的类路径 -->  
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
            <!-- 体现了键值对,设置参数,在filter类中可根据encodign参数,取值GBK -->   
        </init-param>
    </filter>

    <filter-mapping>
        <!-- 对所有的.jsp起作用--> 
        <url-pattern>*.jsp</url-pattern>    
    </filter-mapping>

如果想对别的文件也起作用:再添一个映射即可

    <filter-mapping>
        <filter-name>CharsetEncodingFilter</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

匹配文件的一种写法:

  • 精准匹配 写完整的路径
  • 扩展匹配,有星号*和扩展名组成,如*.jsp
  • 路径前缀匹配,包含一个目录和一个/*,如/servlet/*,但不能写/servlet/*.jsp
  • 全部匹配,一般使用/*
    执行过程:
    Java 解决中文乱码问题
    这样不用在每个.jsp中设置了,每次在请求服务端时,都会先走Filter,设置一下编码

四:Get提交中文乱码

      上面提到,Filter只对Post提交起作用,那么当Get提交时,怎么设置那,难道只能每个.jsp都要写一遍吗,当然不是,

  • Get提交可以考虑改变服务器的配置,如Tomcat需要修改conf下的server.xml文件,如:
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GB18030"/>
  • 对中文采用java.net.URLEncoder.encode()进行编码,如重定向时URL中有中文:
response.sendRedirect(request.getContextPath() + "/item_maint.jsp?errorMessage=" + URLEncoder.encode(errorMessage,"GB18030"));

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156987.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • .net 开源框架「建议收藏」

    .net 开源框架「建议收藏」开源框架:CastleCastle是由HamiltonVerissimo撰写的,从2003年就开始开发,并在2006年11月发布了1.0RC2。2007年09发布了1.0RC3版本。Castle是个轻量级(Lightweight)容器(Container)、实现IoC(InversionofControl)概念,是一个全方位的应用程序(Application)框

    2022年7月15日
    16
  • springboot—@Async实现异步调用及异步回调Future「建议收藏」

    springboot—@Async实现异步调用及异步回调Future「建议收藏」异步调用相对的是同步调用。同步方法调用的时候必须是按照顺序执行的,上一行代码执行完,才会执行下一行。而异步方法调用是相当于多个线程执行,不需要等待上一行代码的执行结果。首先测试方法同步的情况:controller:packagespringboot_async.async_test;importorg.springframework.beans.factory.annot…

    2022年7月27日
    39
  • spring boot 系列之八:SpringBoot处理定时任务

    项目经常会用到定时任务,springboot自然是可以通过整合相关组件来实现的。目前常用的定时任务的实现有两种:通过spring自带的定时器任务@Schedule来实现通过Quartz来实现

    2022年2月16日
    39
  • Rider2021 激活码(注册激活)[通俗易懂]

    (Rider2021 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    1.5K
  • 年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中[通俗易懂]

    年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中[通俗易懂]大家好,我是不学前端的前端程序员,事情是这个样子的,前几天不是双十一预购秒杀嘛由于我女朋友比较笨,手速比较慢,就一直抢不到,她没抢到特价商品就不开心,她不开心,我也就不能跟着开心,就别提看6号的全球总决赛了为了解决这个问题,就决定写一个自动定时抢购的脚本。第一步:首先我的思路很简单,就是让“程序”帮我们自动打开浏览器,进入淘宝,然后到购物车等待抢购时间,自动购买并支付。第二步:导入模块,我们需要一个时间模块,抢购的时间,还有一个Python的自动化操作。代码如下:importd

    2022年4月29日
    74
  • WPF Visifire图表控件使用基础

    WPF Visifire图表控件使用基础https://www.cnblogs.com/wyuan/archive/2012/07/22/WPF.html引言:  由于项目中需要使用Visifire所以自己就写了一些demo,大家一起共享!基础Visifire图表的展示1.Visifire的创建需要引用的DLL包【WPFToolkit.dll;WPFVisifire.Charts;WPFVisifire.Gauges(这个以后会用到)】2

    2022年7月21日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号