POST方法乱码:

1:存在乱码的示例:

前端页面:

<%@ page language="java" contentType="text/html; charset=UTF-8" //设置UTF8编码
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 头作用,告诉浏览器UTF8编码 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<base href="<%=basePath%>">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<form action="Encode" method="post">
Name:<input name="name" type="text" /> <br> Sex:<input
type="text" name="sex" /><br>
<button type="submit">发送</button>
</form>
</div> </body>
</html>

后台Servlet接受参数:

package com.daxin;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class Encode
*/
public class Encode extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //默认编码是ISO8859-1
String name = request.getParameter("name");
String sex = request.getParameter("sex");
System.out.println(name);
System.out.println(sex); } }

当我们启动输入中文时候,打印的是:

?¤§é??
??·

乱码,这个问题的原因就是:Servlet的方法的所有方法默认解码都是ISO-8859-1,而我们前端页面编码是UTF8,所以导致解码乱码!这种方式也存在解决方案:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //默认编码是ISO8859-1
String name = request.getParameter("name");
String sex = request.getParameter("sex"); System.out.println(name);
System.out.println(sex); //由于上面是ISO编码错误,所以还原之后再使用UTF8编码
String newName = new String(name.getBytes("ISO-8859-1"),"UTF-8");
String newSex = new String(sex.getBytes("ISO-8859-1"),"UTF-8"); System.out.println(newName);
System.out.println(newSex); }

第二种更优解决方案:设置全局的UTF-8编码

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //全局设置UTF8编码,该方法只对实体内容中的数据起作用。post的数据是实体内容中的。所以该设置只对post起作用。get方法不起作用
request.setCharacterEncoding("UTF-8");
//默认编码是ISO8859-1
String name = request.getParameter("name");
String sex = request.getParameter("sex"); System.out.println(name);
System.out.println(sex);
}

GET乱码问题:

由于request.setCharacterEncoding("UTF-8");方法只对实体内容编码起作用,换言之就是只对Post有效,对于GET方法请求依旧无法生效。所以针对Get请求我们只能手动解码:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //默认编码是ISO8859-1
String name = request.getParameter("name");
String sex = request.getParameter("sex");
//由于上面是ISO编码错误,所以还原之后再使用UTF8编码
String newName = new String(name.getBytes("ISO-8859-1"),"UTF-8");
String newSex = new String(sex.getBytes("ISO-8859-1"),"UTF-8"); System.out.println(newName);
System.out.println(newSex); }

但是通常我们一般都只是实现一个Post方法逻辑,而是将GET请求逻辑转给Post处理,所以此时比较健全的写法是:

package com.daxin;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class Encode
*/
public class Encode extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 全局设置UTF8编码,该方法只对实体内容中的数据起作用。post的数据是实体内容中的
request.setCharacterEncoding("UTF-8");
// 默认编码是ISO8859-1
String name = request.getParameter("name");
String sex = request.getParameter("sex");
if ("GET".equals(request.getMethod())) {
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
} if ("GET".equals(request.getMethod())) {
sex = new String(sex.getBytes("ISO-8859-1"), "UTF-8");
} System.out.println(name);
System.out.println(sex); } }

结论:乱码问题出现,就是因为编码和解码时候使用的不是一个编码,最终导致乱码。所以解决问题的核心思路就是使用同一个编码解码器。前端一般使用的是UTF8编码,后台默认是ISO8859-1,所以我们将后台解码器使用UTF8即可解决编码问题。

Java Web开发中的乱码问题的更多相关文章

  1. Java Web开发中路径问题小结

     Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  2. Java Web 开发中路径相关问题小结

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...

  3. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  4. java web开发中常用的协议的使用和java-web 常见的缓冲技术

    一.DNS协议 作用将域名解析为IP   类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...

  5. Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)

    看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...

  6. Java Web 开发中的中文乱码与解决方式

    乱码产生的原因 不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的.以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器 ...

  7. JAVA WEB开发中的资源国际化

    为什么要国际化? 不同国家与地区语言,文化,生活习惯等差异.在数字,时间,语言,货币,日期,百分数等的不同. 两个名词: I18N:即资源国际化,全称为Internationalization,因为首 ...

  8. Java Web开发中的名词解释

    1.JVM Java虚拟机,class文件的运行时环境,就好比软件运行在操作系统一样,java要运行在JVM中才行,这也是Java之所以支持扩平台的基础. 2.Servlet/JSP 是满足一定接口需 ...

  9. java web开发中的奇葩事web.xml中context-param中的注释

    同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步 ...

随机推荐

  1. 查找第K小的数 BFPRT算法

    出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...

  2. 大话DI依赖注入+IOC控制反转(一) 之 定义

    转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转      依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...

  3. .net dll反编译出现的问题,以及部分修复的方法

    常用.net反编译工具 1.Reflector 9.0.2 2.JustDecompile2015.3.928.0j 3.ILSpy 4.CS资源文件批量转换工具 base.AutoScaleMode ...

  4. SpringCloud初体验之Eureka

    Eureka简介 SpringBoot简化了Spring工程的复杂度,之前复杂的Spring工程被拆分成了一个个小的SpringBoot工程.那么SpringBoot之间如何通讯,相互获取信息呢?这就 ...

  5. ssr 之Nuxt.js

    ssr:server side rendering(服务端渲染),目的是为了解决单页面应用的 SEO 的问题,对于一般网站影响不大,但是对于论坛类,内容类网站来说是致命的,搜索引擎无法抓取页面相关内容 ...

  6. The open source JavaScript graphing library that powers Plotly

    https://plot.ly/javascript/time-series/ https://plot.ly/javascript/ https://github.com/plotly/plotly ...

  7. python之socketserver ftp功能简单讲解

    TCP协议中的socket一次只能和一个客户端通信,然而socketserver可以实现和多个客户端通信. 它是在socket的基础上进行了一层封装,底层还是调用的socket # 服务端 impor ...

  8. php向数据库插入数据

    <?php header("Content-type: text/html;charset=utf-8"); $con = mysql_connect("local ...

  9. ArcGIS for Server 的修改IP问题

      ArcGIS for Server 的修改IP问题   1. [arcgisserver@centos6 ~]$ vi /home/arcgisserver/serverconfig/config ...

  10. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...