2006年05月19日

  在windows下使用DateFormat的parse方法,将字符中转化为Date类型时,一切正常。可安装到Linux下,就出现了ParseException异常。代码如下:

         public Date toDateTime(String str){
                Date dt = new Date();

                try{
                        DateFormat df;
                        df = DateFormat.getDateTimeInstance(); 
                        dt = df.parse(str);
                }
                catch(ParseException e){
                        System.err.println(e);
                }
                return dt;
        }

  我执行toDateTime("2005-5-1 12:00:00"),在windows下正常,Linux下出现ParseException异常。看来是Linux下的DateFormat对象不认识"2005-5-1 12:00:00"这种格式的字符串,所以转换不了(需进一步老确认)。

  由于时间来不及,我赶紧换了另外一种方法。新的代码在Linux下运行正常。修改后的代码如下:

         public Date toDate(String str){
                Date dt = new Date();
                String[] parts = str.split("-");
        
                if(parts.length >= 3){
                        int years = Integer.parseInt(parts[0]);
                        int months = Integer.parseInt(parts[1]) – 1;
                        int days = Integer.parseInt(parts[2]);
                        int hours = 0;
                        int minutes = 0;
                        int seconds = 0;
            
                        GregorianCalendar gc = new GregorianCalendar(years,months,
                                        days,hours,minutes,seconds);

            
                        dt = gc.getTime();            
                }
                return dt;
        }

  我的日期字符串格式是"yyyy-MM-dd-HH-mm-ss"的,所以代码如上。要转化别的格式,截取字符中的时候会不一样。但,它的核心代码是"GregorianCalendar gc = GregorianCalendar(years, months, days, hours, minutes, seconds);"。也就是用GregorianCalendar类来进行String到Date类型的转换。

2006年05月18日

  昨天坐公交车下班时,电视上讲“庆祝杭州移动电视诞生一周年”。我才意识到,我在公交车上看实现电视节目,已经有一年的历史了。

  记得原来,公交车上的电视,只能看一些烂片或者广告。搞不为好还卡碟,真没意思。从去年开始,越来越多的公交车装上了移动电视。坐在车上就能看到实时的电视节目。而且,还都是精选的收视率高的节目。感觉真是不错。只是要小心不要坐过站哦。有一次,我就看得太投入,结果坐过了一站。害得我又等公交车坐回来。后来,每次坐公交车时,我都提前一站起来站到车门口。这样就不会投入地坐过站了。

  想想以后发展好了,长途汽车、火车等交通工具上都装上了移动电视,那该有多好呀!

  第一次在Java中用JDBC连接Oracle数据库,连接通了,但是一个简单的SQL查询,却报告“无效的列索引”。

  开始,我以为是Oracle里的表索引没有设置。于是,我给要查询的表添加了索引。但是,还是报同样的错。

  记得,前段时间,我用JSP中用JDBC连接过Oracle数据库,SQL查询查出来过记录。只是当时用的数据表不同。于是,我又试着用与JSP中同样的代码,同样的数据表再测了一次。结果,还是不行。

  没办法,只得请教一位公司里的JAVA高手,让她帮忙看一下。原来,是我取字段的时候,字段序号写错了。高手就是高手,一看就看出来了。

  错误代码如下:

            ……
            ResultSet rs = null;               
            try {
                    ……
                    if (rs.first()) {
                            String col = rs.getString(0);   // 错误代码处
                    }                   
                }               
            }
            ……

  完整的正确代码如下:

            // 省略数据库连接部分

            String sqlquery = "select * from users";           

             

            PreparedStatement ps = null;

            ResultSet rs = null;               

            try {

                    ps = conn.prepareStatement(sqlquery,

                                    ResultSet.TYPE_SCROLL_INSENSITIVE,

                                    ResultSet.CONCUR_READ_ONLY);

           

                    rs = ps.executeQuery();

                    if (rs.first()) {

                            String col = rs.getString(1);   // 修改后的正确代码

                    }                   

                }               

            } catch (SQLException se) {

                throw se;

            } catch (Exception ex) {

                throw ex;

            } finally {

                if (rs != null)

                    rs.close();

                if (ps != null)

                    ps.close();

            }

  从上面的代码可以看出,ResultSet类型的getString(int index)方法,是以1开始的。我用的是0,所以出错了。

  VB中数字以1开关,Java同C++一样,数字一般以0开始。而像这样突然在Java里面出现以1开始的情况,确实很难想到。因此,虽然只是一字之错,但我还是把它写了下来。

  不少人曾经或正在经历这种让人难堪情形:无论你打开什么窗口,总会弹出一个输入法工具条,并且默认是中文输入,非常讨厌。可是又找不到设置默认输入法的地方。
  今天,我看到了一篇名为“枪毙ctfmon.exe,恢复你的默认输入法”的文章,写的就是关于这一问题的解决方法。可是,这种方法太复杂,而且多少有些走极端。
 
 我曾经也遇到过这样的情形,让人十分郁闷。偶尔一两次在“控制面板 >> 键盘 >>
