打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于JSP/Servlet字符编码

首先,来说一下HTML和JSP的区别:

HTML属于前台,纯展示页面,请求HTML时,容器(如Tomcat)会读取HTML文件的内容,通过socket遵循HTTP协议发送到浏览器;

JSP属于后台,请求JSP时,容器会首先读取JSP文件的内容,然后根据JSP文件内容生成对应的java类文件(这个类是继承自HttpJspBase的,而HttpJspBase是继承自HttpServlet的,所以JSP生成了一个对应的Servlet),接着编译出class文件(在Tomcat中,生成java和class文件是由 org.apache.jasper.compiler.Compiler 完成的),然后由Tomcat类加载器加载class文件,由生成的Servlet来处理请求,最后由HttpServletResponse以"text/html;charset=UTF-8"的形式发送到浏览器,显示HTML。

 

通常,在JSP中的Java代码中,或在Servlet的doGet、doPost中,调用request.getParameter(name)获取前台传来的参数时,经常会出现乱码问题。

乱码问题,究其原因,就是因为 前台页面编码、前台发请求时传参数所用编码、后台JSP/Servlet中从socket流读取参数解析参数时所用编码不统一。

首先,编写HTML文件时,就应该明确规定页面采用的编码:

  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

页面采用的编码,就是form提交时采用的编码,如果页面不明确指定编码,就会由浏览器自己决定了,这就出现了极大的不确定性。

指定编码时:


不指定编码时:



对于Chrome、Firefox也是如此。 

Tomcat读取JSP页面内容采用的编码:


这张图画的有问题,Tomcat的代码写的太绕了,想知道详情,就去看代码吧[ParserController.determineSyntaxAndEncoding()]

因此,如果在JSP中pageEncoding和contentType都不指定的话,显示出来的页面可能会出乱码。


当使用JSP/Servlet获取前台传递的参数时:

  1. <%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>  
  2. <%@page import="java.util.Enumeration"%>  
  3. <%  
  4.     out.println("Headers<br>");  
  5.     Enumeration headers = request.getHeaderNames();  
  6.     String name;  
  7.     while(headers.hasMoreElements()) {  
  8.         name = headers.nextElement()+"";  
  9.         out.println(name + " : " + request.getHeader(name));      
  10.         out.println("<br>");  
  11.     }  
  12.     out.println("<br>");  
  13.       
  14.     String v = request.getParameter("v");  
  15.     String username = request.getParameter("username");  
  16.     String password = request.getParameter("password");  
  17.       
  18.     out.println("Default encoding:");  
  19.     out.println("v=" + v);  
  20.     out.println("username=" + username);  
  21.     out.println("password=" + password);  
  22.     out.println("<br>");  
  23.       
  24.     out.println("GB2312:");  
  25.     out.println("v=" + new String(v.getBytes("ISO-8859-1"), "GB2312"));  
  26.     out.println("username=" + new String(username.getBytes("ISO-8859-1"), "GB2312"));  
  27.     out.println("password=" + new String(password.getBytes("ISO-8859-1"), "GB2312"));  
  28.     out.println("<br>");  
  29.       
  30.     out.println("UTF-8:");  
  31.     out.println("v=" + new String(v.getBytes("ISO-8859-1"), "UTF-8"));  
  32.     out.println("username=" + new String(username.getBytes("ISO-8859-1"), "UTF-8"));  
  33.     out.println("password=" + new String(password.getBytes("ISO-8859-1"), "UTF-8"));  
  34.     out.println("<br>");  
  35. %>  


如果HTML中没有在meta的http-equiv中指定Content-Type,提交form的时候:


如果HTML中指定了Content-Type:




Tomcat在读取参数时,如果在HTTP Request Header中没有指定Content-Type,读取参数流使用的编码是“ISO-8859-1”,这个参数由request.setCharacterEncoding()指定,不过需要在第一次执行request.getParameter()之前调用才可以。通过这个API,可以使用编码过滤器的方式来免去JSP/Servlet中获取参数时需要进行的编码转换。

  1. package jspservlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11.   
  12. public class EncodingFilter implements Filter {  
  13.     @Override  
  14.     public void init(FilterConfig filterConfig) throws ServletException {  
  15.     }  
  16.   
  17.     @Override  
  18.     public void doFilter(ServletRequest request, ServletResponse response,  
  19.             FilterChain chain) throws IOException, ServletException {  
  20.         request.setCharacterEncoding("UTF-8");  
  21.           
  22.         chain.doFilter(request, response);  
  23.     }  
  24.   
  25.     @Override  
  26.     public void destroy() {  
  27.     }  
  28. }  

添加了这个EncodingFilter之后,再调用request.getParameter()就不用再new String(value.getBytes("ISO-8859-1"), "UTF-8")了。

对于在url传递的参数,请配置URIEncoding="UTF-8"


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
request对象和response对象
JSP乱码杂谈
JavaWeb学习篇之
Laszlo3.0中文全解决
解决web服务器各种应用的乱码问题,欢迎补充和讨论
Java中如何正确使用字体编码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服