JavaWeb 修炼之路(六)请求和响应中的编码

来源:互联网 发布:查重率软件 编辑:程序博客网 时间:2024/06/02 02:33

编码

常见字符编码:iso-8859-1(不支持中文)、gbk(系统默认编码,中国的国际码)、utf-8(万国码,支持全世界编码)

下面这张图是服务端向客户端发送数据的编解码过程:
响应编码原理

这个是客户端请求后,在服务端获取参数的解码过程:
服务端解码

GET请求编码设置:需要在Tomcat的/conf/server.xml中添加一句话(最好不要用!)
get请求设置

尽量使用一下方法:
String name = request.getParameter("name");
byte[] bytes = name.getBytes("ISO-8859-1");
name = new String(bytes,"utf-8");


  1. 响应编码:

  • 当时用response.getWriter()来向客户端发送字符数据时,如果在之前没有设置编码,默认使用iso。因为iso不支持中文,所以一定会出现乱码;
  • 当使用response.getWriter()之前可以使用response.setCharacterEncoding()来设置字符流的编码为gbk或utf-8
  • 在使用response.getWriter()之前可以用response.setHeader("Content-Type","text/html;charset=utf-8")来设置响应头,通知浏览器这边使用的是
  • response.setHeader("Content-Type","text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8")
  • 请求编码:
    • 客户端发送给服务器的请求参数是什么编码:客户端首先打开一个页面,然后在页面中提交表单或者点击超链接!在请求这个页面时,服务器响应的编码是什么,客户端发送请求时的编码就是什么;
    • 服务器端默认使用什么编码来解码参数:服务器默认使用iso-8859-1来解码!所以一定会出现乱码!因为iso不支持中文!
    • GET请求编码处理:
      • String username = new String(request.getParameter("iso-8859-1"),"utf-8");
      • server.xml中配置URIEncodeing=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,就是把中文转换成%后面跟随两位的十六进制为什么要用 ?在客户端和服务器之间传递中文时,需要把它转换成网络适合的方式。
    • 它不是字符编码;
    • 它是用来在客户端和服务器之间传递参数的一种方式;
    • URL编码需要先指定一种字符编码,把字符串解码后得到字节数组,然后把小于0的字节+256,再转换成16进制,前面加个“%”;
    • POST请求默认使用URL编码!Tomcat会自动使用URL解码!
    • URL编码:String username = URLEncoder.encode(username,"utf-8")
    • URL解码:String username = URLDecoder.decode(username,"utf-8")
    1. ![URL编解码](http://img.blog.csdn.net/20170612092234970?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM4ODI5NDMx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)最后需要把链接中的中文参数,使用URL编码!
    ## 路径 ##
    • web.xml中<url-pattern>路径
      • 要么以“*”开头,要么以“/”开头
    • 转发和包含路径
      • (常用)以“/”开头:相对当前项目路径;
      • 不以“/”开头:相对当前Servlet路径;
    • 重定向路径(客户端路径)
      • 以“/”开头,相对当前主机,所以需要自己手动添加项目;
    • 页面中超链接和表单路径
      • 与重定向相同,都是客户端路径,需要添加项目名!
    • ServletContext获取资源路径
      • 相对当前项目目录,即当然index.jsp所在目录;
    • ClassLoader获取资源路径
      • 相对classes目录
    • Class获取资源路径
      • 以“/”开头相对classes目录
      • 不以“/”开头相对当前.class文件所在目录