2007年10月12日

    我以前遇到tomcat+mysql5中文乱码时都是去网上找解决办法,解决了后就不去深究原因,现在我总结一下:

  1:关于

        Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"

与    Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"

写法的要注意的地方,& 是 & 的转义符号,两种写法都是正确的,只是下面的写法用在xml配置文件中,而上面的用在java代码中。

2.查看客户端发送给服务器的SQL使用什么编码

如果你的jsp或者java代码发送给mysql的中文是乱码,你可以运行一下下面的代码,看看客户端发送给服务器的SQL使用什么编码;

private static String ClassName = "org.gjt.mm.mysql.Driver";
private static String Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
private static String UserName = "root";
private static String PassWord = "";

Connection con = null;
 try {
     Class.forName(ClassName).newInstance();
     con = DriverManager.getConnection(Url, UserName, PassWord);
 } catch (Exception e) {
     e.printStackTrace();
 }
 
ResultSet rs = con.createStatement().executeQuery("SHOW VARIABLES LIKE ‘character_set_%’");
   while(rs.next()){
      System.out.println(rs.getString(1) +","+ rs.getString(2));
   }
rs.close();
con.close();

没有配置characterEncoding=utf-8之前,我使用的是 Url = "jdbc:mysql://localhost:3306/test;
这样的配置。结果用select()方法查询结果如下:

character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-Linux-i686/share/mysql/charsets/

注意第一行就可以了,可见使用的是latin1。
而latin1本身就无法表示汉字,经过这个编码打包的SQL语句发给Server,Server也用Latin1解析也无法还原。
所以,我总是写乱码到DB。
而配置了配置characterEncoding=utf-8之后,
执行select(),结果:

character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行为utf-8,SQL将用UTF8打包给Server,Server也用Client配置的UTF8
解析。

部分类容来自 - http://www.master8.czm.cn/data/2007/0308/article_5458.htm

2007年07月27日

  <GlobalNamingResources>

    <!– Test entry for demonstration purposes –>
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <!– Editable user database that can also be used by
         UserDatabaseRealm to authenticate users –>
   
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />
     
      <Resource
    name="jdbc/huodong"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="5"
    maxIdle="3"
    username="root"
    maxWait="180"
    driverClassName="org.gjt.mm.mysql.Driver"
    password=""
    url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&amp;characterEncoding=GBK"
    removeAbandoned="true" removeAbandonedTimeout="5" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>
  
  </GlobalNamingResources>

注意:url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&amp;characterEncoding=GBK"

不要写成:url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&characterEncoding=GBK"

注意:&amp;  & 的转义字符;在xml中写成上面那个,在java代码中写成下面的写法;

否则报:

Parse Fatal Error at line 213 column 91: The reference to entity "characterEncoding" must end with the ‘;’ delimiter.
org.xml.sax.SAXParseException: The reference to entity "characterEncoding" must
end with the ‘;’ delimiter.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Un
known Source)

还要在tomcat的 conf/server.xml 中修改如下类容:

<Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>

红色部分是添加的类容

2006年09月18日

今天我将一个IBatis+Spring+Struts的web工程从Tocmat5中移植到Resin2中,本来在Tomcat5中可以运行的Web项目,在Resin中就不能初始化Spring的ApplicationContext了,导致web不能启动。后来就Spring的applicationContext.xml中的Context的初始化方式由:

<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
改为:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
就可以了。

2006年07月15日

 在将ireport的报表模板放在Tomcat中,生成PDF时出现一个找不到包的错误,如下:

java.lang.NoClassDefFoundError: org/apache/commons/javaflow/bytecode/Continuable

我在apache的官方网站找了很久都没找到,原来他就在Ireport安装目录的lib中,将commons-javaflow.jar复制到tomcat的lib中,或放入要生成报表的那个web项目的lib就可以了。

2006年05月22日

log4j.properties

### 可以给log配置取个名字,在后面就可以用这个名字配置log;

### 比如我要配置两个log,名字分别为:consoteLog,fileLog

### log4j 对日志的输出定义了级别,共有6个级别,分别是:fatal,error,warn,info,debug,trace ###
### 其中fatal的级别最高,trace的级别最低,只有当它的输出日志的级别大于或等于为日志器配置的日志级别时 ###
### 这个级别的日志才可以输出,比如你的日志的级别是info,那么只有大于info级别的fatal,error,warn,info 的 ###
### 信息才会输出.下面的两个日志的级别分别为:DEBUG,WARN,名称为 consoteLog,fileLog

log4j.rootLogger=DEBUG,consoteLog
log4j.rootLogger=WARN,fileLog


### 设置 consoteLog 的输出地为ConsoleAppender(控制台) ##
### 设置 fileLog 的输出地是到文件(文件大小到达指定尺寸的时候产生一个新的文件)##
### 其他可供选择的输出方式为:org.apache.log4j.FileAppender(文件) ##
### org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) ##
### org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) ##
### org.apache.log4j.WriterAppender(将日志消息以流的格式发送到任意指定的地方) ##

log4j.appender.consoteLog=org.apache.log4j.ConsoleAppender
log4j.appender.fileLog=org.apache.log4j.RollingFileAppender


### 指定fileLog日志文件输出的位置 ##
log4j.appender.fileLog.File=E:\\fileLog.log
### 指定fileLog日志文件的大小##
log4j.appender.fileLog.MaxFileSize=500KB

### 设置consoteLog的输出布局格式PatterLayout,(可以灵活地指定布局模式)##
### 其他可供选择的布局格式: org.apache.log4j.HTMLLayout(HTML表格形式布局) ##
### org.apache.log4j.SimpleLayout (包含日志消息的级别和信息字符串) ##
### org.apache.log4j.TTCCLayout (包含日志产生的时间,线程和类别等信息)

log4j.appender.consoteLog.layout=org.apache.log4j.PatternLayout
log4j.appender.fileLog.layout=org.apache.log4j.PatternLayout


### 配置日志输出的格式##

log4j.appender.consoteLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
log4j.appender.fileLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

下面说说怎么在实际的工程里启动log4j了,首先不管是在tomcat里还是在IDE里,要把log4j.jar包放在lib下,
在tomcat中就放在你的web工程的 WEB-INF/lib 中,在IDE中就用工程的包向导(一般在工程的属性中)将包引入到工程中就行了;
在Tomcat做服务器时把 log4j.properties 文件放在你的工程的 WEB-INF/classes/下,在IDE(ecilpse,idea)中放在src/下
如果你的工程用了Hibernate,Spring,ibatis的话,基本上就不用进行其他设置了,因为在这些项目中,当web服务器启动时都默认会启动日志的
(如果有log4j.properties,和log4j.jar的,并且放在正确的位置的话);
如果你要在IDE中把项目当成应用程序来调试,又想看见日志的话(在out中),在你的应用程序的main方法中写上:

Log log=LogFactory.getLog(main.class);
BasicConfigrator.configure();

这个你就可以在ecilpse的输出窗口中看见日志了;