如何解决Tomcat下中文乱码问题?
http://www.javaeye.com/topic/251743
现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。
1)JSP页面中显示中文乱码
在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>
2)表单提交乱码
表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
(1)POST处理
对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:
-
packageexample.util;
-
-
importjava.io.IOException;
-
-
importjavax.servlet.Filter;
-
importjavax.servlet.FilterChain;
-
importjavax.servlet.FilterConfig;
-
importjavax.servlet.ServletException;
-
importjavax.servlet.ServletRequest;
-
importjavax.servlet.ServletResponse;
-
-
publicclassSetCharacterEncodingFilterimplementsFilter{
-
-
protectedStringencoding=null;
-
-
protectedFilterConfigfilterConfig=null;
-
-
protectedbooleanignore=true;
-
-
-
publicvoiddestroy(){
-
-
this.encoding=null;
-
this.filterConfig=null;
-
- }
-
-
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
- <strong><spanstyle="color:rgb(255,0,0);">FilterChainchain)throwsIOException,ServletException{
-
-
if(ignore||(request.getCharacterEncoding()==null)){
- Stringencoding=selectEncoding(request);
-
if(encoding!=null){
- request.setCharacterEncoding(encoding);
- }
- }</span>
- </strong>
- chain.doFilter(request,response);
-
- }
-
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
-
-
this.filterConfig=filterConfig;
-
this.encoding=filterConfig.getInitParameter("encoding");
- Stringvalue=filterConfig.getInitParameter("ignore");
-
if(value==null){
-
this.ignore=true;
- }elseif(value.equalsIgnoreCase("true")){
-
this.ignore=true;
- }elseif(value.equalsIgnoreCase("yes")){
-
this.ignore=true;
- }else{
-
this.ignore=false;
- }
-
- }
-
-
protectedStringselectEncoding(ServletRequestrequest){
-
-
return(this.encoding);
-
- }
-
- }
文中红色的代码即为处理乱码的代码。
web.xml文件加入过滤器
-
<filter>
-
<filter-name>Encoding</filter-name>
-
<filter-class>
- example.util.SetCharacterEncodingFilter
-
</filter-class>
-
<init-param>
-
<param-name>encoding</param-name>
-
<param-value>gbk</param-value>
-
</init-param>
-
<init-param>
-
<param-name>ignore</param-name>
-
<param-value>true</param-value>
-
</init-param>
-
</filter>
-
<filter-mapping>
-
<filter-name>Encoding</filter-name>
-
<servlet-name>/*</servlet-name>
-
</filter-mapping>
(2) Get方法的处理
tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
打开<tomcat_home>/conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
- <Connectorport="8080"maxHttpHeaderSize="8192"
- maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
- enableLookups="false"redirectPort="8443"acceptCount="100"
- connectionTimeout="20000"disableUploadTimeout="true"<spanstyle="color:rgb(255,0,0);">URIEncoding="GBK"</span>/>
* 注意修改后重新启动tomcat才能起作用。
配置Tomcat 中文字符集问题
觉得还是要写出来,免的要用的时候遍地找牙耽搁时间.
文件:
%Tomcat_home%/conf/web.xml
修改位置:
<Connector port="8080" maxThreads="150" minSpareThreads="25"
.........
在该Connector标签中添加项URIEncoding="GBK" useBodyEncodingForURI="true"
保存重启服务即可.
java web应用文件下载(包括中文文件名乱码处理)
url: http://blog.csdn.net/lovingprince/archive/2008/07/18/2671580.aspx
Java web下载文件功能的确很简单。如下代码片段String fileName ="....";
response.setHeader("Content-disposition","attachment; filename="+fileName);
//response.setContentType("application/ms-word");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(getServletContext().getRealPath("" + fileName)));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
} catch(final IOException e) {
System.out.println ( "IOException." + e );
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
如上所示,已经可以完成下载的功能。不过如果我们使用中文文件名,那么这段代码便会出错,解决办法有多种方式,如下:
第一种: 设置 response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));这里将文件名编码成UTF-8的格式,就不会出现URL出错了。IE6下注意中文文字不能超过超过17个。
第二种:设置response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );将中文名编码为ISO8859-1的方式。不过该编码只支持简体中文.
按照上诉方式,可以综合一下两种方式解决绝大部分中文问题。
fileName = URLEncoder.encode(fileNameSrc,"UTF-8");
if(fileName.length()>150)//解决IE 6.0 bug
fileName=new String(fileNameSrc.getBytes("GBK"),"ISO-8859-1");
response.setHeader( "Content-Disposition", "attachment;filename=" + fileName);
java实现文件下载并解决中文文件名乱码问题
2009-07-07 19:07
|
/**
* 下载文件
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public void downLoadFile(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//得到该文件在数据库中的信息
int fileId = Integer.parseInt(request.getParameter("fileId").toString());
FileInfo file = fileInfoBiz.getFileInfoByFileId(fileId);
try{
String filepath = file.getFilePath()+"//"+file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件路径
String filename = file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件名字
//解决中文文件名乱码问题
if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0)
filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
else if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0)
filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器
/**
* 如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等
* 文件下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打
* 开,有些也可以正常打开。同时response.reset()这种方式也能清空缓冲区, 防止页面中的空
* 行等输出到下载内容里去
*/
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=/"" + filename + "/"");
response.setHeader("Connection", "close");
ServletOutputStream sos = response.getOutputStream();
FileInputStream fis = null;
File d = new File(filepath);
if (d.exists()){
fis = new FileInputStream(filepath);
byte b[] = new byte[1000]; //输入流的读取速率
int j;
while ((j = fis.read(b)) != -1){
try{
sos.write(b, 0, j);
}
catch (IOException exp){
MyLog.error("文件流写入错误", exp);
}
}
fis.close();
sos.flush();
sos.close();
}
}catch(Exception e){
MyLog.error("下载文件出错", e);
//return mapping.findForward("page_error");
}
//return toFileMain(mapping, form, request, response);
}
以下载方式导出xls文件 赠送解决中文文件名问题
url: http://www.javaeye.com/topic/742753
最近需要一个功能 点击导出按钮,导出一个xls文件 用户 指定保存路径。 用的是 jxl api
先上代码:
-
publicStringxls(){
-
if(day==null){
-
this.pagination=propertyMng.findSumList(pageNo,getCookieCount());
- }else{
-
if(day.equals("")){
- DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");
- day=df.format(newDate());
- }
-
this.pagination=propertyMng.findListByDay(day,pageNo,
- getCookieCount());
- }
//上面是我自己的业务逻辑
- HttpServletResponseresponse=ServletActionContext.getResponse();
- StringfileName="强大.xls";
-
try{
- fileName=newString(fileName.getBytes(),"iso8859-1");
- }catch(UnsupportedEncodingExceptione1){
- e1.printStackTrace();
- }
- response.setHeader("content-disposition","attachment;filename="
- +fileName);
- response.setContentType("application/msexcel");
- getInputStream(response);
-
returnnull;
- }
-
publicvoidgetInputStream(HttpServletResponseresponse){
-
try{
- OutputStreamos=response.getOutputStream();
- WritableWorkbookwwb=Workbook.createWorkbook(os);
- WritableSheetws=wwb.createSheet("道具排行",0);
- WritableFontwfc=newWritableFont(WritableFont.ARIAL,20,
- WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,
- Colour.GREEN);
- WritableCellFormatwcfFC=newWritableCellFormat(wfc);
- Labellabel1=newLabel(0,0,"道具",wcfFC);
- ws.addCell(label1);
- Labellabel2=newLabel(1,0,"数量",wcfFC);
- ws.addCell(label2);
-
- List<PropertyUseInfoPOJO>list=pagination.getList();
-
inti=1;
-
for(PropertyUseInfoPOJOpojo:list){
- Labelname=newLabel(0,i,pojo.getName());
- ws.addCell(name);
- Labelnum=newLabel(1,i,pojo.getNum());
- ws.addCell(num);
- i++;
- }
-
- wwb.write();
- wwb.close();
- os.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }catch(RowsExceededExceptione){
- e.printStackTrace();
- }catch(WriteExceptione){
- e.printStackTrace();
- }
- }
感觉挺简单的。 构建输出流 主要是 Label 对象 相当于 单元格
WritableCellFormat 对象 相当于设置样式
往 WritableSheet 添加 Label 就构建了一个xls结构
点击button 开始下载文件 无转向页面
下面是截图 ,简单清晰明了。~
分享到:
相关推荐
解决tomcat中文乱码问题,有详细的解释说明,希望对需要的人有所帮助
Tomcat环境下JSP中文乱码问题的解决
解决tomcat下中文乱码问题, 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码
现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。 1)JSP页面中显示中文乱码 在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb...
Docker容器部署tomcat出现中文乱码.docx
Tomcat和weblogic中文乱码问题解决方案
解决tomcat中文乱码的问题!!!!!! !!!!!!!!!!!!!!!!!!!
tomcat get提交中文乱码解决方案,修改tomcat server.xml 中以下为
weblogic和tomcat 下载附件乱码问题 weblogic和tomcat 下载附件乱码问题
解决tomcat中文乱码问题.doc,很宝贵的资料。
如何解决Tomcat下中文乱码问题?文.pdf
彻底解决 Tomcat 5 下文字乱码问题 - JSP日志 - ※一路风尘※
utf8解决JSP中文乱码问题 Tomcat 5.5中文乱码 JDBC ODBC Bridge的Bug及其解决方法 Solaris下Servlet编程的中文问题及解决办法
而该工具可以自动解决UTF-8和GBK乱码的问题。 使用教程: 直接替换原先项目的Tomcat,将JavaWeb项目(Servlet、SSH、SSM框架的项目)直接部署到该Tomcat8中即可,无需做其他的额外的操作。 运行教程: 可以通过...
在Java编程中,经常会碰到汉字的处理及显示问题,以不小心就会产生一大堆乱码或者问号。造成这种问题的根本原因是Java中默认...在这里,主要针对Tomcat中JSP开发容易出现的中文乱码问题进行讨论,一般有以下几种情况:
部署tomcat下的项目 监控的时候发现 日志中文乱码 ,tomcat 下catalina.out 日志乱码问题处理
本文档详细地介绍了如何解决MySql数据库中的中文乱码问题,此问题的解决将极大地帮助基于MySql的PHP编程、JSP编程、Servlet编程及C#或.Net编程!测试过的开发平台包括 Netbeans和Eclipse。测试过的服务器包括Apache、...
解决Tomcat乱码的问题
Struts Hibernate MyEclipse Tomcat MySQL JSP 乱码 编码出错 内码设定