`

Java 跨服务器(tomcat和weblogic)的中文编码解决方法

 
阅读更多

weblogic的默认编码是得到操作系统(我用的是XP)的编码GBK的,而Tomcat的默认编码是ISO8859-1.  

 
本文要解决的问题是使用同一种编码方案而能在不同服务器下都解决中文乱码问题,我只在tomcat和weblogic下试验过,因为这是最常用的两种服务器(就是一套方案要在tomcat和weblogic下无论是get请求还是post请求都要正常编码---ajax请求不再此文讨论中,ajax请求不同一般的请求)
我使用的是
tomcat6.5
weblogic server 9

首先大家找个项目把下面3个文件都随便丢到一个目录中取,要相同目录
为了方便,我采用的Jsp,因为修改了不用重新加载,方便测试,至于Servlet只要把下面这样东西对照一下就没问题了

<%@ contentType="text/html; charset=GBK" %>
     对应response.setContentType("text/html; charset=GBK")
     建议这样来设置,分开类型和编码
          response.setContentType("text/html")
         response.setCharactorEncoding("GBK")

在weblogic和tomcat里都运行看看效果

testEncoding.jsp
Java代码  
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=GBK"%>    
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
<html>    
  <head>    
    <title>My JSP 'test1.jsp' starting page</title>    
  </head>      
  <body>    
    <h5>提交到getEncoding1.jsp</h5><br>    
    <a href="getEncoding1.jsp?aaa=羽飞&bbb=苍月无影">get请求</a>    
    <form action="getEncoding1.jsp" method="post">    
        <input type="text" name="aaa" value="羽飞"/>    
        <input type="text" name="bbb" value="苍月无影"/>    
        <input type="submit" value="提交"/>    
    </form>    
    <h5>提交到getEncoding2.jsp</h5><br>    
    <a href="getEncoding2.jsp?aaa=羽飞&bbb=苍月无影">get请求</a>    
    <form action="getEncoding2.jsp" method="post">    
        <input type="text" name="aaa" value="羽飞"/>    
        <input type="text" name="bbb" value="苍月无影"/>    
        <input type="submit" value="提交"/>    
    </form>    
  </body>    
</html>  
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=GBK"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP 'test1.jsp' starting page</title> </head> <body> <h5>提交到getEncoding1.jsp</h5><br> <a href="getEncoding1.jsp?aaa=羽飞&bbb=苍月无影">get请求</a> <form action="getEncoding1.jsp" method="post"> <input type="text" name="aaa" value="羽飞"/> <input type="text" name="bbb" value="苍月无影"/> <input type="submit" value="提交"/> </form> <h5>提交到getEncoding2.jsp</h5><br> <a href="getEncoding2.jsp?aaa=羽飞&bbb=苍月无影">get请求</a> <form action="getEncoding2.jsp" method="post"> <input type="text" name="aaa" value="羽飞"/> <input type="text" name="bbb" value="苍月无影"/> <input type="submit" value="提交"/> </form> </body></html>
 

  1. getEncoding1.jsp
Java代码 
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=gbk"%>    
<%    
    request.setCharacterEncoding("GBK");    
%>    
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
<html>    
  <head>    
    <title>getEncoding1.jsp</title>    
  </head>      
  <body>    
    <%       
        String s1 = request.getParameter("aaa");    
        String s2 = request.getParameter("bbb");    
    %>    
    request.setCharacterEncoding("GBK");<br>    
    String s1 = request.getParameter("aaa");<br>    
    <%=s1 %><br>    
    String s2 = request.getParameter("bbb");<br>    
    <%=s2%>    
  </body>    
</html>  
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=gbk"%><% request.setCharacterEncoding("GBK");%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>getEncoding1.jsp</title> </head> <body> <% String s1 = request.getParameter("aaa"); String s2 = request.getParameter("bbb"); %> request.setCharacterEncoding("GBK");<br> String s1 = request.getParameter("aaa");<br> <%=s1 %><br> String s2 = request.getParameter("bbb");<br> <%=s2%> </body></html>
  

  1. getEncoding2.jsp
Java代码  
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=gbk"%>    
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
<html>    
  <head>    
      <title>getEncoding2.jsp</title>    
  </head>      
  <body>    
    <%       
        String s1 = new String(request.getParameter("aaa").getBytes("ISO8859-1"));    
        String s2 = new String(request.getParameter("bbb").getBytes("ISO8859-1"));    
    %>       
    String s1 = new String(request.getParameter("aaa").getBytes("ISO8859-1"));<br>    
    <%=s1 %><br>    
    String s2 = new String(request.getParameter("bbb").getBytes("ISO8859-1"));<br>    
    <%=s2%>    
  </body>    
</html>  
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=gbk"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>getEncoding2.jsp</title> </head> <body> <% String s1 = new String(request.getParameter("aaa").getBytes("ISO8859-1")); String s2 = new String(request.getParameter("bbb").getBytes("ISO8859-1")); %> String s1 = new String(request.getParameter("aaa").getBytes("ISO8859-1"));<br> <%=s1 %><br> String s2 = new String(request.getParameter("bbb").getBytes("ISO8859-1"));<br> <%=s2%> </body></html>
 

从getEncoding1.jsp和getEncoding2.jsp的编码方案来看,差别就在于一个设置了request的编码格式,一个没有设置,没有设置request编码格式的在取得参数的时候重新进行了一次编码

从运行状况来看,第一种方式的get请求在tomcat下会出现乱码,第二种方式在weblogic和tomcat都能正常工作

但是显然第二种方式太烦琐,而且当我们使用struts等框架时会变得棘手

第一种方式显然更好用,也更优雅,我们可以在web.xml里设置编码格式,然后使用filter从initparameter里读出编码格式,然后设置request的编码格式,管理也方便,不过目前在tomcat下的get请求会出现乱码,要解决这个问题就需要在server.xml里配置一项参数,server.xml在tomcat根目录/config文件夹下,tomcat5 post和get使用了不同的编码格式,而tomcat4使用的是相同格式,如果你使用tomcat4,就不会出现乱码

Java代码  
<Connector port="8888" maxHttpHeaderSize="8192"   
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"   
               enableLookups="false" redirectPort="8443" acceptCount="100"   
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk"/>    
<!-- 配置URIEncoding="gbk" 这里的编码格式一定要和你的页面编码格式一致 -->   
<!--该tomcat地址在相应部署的文件里可找到-->
 
<Connector port="8888" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="tru e" URIEncoding="gbk"/><!-- 配置URIEncoding="gbk" 这里的编码格式一定要和你的页面编码格式一致 -->

现在重新启动tomcat,看看第一种编码格式是不是在tomcat下是不是能正常显示啦^_^

下面是Weblogic修改默认编码
 

一:首先修改项目WEB-INF/weblogic.xml
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
   <jsp-descriptor>    
          <jsp-param>    
              <param-name>pageCheckSeconds</param-name>    
              <param-value>1</param-value>    
          </jsp-param>    
          <jsp-param>    
              <param-name>compilerSupportsEncoding</param-name>    
              <param-value>true</param-value>    
          </jsp-param>    
          <jsp-param>    
              <param-name>encoding</param-name>    
              <param-value>gbk</param-value>    
          </jsp-param>    
         
      </jsp-descriptor>    
  
   <charset-params>
     <input-charset>
       <resource-path>/</resource-path>
       <java-charset-name>gbk</java-charset-name>
     </input-charset>
   </charset-params>
 
  <context-root>/</context-root>
</weblogic-web-app>
 二:然后在该项目域中找到 域名称/startWebLogic.cmd在非注释第一行加上-Dweblogic.webservice.i18n.charset=gbk
经过测试,已经没有乱码了! 
分享到:
评论

相关推荐

    Java乱码问题解决

    对于不同的问题,不同的JDK版本,不同的应用服务器(如Tomcat,Jboss,Weblogic),处理方法都会有一些微小的差异。在这里,主要针对Tomcat中JSP开发容易出现的中文乱码问题进行讨论,一般有以下几种情况:

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java 面试题 总结

    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...

    java面试题

    84.8. 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七),请用java语言编一段程序实现! 114 84.9. 题目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有...

    非常苛刻的java工作要求

    2. 熟悉中间件Tomcat、jboss、Apache、Weblogic、WAS; 3. 熟悉各种Web前端技术,包括JavaScript、CSS、HTML4/5、(XHTML、XML、Ajax)、json、jstl、JQuery,jsp,对DWR、Bootstrap、EasyUI、DWZ、ExtJS有一定了解...

    Java面试宝典-经典

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    Java面试宝典2010版

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    java基础题 很全面

    43. char型变量中能不能存贮一个中文汉字?为什么? 12 44. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 12 45. 线程的基本概念、线程的基本状态以及状态之间的关系 12 46. 在linux下 怎么查看tomcat...

    超级有影响力霸气的Java面试题大全文档

    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...

    java面试题大全(2012版)

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    最新Java面试宝典pdf版

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    Java面试笔试资料大全

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    java面试宝典2012

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 10 9、请设计一个一百亿的计算器 10 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=...

    JAVA面试宝典2010

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    Java面试宝典2012新版

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...

    Java面试宝典2012版

    7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、...

Global site tag (gtag.js) - Google Analytics