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
经过测试,已经没有乱码了! 

你可能感兴趣的:(weblogic)