输入法区域设置”中找到过可以设置默认输入法的地方。但是,多数情况下怎么也找不到这一项设置,以至于我开始怀疑自己是不是真的找到过它。一次偶然的机
会,让我发现了这个设置“躲藏”的地方。
  那是一个夜高风黑的晚上,我无意中把那个该死的输入法弄到了桌面上。它浮在桌面上,可以到处被拖动。
在这个输入法浮动框右下角有一个小三角箭头,它好像在对我说:点我呀,点我呀。于是,我点了它。如我所料,出现的是个下拉菜单。在下拉菜单的最后一项是
“还原默认值”。它没让我点它,是我自己想点它。于是,我点了它。经过我的测试,正如我所猜想的那样,它就是我一直苦苦寻找的那项设置——设置默认输入法
的地方。在这里,我为大家把当时的设置过程整理一下(在有 ctfmon.exe 运行的时候):

  第一步,显示语言栏,也就是让语言栏浮动在桌面上。

  有两种方法:一种方法是,在任务栏的输入法图标处点击右键,选择“显示语言栏”菜单(注意,ctfmon.exe
运行时,任务栏上会有两个关于输入法的图标,应该右键点击左边的那个);另一种方法是,在“控制面板 >> 键盘 >>
输入法区域设置”中点击“更改”按钮,在弹出的“文字服务”窗口再点击“语言栏”按钮,在弹出的又一窗口中钩选“在桌面上显示语言栏”一项。

  第二步,通过语言栏上的第一个图标选择要设置成默认值的输入法。
  
  一般来说选择输入法的下拉菜单中会有一个“中文(中国)”的输入法,它就是英文输入法。如果没有,可以点击语言栏右下角小三角,在出现的下拉菜单中的“设置”里进行添加。

  第三步,点击右下角的小三角,选择下拉菜单中的“还原默认值”项。

  第四步,点击右上角的“-”(最小化按钮),将语言栏最步化到任务栏。

  其实还有一种方法可以设置默认输入法:
  由于是 ctfmon.exe 的运行,而导致了系统原有的输入法设置功能(“控制面板
>> 键盘 >> 输入法区域设置”)被替换。因此,如果我们终止 ctfmon.exe
的运行,系统原有的设置功能也就可以得到恢复,默认输入设置项就会回来。当然,系统重新启动后,ctfmon.exe
程序还会自动运行,但是,之前的设置还是有效的。终止 ctfmon.exe 的运行,我们可以使用“任务管理器”来完成。终止掉的
ctfmon.exe, 可以通过开始菜单里的“运行”,重新运行起来。

  在Tomcat安装目录中,webapps默认为部署网站用的目录。webapps/ROOT是
网站的根目录,其它目录都是网站的子目录,如webapps\jsp-examples目录。但是,当我们新建一个子目录时,却并不能在浏览器里正常访
问。就连HTML文件也访问不了。为什么会出现这种情况呢?

  原来,在Tomcat中,每一个webapps下的子目录都被认为是一个
JSP站点。因此,该子目录必需要有JSP站点的必要结构才行。也就是,在创建的子目录下,必需有WEB_INF目录以及WEB_INF下的
web.xml文件。WEB_INF目录以及其下的web.xml文件,是JSP用来配置站点用的。

  以test子目录为例,以下就是正确配置Tomcat子目录的目录结构:

        webapps\
            ┝ ROOT\
            │        │
            │        ┕ …
            ┕
test\
                        │
                        ┝ index.html
                        │
                        ┕ WEB_INFO\
                                    │
                                    ┕  web.xml


  空的web.xml文件内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!–
  Copyright 2004 The Apache Software Foundation

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
–>

