注意,这里是针对Tomcat容器中get方式提交的servlet中获得参数,参数中有中文的时候乱码的问题:

之前我已经讲过,Tomcat8.0及以上URIEncoding都是utf-8的默认编码,不会出现get方式乱码的问题;

只有Tomcat7.0及以下的版本,默认的URIEncoding才是ISO-8859-1才会出现中文乱码,当然我们也可以在Tomcat的conf中的server.xml中修改默认的URLEncoding来解决此问题(但是我们这里测试是要求不能修改Tomcat容器中的默认编码的时候哦),前面关于Tomcat的编码已经有了详细讲解,链接如下,这里就不再赘述了。

在实现装饰者对getParameter进行加强的时候,我们发现:

HttpServletRequest只是一个接口,我们继承重写不能使用接口;所以我们查阅API发现

其中有一个实现子类HttpServletRequestWrapper,所以后面我们继承自HttpServletRequestWrapper进行重写getParameter!

jsp中的代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试get方式中文乱码</title>
</head>
<body>
<form action="${pageContext.servletContext.contextPath }/servlet/TestEncodingServlet">
name:<input type="text" name="name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

servlet中的代码:

package day03;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class TestEncodingServlet extends HttpServlet { private static final long serialVersionUID = 3996799889172019227L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String name = request.getParameter("name");
System.out.println(name);
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); } }

xml中的配置:

filter中的代码:

package day03;

import java.io.IOException;
import java.io.UnsupportedEncodingException; 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.HttpServletRequestWrapper;
/**
* 解决get方式中文参数乱码问题
* @author mzy
*
*/
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {} @Override
public void destroy() {} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest tmpRequest = (HttpServletRequest)request;
/*
* 如果是POST方式提交
*/
request.setCharacterEncoding("utf-8");
// 装饰者类使用,针对get方式中的中文参数
MyHttpRequest myRequest = new MyHttpRequest(tmpRequest);
/*
* 放行:注意是放行我们装饰之后的request
*/
chain.doFilter(myRequest, response); }
} /**
* 装饰者类
* 1.继承自HttpServletRequestWrapper非final的
* @author mzy
*/
class MyHttpRequest extends HttpServletRequestWrapper {
// 2.声明一个被装饰者类型的成员变量
private HttpServletRequest request; // 3.接收被装饰者类对象
public MyHttpRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
/*
* 4.加强方法:重写getParameter方法
*/
@Override
public String getParameter(String name) {
try {
// 得到原来的参数
String value = request.getParameter(name); // 判断是否是get方式提交的
if ("GET".equals(request.getMethod())) {
value = new String(value.getBytes("ISO-8859-1"), "utf-8");
} return value;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}

解决servlet中get方式中中文乱码问题(二):装饰者模式使用的更多相关文章

  1. servlet的xx方式传值中文乱码

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOEx ...

  2. 在Servlet中出现一个输出中文乱码的问题(已经解)。

    在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResp ...

  3. 解决docker容器中Centos7系统的中文乱码

    解决docker容器中Centos7系统的中文乱码问题有如下两种方案: 第一种只能临时解决中文乱码: 在命令行中执行如下命令: # localedef -i zh_CN -f UTF-8 zh_CN. ...

  4. PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码

    项目环境是php5.3.28 项目用的ThinkPHP3.2.3  已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...

  5. Windows下Git Bash中VIM打开文件中文乱码

    Windows下Git Bash中VIM打开文件中文乱码,解决方法是: 步骤一 admin@DESKTOP-O99620V MINGW64 /d/项目GGE/Hard_for_GGE (master) ...

  6. oracle中imp导入数据中文乱码问题(转)

    (转自  http://blog.chinaunix.net/uid-186064-id-2823338.html) oracle中imp导入数据中文乱码问题 用imp命令向oracle中导入数据后, ...

  7. 处理SecureCRT中使用vim出现中文乱码问题

    处理SecureCRT中使用vim出现中文乱码问题 引用原文:http://blog.chinaunix.net/uid-20639775-id-3475608.html因为cat没有问题,定位是vi ...

  8. 解决get方法传递URL参数中文乱码问题

    [转]解决get方法传递URL参数中文乱码问题 来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下, ...

  9. Servlet相关的几种中文乱码问题

    Servlet相关的几种中文乱码问题浏览器调用jsp,html等页面中文显示乱码使得文件本身以utf-8字符集编辑保存 让浏览器浏览器以utf-8字符集解析 在浏览器中右键选择编码格式为utf-8: ...

  10. 解决@ResponseBody注解返回的json中文乱码问题

    1. 简介 主要解决@ResponseBody注解返回的json中文乱码问题. 2.解决方案 2.1mvc加上注解(推荐此方法) 在mvc配置文件中假如下面配置(写在 <mvc:annotati ...

随机推荐

  1. Redux-基本概念

    相关文档 1)         英文文档: https://redux.js.org/ 2)         中文文档: http://www.redux.org.cn/ 3)         Git ...

  2. Python+Requests+Xpath(解析)爬取某站点简历图片(数据分析三)

    1.环境安装 pip install lxml 2.解析原理 使用通用爬虫爬取网页数据 实例化etree对象,且将页面数据加载到该对象中 使用xpath函数结合xpath表达式进行标签定位和指定数据提 ...

  3. python + mysql 实现查询表数据

    实例如下: import pymysqldef select_form(): # 打开数据库连接 db = pymysql.connect("localhost", "r ...

  4. 技术期刊 · 天光台高未百尺 | Uber 工程师的 JS 算法课;大数据时代的个人隐私;设计师的 Github;告别 PPT 工程师;从零开始实现的像素画

    蒲公英 · JELLY技术期刊 Vol.42 这是一个最好的时代,多样化的平台给了所有人成长发展的机会,各种需求和解决需求的人让人大开眼界:但这也并不是完美的时代,"前端还需要懂什么算法?& ...

  5. noip模拟26[肾炎黄·酱累黄·换莫黄]

    \(noip模拟26\;solutions\) 这个题我做的确实是得心应手,为啥呢,因为前两次考试太难了 T1非常的简单,只不过我忘记了一个定理, T2就是一个小小的线段树,虽然吧我曾经说过我再也不写 ...

  6. Redis内部阻塞式操作有哪些?

    Redis实例在运行的时候,要和许多对象进行交互,这些不同的交互对象会有不同的操作.下面我们来看看,这些不同的交互对象以及相应的主要操作有哪些. 客户端:键值对的增删改查操作. 磁盘:生成RDB快照. ...

  7. Python - 对象赋值、浅拷贝、深拷贝的区别

    前言 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 这里会讲三个概念:对象赋值.浅拷贝.深拷贝 名词解释 变量:存储对象的引用 对象:会被分配一块内存,存储实际的数据,比如 ...

  8. 大数据学习(05)——MapReduce/Yarn架构

    Hadoop1.x中的MapReduce MapReduce作为Hadoop最核心的两个组件之一,在1.0版本中就已经存在了.它包含这么几个角色: Client 多数情况下Client的作用就是向服务 ...

  9. ElasticSearch入门检索

    前面简介说到 elsatic是通过RestFul API接口操作数据的,可以通过postman模拟接口请求测试一下 一._cat 1.GET /_cat/nodes:查看所有节点 2.GET /_ca ...

  10. Java基础——逻辑运算符、位运算符

    逻辑运算符.位运算符.三元运算符 逻辑运算符  public class Demon05 {     public static void main(String[] args) {          ...