Java Web开发中的乱码问题
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开发中的乱码问题的更多相关文章
- Java Web开发中路径问题小结
Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...
- Java Web 开发中路径相关问题小结
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...
- Java Web开发中MVC设计模式简介
一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...
- java web开发中常用的协议的使用和java-web 常见的缓冲技术
一.DNS协议 作用将域名解析为IP 类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...
- Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)
看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...
- Java Web 开发中的中文乱码与解决方式
乱码产生的原因 不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的.以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器 ...
- JAVA WEB开发中的资源国际化
为什么要国际化? 不同国家与地区语言,文化,生活习惯等差异.在数字,时间,语言,货币,日期,百分数等的不同. 两个名词: I18N:即资源国际化,全称为Internationalization,因为首 ...
- Java Web开发中的名词解释
1.JVM Java虚拟机,class文件的运行时环境,就好比软件运行在操作系统一样,java要运行在JVM中才行,这也是Java之所以支持扩平台的基础. 2.Servlet/JSP 是满足一定接口需 ...
- java web开发中的奇葩事web.xml中context-param中的注释
同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步 ...
随机推荐
- 编写计算器程序学习JS责任链模式
设计模式中的责任链模式能够很好的处理程序过程的逻辑判断,提高程序可读性. 责任链模式的核心在于责任链上的元素判断能够处理该数据,不能处理的话直接交给它的后继者. 计算器的基本样式: 通过div+css ...
- T-SQL:探究UNOIN,INTERSECT,EXCEPT集合运算符(十一)
1.UNOIN运算符 unoin合并了两个输入查询结果 并消除重复项 简单点说 就是输出并集 SELECT country, region, city FROM HR.Employees UNI ...
- ModBus通信协议的【主从模式】
主从模式 (1) 至少且只有一个主机,其他的都是从机 (2) 不管任何时候,从机都不能主动向主机发送数据 (3) 主机具有访问从机的权限,从机不可以主动访问从机,任何一次数据交换,都要由主机发起 (4 ...
- 【原】继承AbstractRoutingDataSource再通过AOP实现动态数据源切换
关于AbstractRoutingDataSource动态切换数据源是我在研究某开源项目时候才注意到的,大概就看懂了Spring AOP切面这里,根据作者的意思是通过继承这个抽象类可以实现数据源的动态 ...
- 封装方法公共文件common.js
/** * Created by Administrator on 2017/3/24. */ /** * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值 ...
- 【代码笔记】Web-Javascript-JavaScript简介
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- Flutter 不一样的跨平台解决方案
本文主要介绍Flutter相关的东西,包括Fuchsia.Dart.Flutter特性.安装以及整体架构等内容. 1. 简介 Flutter作为谷歌最近推出的跨平台开发框架,一经推出便吸引了不少注意. ...
- Android滑动菜单使用(MenuDrawer和SlidingMenu)
项目地址: https://github.com/gokhanakkurt/android-menudrawer https://github.com/jfeinstein10/SlidingMe ...
- 什么是DDoS攻击?DDoS防御的11种方针详解
对于遭受DDOS攻击的情况是让人很尴尬的,如果我们有良好的DDoS防御方法,那么很多问题就将迎刃而解,我们来看看我们有哪些常用的有效地方法来做好DDoS防御呢. 对于DDoS防御的理解: 对付DDOS ...
- Linux vsftd配置文件
vi /etc/vsftpd.conf listen=YES userlist_deny=NO userlist_enable=YES anonymous_enable=YES local_enabl ...