<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"
>

  
<display-name>Welcome to Tomcat</display-name>
  
<description>
     Welcome to Tomcat
  
</description>

</web-app>

  前几天,由于工作需要,要对Subversion(一款现在很流行的版本控制软件)的Web客户端SVN Web
Client,进行汉化。现有的SVN Web
Client是英文版的,界面上大部分英文直接写在JSP文件里。因此,为了方便快速,我决定直修改JSP文件里的英文。把英文翻译成中文,以实现对
SVN Web Client的简单汉化。但是,在编辑器里输入的中文,在浏览器上显示却都是乱码。

  一开始,我用<%@ page contentType="text/html; charset=GB2312" %>设置JSP页面的编码,页面上的中文能够显示正确。但是,表单提交到服务器上的中文,却都显示乱码。

 
 原来,SVN Web
Client系统的Serverlet都是采用UTF-8编码。由于上面的设置,表单是以GB2312编码提交给Serverlet,而
Serverlet却把它们当成UTF-8编码进行处理。这样一来,写到服务器上的内容已经就是乱码了。看来,为了不修改Serverlet源代码,只有
在JSP页面里也采用UTF-8编码才行。没办法,再想办法吧。

  虽然在JSP页面直接输入的中文,在浏览器中显示乱码。但是,如果设
置浏览器用GB2312编码进行浏览,这些页面中输入的中文却能够正确显示。只是,这时从数据库里读出的中文,又变成了乱码。这说明数据本身没有损坏,只
是编码不一样。一个是GB2312
编号,一个是UTF-8编号。也就是说,我从编辑器里输入的中文是GB2312编码的。那么,只要我在编辑器里输入UTF-8编码的中文就可以了。

  我记得原来用EditPlus编辑器另存文件时,有一项是选择编码的。也许,我将原始JSP文件另存为UTF-8编码的,然后再输入的中文就会是UTF-8编码的了。

 
 事实证明,用EditPlus另存为UTF-8编码后,输入的中文确实显示正常。由于这种另存方式,实际就是一种编码转换,所以,原先输入的中文,也能
正常显示了。于是,我将原先汉化过的JSP文件,一个一个都转换成UTF-8编码,然后将<%@ page
contentType="text/html; charset=GB2312" %>改写为<%@ page
contentType="text/html; charset=UTF-8"
%>。这样,我输入的中文,终于能在浏览中正确显示出来。我的汉化工作也很快完成了。

 

总结:当JSP文件里直接输入的中文,在浏览器里显示乱码时,请不要慌乱。应该用有“编码转换”功能的软件,将文件转换成正确的编码。如EditPlus编辑器,就可以将文件转换成UTF-8编码。

  Tomcat默认安装时,是8080端口。这时,要使Tomcat支持“UTF-8”的中文地址,只需要在server.xml文件中,将8080端口的<connector>标签设置成URIEncoding="UTF-8":

<Connector port="8080" URIEncoding="UTF-8"  />


  当Tomcat用JK与Apache集成时,用works.properties文件来配置Apache和tomcat连接时使用的一些参数。其中包括Apache要使用的Tomcat端口:

worker.list=ajp13
worker
.ajp13.port=8009
# 本机,若上面Tomcat主机不为localhost,作相应修改 
worker.ajp13.host=192.168.1.5
# 类型
worker.ajp13.type=ajp13
# 代理数,不用修改
worker.ajp13.lbfactor=1


  文件中“rker.ajp13.port=8009”就是用来设置Apache要连接的Tomcat端口。因此,Apache和Tomcat集成后,要使服务器支持UTF-8的中文地址,应该设置8009端口的<connector>标签:

<Connector port="8009" URIEncoding="UTF-8"  />

  听说Apahce2.0已经集成了WebDAV,所以可以直接安装Subversion服务。可
是我在Linux下面安装完Apache HTTP
Server后,发现modules目录下面一个.so文件也没有。因此,在我将Subversion服务安装到Apache中时,出现了找不到
mod_dav.so文件的错误。

  开始以为是Apache没装好。又重装了一遍,还是不行。改装Apache2.2,也不行。

  没办法,只好到www.apache.org,再看看相关的文档。在Apache HTTP Server的 Compiling and Installing页面中,我发现一个./configure命令的链接。从链接内容可以看出,./configure命令还有很多参数用来自定义Apache的安装。而且,我还发现,mod_dav.so文件是可以添加到安装中来的。为了不至于出错,我将名称相似的mod_dav-fs.so文件也添加了进来。安装过程如下:

