相信大家在进行web开发时经常会遇到中文处理的困惑。我们经常会发现web应用在处理英文时很正常,但是处理中文时却出现乱码现象。最郁闷的是部分乱码,部分又显示正常,搞得是不知所措。下面以我在一个实际项目中的经验,介绍如何在struts中处理中文。我采用的中文编码是utf8,相信对于gbk编码方式也大同小异。
1. 数据库表编码
那数据库表时采用utf8编码。如下:
CREATE TABLE `project` (
`project_id` INTEGER(10) NOT NULL AUTO_INCREMENT,
`project_name` VARCHAR(30) COLLATE gbk_chinese_ci DEFAULT NULL,
`group_id` INTEGER(10) DEFAULT NULL,
`responser` VARCHAR(30) COLLATE gbk_chinese_ci DEFAULT NULL,
`status_id` INTEGER(10) NOT NULL,
`description` VARCHAR(5000) COLLATE gbk_chinese_ci DEFAULT NULL,
PRIMARY KEY (`project_id`)
)ENGINE=MyISAM
AUTO_INCREMENT=7 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
2.jdbc连数据库的url中要给出编码方式,否则jdbc在给数据库写中文时就写入了乱码。只有在url给出编码方式时jdbc才能正确地将中文写入到数据库中。对于utf8编码的数据库连接url如下:
mysqlUrl=jdbc:mysql://127.0.0.1:3306/pmp?characterEncoding=utf8
3.struts中加入处理中文编码的filter.
filter的代码如下:
package com.mycompany.mypackage;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class UTF8Filter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void destroy() {
// do nothing
}
public void init(FilterConfig arg0) throws ServletException {
// do nothing
}
}
配置struts的filter:
在web.xml中加入以下黑体部分代码:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>UTF8Filter</filter-name>
<filter-class>com.mycompany.mypackage
.UTF8Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>UTF8Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
通过以上步骤,各个流程中的中文处理就ok了。
------------------------------------------------------------------------------------------------------------------
4. 可是还发现了一个奇怪的现象,对于下载文件功能的中文文件名还是显示乱码。对于服务器上文件的保存,我是通过在数据库中建一张表,记录了文件在服务器的名字,以及它在客户端的名称。在服务器上的文件名是随机生成的唯一文件名,这样客户是可以上传同名文件。所以在下载文件时通过文件表中的id查到文件在服务器上的名称和客户端文件名称,通过服务器上的名称去对应的文件夹下载,但是给客户端的名称是表中存放的客户端文件名称。对于struts中上传下载文件的处理见另外的blog"struts中上传下载文件的处理". 以下加黑部分是处理中文文件名的代码,主要是需要将文件名转换成iso字符集。
public class FileDownloadServlet extends HttpServlet {
private ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
public ServletConfig getServletConfig() {
return config;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
SmartUpload mySmartUpload = new SmartUpload();
String clientSideName = 从数据库中读到clientSideName;
clientSideName = convertToIso(clientSideName);
mySmartUpload.downloadFile("configure".equals(type) ? FileUtil.CONFIGURE_FILES_PATH + serverSideName
: FileUtil.TESTRESULT_FILES_PATH + serverSideName, null, clientSideName);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
// 将字符转换成ISO
public String convertToIso(String s) {
try {
String dest = "";
String encoding = "GBK";
// convert manually
int length = s.length();
for (int i = 0; i < length; i++) {
if (s.charAt(i) < 256) {
dest += (s.substring(i, i + 1));
} else {
dest += (new String(s.substring(i, i + 1).getBytes(encoding), "iso-8859-1"));
}
}
return dest;
} catch (Exception e) {
return s;
}
}
}
ok,通过以上方法就解决了我在构建这个struts应用时所磁到的中文乱码问题。
分享到:
相关推荐
在Struts框架中,异常处理是不可或缺的一部分,因为它有助于确保程序的健壮性和用户体验。 手动异常处理在Struts中通常涉及到以下几个方面: 1. **异常拦截器**:在Struts 2中,我们可以通过编写自定义的拦截器来...
这个“Struts中文文档”包含了关于Struts框架的详细信息,旨在帮助开发者理解和掌握该框架的使用,从而更高效地开发Web应用。 Struts的核心理念是MVC(Model-View-Controller)设计模式,它将业务逻辑、数据表示和...
Struts中文手册PDF文件中,可能会包含以下内容: 1. **基础概念**:解释Struts的基本架构,如模型、视图和控制器的职责,以及它们之间的交互方式。 2. **安装与配置**:指导如何在项目中引入Struts框架,设置环境,...
struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结
这个“struts2 中文手册”提供了一份详细的指南,旨在帮助开发者理解和运用Struts2框架的各项功能。 Struts2的核心是模型-视图-控制器(MVC)设计模式,它简化了开发过程,将业务逻辑、数据和用户界面分离开来。...
Struts中文手册提供了全面的指南,帮助中国开发者更好地理解和使用Struts框架。 在Struts框架中,核心组件包括: 1. **ActionServlet**:这是Struts框架的核心,它是一个扩展了Servlet的类,负责处理所有HTTP请求...
3. **异常处理**:讲解Struts2的全局异常处理机制,如何捕获并处理应用程序中的异常。 4. **国际化与本地化**:展示如何在Struts2中实现多语言支持,提供不同地区的用户体验。 5. **插件和扩展**:介绍Struts2的...
在本文档中,我们将深入理解Struts 1.1的核心概念、组件以及标签库。 1. **Struts 压缩包内容** Struts 包含了一系列的类库、配置文件和示例应用。主要包括Struts API、JSP标签库、文档、以及示例源码,开发者可以...
8. **异常处理**:Struts2提供了一种优雅的方式来处理应用程序中的异常,允许开发者定义全局或特定Action的异常处理策略。 9. **ModelDriven模式**:该模式让Action类更简洁,将模型对象直接注入到Action,减少代码...
在Struts2中,异常处理是一项重要的功能,它确保在应用程序遇到错误时能够优雅地处理,提供友好的用户反馈,并保持系统稳定性。下面将详细讨论Struts2中的异常处理机制及其相关知识点。 1. **异常处理机制概述** ...
Struts 是一个开源的Java Web框架,由Apache软件基金会维护,它主要负责处理MVC(模型-视图-控制器)架构中的控制层。这个“struts 中文教程”旨在为初学者和有经验的开发者提供关于如何使用Struts进行Web应用开发的...
05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单数据校验(Validation) 07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts...
通过以上这些步骤,可以有效地解决Struts框架中处理汉字时可能出现的问题。然而,实际开发中可能会遇到更复杂的情况,因此理解字符编码原理和Java I/O流的工作方式至关重要。同时,持续关注Struts框架的更新和最佳...
书名:Struts中文手册[文字版][中文](电子书) 格式:PDF 1. Struts 框架1 1.1. Struts 压缩包内容.1 1.2. Struts 体系结构1 1.2.1. 模型.2 1.2.2. 视窗.2 1.2.3. 控制器.2 1.3. Struts 框架中的组件.3 1.3.1. ...
Struts2的处理流程
STRUTS中文文档,内容比较丰富 struts安装 Struts原理、开发及项目实施 Struts中的应用 Struts中的翻页实例 strtus整体架构及核心标签库的介 struts框架详细介绍 Struts的体系结构
在这个“struts错误处理机制小例子”中,我们将探讨Struts如何优雅地处理应用程序中的异常和错误,确保用户界面的友好性和系统的稳定性。 在Struts框架中,错误处理主要依赖于两个关键组件:ActionForm和Struts配置...
这个"STRUTS中文文档(全).rar"压缩包包含的是一套完整的Struts框架的中文文档,对于理解和学习Struts框架具有极大的帮助。 Struts的核心是一个控制层组件,它基于Model-View-Controller (MVC)设计模式,使得开发者...
Struts2.3中文帮助文档,需要的尽快下载。