重温Servlet学习笔记--编码问题

在说编码问题之前,首先先了解一下常见的字符编码:

  • ISO-8859-1:  拉丁编码,不支持中文
  • gbk,gb2312,gb18030:系统默认编码,是中国的国标码
  • utf-8: 支持几乎所有语言的编码,一般我们同意用这个

  为什么为出现乱码问题呢?我们知道web程序通常就是服务器和客户端之间的通信,服务器的默认编码是ISO,而浏览器的默认编码不太统一,一般浏览器会默认是gbk编码,这样,当传送数据的时候就会很容易出现乱码问题了.

  • 响应(response)编码

    服务器发送给客户端数据!响应是由response对象来完成,如果响应的数据不是字符数据,那么就无需去考虑编码问题。当然,如果响应的数据是字符数据,那么就一定要考虑编码的问题了.

    1. 当使用response.getWriter()来向客户端发送字符数据时,如果在之前没有设置编码,那么默认使用iso,因为iso不支持中文,一定乱码
    2. 使用response.getWriter()之前可以使用response.setCharaceterEncoding()来设置字符流的编码为gbk或utf-8,当然我们通常会选择utf-8。这样使用response.getWriter()发送的字符就是使用utf-8编码的。但还是会出现乱码!因为浏览器并不知道服务器发送过来的是什么编码的数据!这时浏览器会使用gbk来解码,所以乱码!
    3. 在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")来设置响应头,通知浏览器服务器这边使用的是utf-8编码,而且在调用setHeader()后,还会自动执行setCharacterEncding()方法。这样浏览器会使用utf-8解码,所以就不会乱码了!
    4. setHeader("Content-Type", "text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8);

      response.setContentType("text/html;charset=utf-8");
      response.setCharacterEncoding("utf-8");

      通常我们只调用第一句即可,他会默认调用第二句.

  • 请求(request)编码

  客户端发送给服务器的请求参数是什么编码?
    客户端首先要打开一个页面,然后在页面中提交表单或点击超链接!在请求这个页面时,服务器响应的编码是什么,那么客户端发送请求时的编码就是什么。
   服务器端默认使用什么编码来解码参数?
    服务器端默认使用ISO-8859-1来解码!所以这一定会出现乱码的!因为iso不支持中文!
   请求编码处理分为两种:GET和POST:GET请求参数不在请求体中,而POST请求参数在请求体中,所以它们的处理方式是不同的!
   GET请求编码处理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在server.xml中配置URIEncoding=utf-8
   POST请求编码处理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在获取参数之前调用request.setCharacterEncoding("utf-8");

  • URL编码

  表单的类型:Content-Type: application/x-www-form-urlencoded,就是把中文转换成%后面跟随两位的16进制。
    为什么要用它:在客户端和服务器之间传递中文时需要把它转换成网络适合的方式。

  1.   它不是字符编码!
  2.   它是用来在客户端与服务器之间传递参数用的一种方式!
  3.   URL编码需要先指定一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换成16进制。前面再添加一个%。
  4.   POST请求默认就使用URL编码!tomcat会自动使用URL解码!
  5.    URL编码:String username = URLEncoder.encode(username, "utf-8");
  6.   URL解码:String username = URLDecoder.decode(username, "utf-8");
时间: 2024-12-25 14:17:06

重温Servlet学习笔记--编码问题的相关文章

重温Servlet学习笔记--Cookie对象

首先要了解cookie必须得先了解http协议,,Cookie是http协议指定的,先由服务器保存cookie到浏览器,在下次浏览器请求服务器时把上次请求得到的cookie归还给服务器,cookie以键值对的形式保存在本地的缓存中. HTTP协议规定: 1个cookie最大4kb 一个服务器最多向一个浏览器保存20个cookie 一个浏览器最多保存300个cookie 注意,不同浏览器还是略有差异,不是所有浏览器都老老实实的遵守这个规定. cookie的用途举例: 服务器使用cookie来跟踪客

重温Servlet学习笔记--response对象

在用户浏览网页时,服务器对于客户端浏览器做出的响应被封装成一个HttpServletResponse对象,要对浏览器操作只需要操作这个response对象即可.response的功能分类及介绍: 响应正文 response是响应对象.向客户端输出响应正文(响应体)可以使用response的响应流,response提供了两个响应流对象: PrintWriter printWriter = response.getWriter();  只能写字符流,如输出text信息 ServletOutputSt

重温Servlet学习笔记--request对象

request和response是一对搭档,一个负责请求一个负责响应,都是Servlet.service()方法的参数,response的知识点前面梳理过了,这里只说一下request,在客户端发出每个请求时,服务器都会创建一个request对象,把请求的数据封装到request中,然后在调用Servlet.service()中传递进去.我们在创建一个servlet时通常会使用doGet或者doPost方法,并没有看到service()方法,就是因为父类的service方法已经读取到了reque

重温Servlet学习笔记--session对象

session的类型是属于HttpSession,HttpSession是由javaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端. HttpSession是servlet三大域对象之一,其他两个是request和application(servletContext),所以它也有setAttribute(),getAttribute(),等方法. HttpSession的会话范围是某用户从首次访问服务器开始,到该用户关闭浏览器结束,session对象会存活在这中间的

重温Servlet学习笔记--servletContext对象

一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对象在tomcat启动时就创建,在tomcat关闭时才被销毁.有时候我们也把这个对象叫做application. ServletContext对象的作用就是在整个web应用的动态资源之间共享数据,比如在AServlet中向ServletContext中保存一个数据,然后在Bservelt中获取这个数据

Servlet学习笔记(八)—— 自定义过滤器的编写改进:自定义实现FilterChain

笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,但是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤,最后response过滤,并且中间几项过滤的顺序不能动态改变.所以这里做个改进,实现一个过滤顺序的FilterChain. 多个Filter的执行顺序在这篇博文中得到很仔细的讲解,总结一点,多个过滤器的执行顺序是根据web.xml中不同<filter-mapping>的顺序来先后执行的,比如: <?xml version="1.0"

JavaWeb 后端 &lt;二&gt; 之 Servlet 学习笔记

JavaWeb 后端 <二> 之 Servlet 学习笔记 一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException ServletRequest req:代表着请

Servlet学习笔记(七)—— JSP概述

1.Servlet两个缺陷: ①所有HTML标签必须包在Java字符串中,使得发送HTTP响应十分繁琐: ②所有文本和HTML标签都必须进行硬编码,即使对表示层做极其微小的修改,也需要重新编译. 2.注释: (1)JSP备注:<% %>,不会发送到浏览器,不能嵌套 (2)HTML备注:<!-- -->,不被容器处理,直接发送到浏览器,用途之一是标识JSP页面.在处理带有许多JSP片段的应用程序时,开发者通过查看HTML源代码,可以轻松查出某个HTML代码部分生成了那个JSP页面.

Servlet学习笔记(六)—— 自定义过滤器的编写

Boss今天让我写一个类似BBS留言板的过滤器,要求对字符编码.登录权限.敏感词进行过滤操作. 总体分两模块: 一.过滤器 //Filter.java package lewa; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public interface Filter { public void init(); public void doFilter(ServletRequest reu