# gzip -d httpd-2.0.55.tar.gz
# tar xvf httpd-
2.0.55.tar
# ./configure –enable-module
=so –enable-dav –enable-dav-fs
# make
# make install

注释:–enable-module
=so设置Apache支持Dynamic Shared Objects (DSO),–enable-dav即添加mod_dav.so对象,–enable-dav-fs即添加mod_dav_fs.so对象。


  Apache安装完后,还要简单的配置一下:

# vi /usr/local/apache2/conf/httpd.conf
将Listen 
80 修改为Listen :80
将ServerName 修改为ServerName:
80 


  最后,安装Subversion:

# cd ./subversion-1.3.0
# .
/configure with-apxs=/usr/local/apache2/bin/apxs
# make
# make install


  mod_dav_svn.so文件,以及mod_authz_svn.so文件,会自动安装到/usr/local/apache2/modules目录,并且正确设置了httpd.conf文件,对它们进行加载。

  注意:安装Apache时,最好不要使用–enable-mods-shared=most进行./configure配置,否则个别DSO对象,如mod_jserv.so,可能会与mod_jk.so冲突,以至于无法将Tomcat集成至Apache。

添加 ParentRepositoryDirectory 参数:
<context-param>
        <param-name>ParentRepositoryDirectory</param-name>
        <param-value>http://localhost/svn/</param-value>
</context-param> 

注:
   1. "http://localhost/svn/"是Subversion的版本库的父目录路径;
   2. param-value 值要用"/"结束,即要形如"http://localhost/svn/",而不是"http://localhost/svn"。否则在SVNWebClient登陆时,在Repository name一项,直接输入版本库名称,是会出错的。

  Asp.Net Forums(后面简称ANF)的游客和管理员默认的是伦敦时区。所以当我们按照说明安装时,永远无法同时让所有用户的时区都正确。除非你的站点安装在伦敦。其实这个问题也很好解决。

 
 安装完ANF后,在它的数据库中有一个名为“forumns_UserProfile”的表。这张表记录的是用户的基本信息。其中UserId为0的一
条记录是游客的记录,UserId为2的记录是管理员的记录(默认安装完ANF后就会生成这两条记录)。在这张表里你会发现有一个名为
“TimeZone”的字段。这个字段就是设置时区用的。如果你在安装好ANF后已经注册过用户,那么你可以看到新注册用户的TimeZone用户值都是
8(中国地区),只有游客和管理员的两条记录是0。你只需把这两条系统安装时生成的记录的TimeZone字段,设置成服务所在地的时区,然后通过管理
员,进入系统的后台,设置对应的正确时区就可以了。新注册的用户是按用户所在地时区自动生成的,不用去管它。

  还有一种方法,就是修改.sql文件,以便在ANF安装的时候就能正确设置时区。

  1、修改 install-Data.sql 文件如下,以为游客创建正确的时区:
      ……
      INSERT INTO
      forums_UserProfile
      VALUES
      (
          0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0–所修改行(0 修为 8)
      )
      ……

  2、修改 Install-Procedures.sql  文件如下,以为管理员创建正确的时区:
      ……
      CREATE           procedure forums_User_CreateUpdateDelete 
      (
          @UserID int out,
          @UserName   nvarchar (64) = ”,
          @NickName nvarchar(64) = ”,
          @IPCreated nvarchar (32) = ‘000.000.000.000′,
          @Password   nvarchar (64) = ”,
          @Email    nvarchar (128) = ”,
          @StringNameValuePairs  varbinary (7500) = 0,
          @UserAccountStatus  smallint = 1,
          @PasswordFormat  int = 1, 
          @PasswordQuestion  nvarchar(256) = ”,
          @PasswordAnswer  nvarchar(256) = ”,
          @Salt    nvarchar (24) = ”,
          @AppUserToken       varchar (128) = ”,
          @ForumView   int = 0,
          @TimeZone   float = 8.0,–所修改行(0.0 修为 8.0)
      ……

  结束。