注意,这里是针对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. Java 使用新方法打印Word文档

    前言 我曾写过一篇文章,它主要介绍了如何通过物理打印机和虚拟打印机来打印Word文档.今天这篇教程将介绍一种新的方法来实现对Word文档的打印. 此次使用到的类库仍然是Spire.Doc for Ja ...

  2. 看懂UML类图笔记

    在学习设计模式的时候,经常会遇到UML类图,所以就找了一些资料,做一些笔记. 从一个示例开始 下面这个类图,类之间的关系是我们需要关注的: 车的类图结构为<<abstract>> ...

  3. Error: Could not find or load main class ***

    jni 本地方法的总结 1,第一步,javah D:\wksp_study\designbook\target\classes> //clas文件所在目录执行 javah -cp D:\wksp ...

  4. 构建前端第3篇之---使用scss

    张艳涛 写于2021-1-20 主要解决俩个问题: 在单个vue文件中 <style rel="stylesheet/scss" lang="scss"& ...

  5. javascript获取焦点对象ID

    document.activeElement 方法:if(document.activeElement.id="textbox1") { }

  6. 关于vue3简单状态管理约定引发的思考

    官方文档的代码是这样的 export const store = { debug: true, state: reactive({ message: 'Hello!' }), setMessageAc ...

  7. transform——转换

    ① 位移 transform:translate(x,y);     同时x轴和y轴的位移 translate(x);        在x轴上的位移 同 translateX(x) translate ...

  8. URI 未注册(设置 | 语言和框架 | 架构和 DTD)

    创建xml文件导入资源出错 解决方法:点击左边的小红灯,选择获取外部资源,加载资源即可

  9. MIPS汇编学习

    MIPS汇编学习 mips汇编不同于x86汇编,属于精简指令集,常见于路由器等一些嵌入式设备中. mips汇编没有对堆栈的直接操作,也就是没有push和pop指令,mips汇编中保留了32个通用寄存器 ...

  10. PrismWPF网盘

    技术点 文件分片上传与下载 Vue 正在努力中.... 客户端 采用 WPF:Net5+Prism8+RestSharp 客户端基本结构如下 模块说明 Model: 主要放置Prism模块 ZFile ...