最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,先说下我的环境,servlet容器使用Tomcat6.0,浏览器FireFox3.0、IE7,涉及字符编码设置的地方我的思路就是编码的地方都统一使用UTF-8。所有页面的charset设置为UTF-8。特别注意Tomcat默认的编码URIEncoding是ISO-8859-1。这样就会造成页面传送参数之间的乱码问题。通过两天的学习,终于发现了其中的原理,下面将做一总结:
一:首先我们看下,一个请求响应的流程
浏览器 IE/FireFox ----------->Servlet容器------------------------>显示页面
编码 使用容器的URIEncoding转码 解码
我把用户发送请求方式不同引起的中文问题划分了四种类型:
1、表单的get提交
浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器,首先进入对应的字符编码过滤器,(如果有的话),不过Tomcat6.0对于get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文字符串。那么,响应页面的中文因为页面的统一编码(UTF-8)自然也会正常显示(为了保险起见,也可在响应页面添加一段代码:request.setCharacterEncoding("UTF-8")可保证servlet在传输过程中都是UTF-8;)。当然,如果我们Tomcat的URIEncoding设置为其他非UTF-8的编码方式时,页面的内容进入Tomcat解析时,因为Tomcat和页面的编码不统一,就需要转码,例如,如果我们采用Tomcat默认的ISO-8859-1,那么当我们使用request.getParameter("yourVariable ")获取表单参数值时其实Servlet就进行了转码,方式为UTF-8-->ISO-58859-1。代码为:
new String(变量值.getBytes("UTF-8"),"ISO-8859-1");
不过即使这样,我们依然可以使用不恰当的方法显示正常的中文,即逆向转码,例如上面的乱码,我们可以通过ISO8859-1-->UTF-8这种方式还原我们提交时的中文。
new String(乱码.getBytes("ISO-8859-1"),"UTF-8");这样就可以转码,所以综上来看,Tomcat的URIEncoding设置为UTF-8是最好的解决办法。
2、表单的post提交
对于这种方式的请求,request.setCharacterEncoding("一般来自于web.xml中过滤器设置的参数")方法进行编码设置将会产生作用,struts的表单提交方式默认为post方式,那么按照上面我的环境设置,页面,容器,都采用UTF-8编码方式,就不会产生中文乱码问题。
3、页面链接传递中文参数
<% String username = "编辑"; %>
<a href="hello.do?username=<%=username%>">页面中链接传递中文</a>
对于这样方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,
<% String username = java.net.URLEncoder.encode("编辑","UTF-8"); %>
分享到:
相关推荐
《深入解析Tomcat的工作原理》 一、简介与概览 Apache Tomcat是基于Java的开源Web服务器,它不仅能够运行Java Servlet,还能部署和执行Java Server Pages (JSP)技术,以及支持Java Web应用程序所需的其他标准协议...
**模拟Tomcat工作原理** Tomcat是一款开源的Java Servlet容器,它是Apache软件基金会下的Jakarta项目的一部分,主要用于运行Java Web应用程序。在这个模拟过程中,我们将深入理解Tomcat如何处理HTTP请求,以及它在...
#### 三、Tomcat工作原理 - **连接器(Connector)**:Tomcat通过一个或多个连接器组件接收来自客户端的请求。连接器组件通常包含一个`Acceptor`线程和多个工作线程。`Acceptor`线程负责接受新的客户端连接并将它们...
### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用的开发与部署环境中。它不仅支持Servlet API,还支持JSP规范,使得开发者能够轻松地构建动态网页。本文旨在深入...
在Tomcat7.0.78的源码中,Maven会解析POM.xml文件,下载所有必要的依赖库,编译源代码,执行测试,最后打包成可部署的格式。Maven的生命周期包括清理、编译、测试、打包、验证、安装和部署等阶段。 2. **Tomcat...
"how tomcat work 中文版" 这个标题和描述重复多次,表明我们关注的主题是关于Tomcat服务器的工作原理的中文解释。Tomcat是一款开源的、基于Java Servlet和JavaServer Pages(JSP)技术的Web应用服务器,由Apache...
Tomcat默认使用ISO-8859-1编码解析这些数据,这可能导致中文字符的乱码。解决方法是创建一个Servlet过滤器(Filter),在请求到达目标Servlet之前,设定请求的字符编码。以下是一个简单的过滤器示例,用于设置请求的...
本篇文章将深入探讨Tomcat的架构原理,帮助读者理解其核心功能和工作方式。 一、Tomcat架构 1. **Catalina核心**:Catalina是Tomcat的核心组件,负责处理Servlet和JSP的生命周期。它遵循Servlet规范,管理Servlet...
总之,Tomcat 5.5.26是一个成熟且稳定的Web服务器,为开发者提供了运行Java Web应用的强大平台,虽然现在已经有一些较新版本可用,但理解旧版本的特点和工作原理对于维护历史项目仍然非常重要。
一、TOMCAT架构解析 TOMCAT服务器的核心是基于Java的Servlet和JavaServer Pages(JSP)技术。它的主要组件包括:Catalina(核心Servlet容器)、 Coyote(HTTP/1.1连接器)、Jasper(JSP引擎)和Commons(包含各种...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本项目中,我们将探讨如何利用 ...同时,与 Tomcat 的对比分析,可以让你更好地理解服务器容器的工作原理。
当客户端发送一个GET或POST请求到Tomcat时,服务器会通过Servlet容器解析请求,然后根据请求方法调用相应的Servlet方法。对于GET请求,Servlet的`doGet()`方法会被调用;而对于POST请求,对应的则是`doPost()`方法。...
《深入剖析Tomcat》深入剖析Tomcat 4和Tomcat 5中的每个组件(如果TOMCAT版本有点老,不过现在的Tomcat6和7同样可以借鉴参考),并揭示其内部工作原理。通过学习《深入剖析Tomcat》,你将可以自行开发Tomcat组件,或者...
Tomcat的工作流程包括:接收请求、解析请求、调用Servlet、生成响应并发送回客户端。 接着,Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,用于简化开发过程。它提供了一种组织应用程序的...
**Tomcat工作原理** Tomcat是一款开源的Java Servlet容器,它实现了Java EE的Web应用服务规范,特别是Servlet和JSP。Tomcat的工作流程主要包括以下步骤: 1. **接收到请求**:当客户端发送HTTP请求到Tomcat时,...
《How Tomcat Works 中文版》是一份深入探讨Apache Tomcat服务器工作原理的指南,适合初学者和有经验的开发者阅读。Tomcat是Java Servlet和JavaServer Pages (JSP) 技术的主要开源实现,是许多Web应用部署的基础。这...
6. **URL编码与解码**:在处理URL请求时,可能遇到特殊字符,需要进行URL编码和解码。这部分涉及到Java的URLEncoder和URLDecoder类。 7. **Servlet容器**:尽管是简化版,但Tomcat的核心功能是处理Servlet。学生...