2007年10月16日

新注册了个独立域名,使用独立的blog了。

http://618119.com

rss订阅地址: http://feed.feedsky.com/lizongbo

从最早的 http://blog.csdn.net/lizongbo,

到 http://blog.donews.com/lizongbo

再到http://www.blogjava.net/lizongbo

现在终于拥有自己的域名和独立的blog了。

2006年02月18日

用于字符串内容提取。

import java.util.regex.*;

public class MyDemo {


    public static void main(String[] args) {
        String str = "[img]http://xxxxx.com/xxxx1.jpg[/img]" +
                     "[img]http://xxxxx.com/xxxx2.jpg [/img]" +
                     "[img]http://xxxxx.com/xxxx3.jpg [/img]" +
                     "[img]http://xxxxx.com/xxxx4.jpg [/img]" +
                     "[img]http://xxxxx.com/xxxx5.jpg [/img]" +
                     "[img]http://xxxxx.com/xxxx6.jpg [/img]";
        System.out.println(str.replaceAll("\\[img](.*?)\\[/img]", "$1\n"));
    }
}


2006年02月10日

struts validator的注意事项
struts 与commons validator版本搭配不当的时候会导致js出错(生成的js里没有retrieveFormName方法),
或者是validator-rules里的arg里的 resource="true" bundle="someRes"不起作用
(比如如下配置
——————————-
struts-config里
  <message-resources parameter="ApplicationResources" />
  <message-resources key="testrs" parameter="com.lizongbo.localstring.TestRs" />

validator.xml里
    <form name="EditActionForm">
    <field property="rowid" depends="required">
      <arg key="EditActionForm.rowid" position="0" resource="true"/>
    </field>
    <field property="msgid" depends="required">
      <arg key="msgid" position="0" resource="true" bundle="testrs"/>
    </field>
    </form>
ApplicationResources.properties中
EditActionForm.rowid = 测试id
com/lizongbo/localstring/TestRs.properties中
msgid =  消息编号
——————————–
这个时候rowid的资源捆绑会成功,而msgid的资源捆绑确是无效的,
jb2006自带在struts1.2.4版本上会导致国际化版本校验捆绑不了资源。),
经过试验,成功解决这两个问题的版本搭配是使用struts1.2.8版本和commons validator 1.2.0版本结合。

2.正确的操作如下:
a.下载
struts1.2.8
http://www.eu.apache.org/dist/struts/binaries/struts-1.2.8-bin.zip
http://www.eu.apache.org/dist/struts/source/struts-1.2.8-src.zip

commons validator1.2
http://www.eu.apache.org/dist/jakarta/commons/validator/binaries/commons-validator-1.2.0.zip
http://www.eu.apache.org/dist/jakarta/commons/validator/source/commons-validator-1.2.0-src.zip

用commons-validator-1.2.0.zip\commons-validator-1.2.0\commons-validator-1.2.0.jar
替换D:\Borland\JBuilder2006\thirdparty\jakarta-struts-1.2-lib\commons-validator.jar,
用struts-1.2.8-bin.zip\struts-1.2.8-bin\lib\struts.jar替换
D:\Borland\JBuilder2006\thirdparty\jakarta-struts-1.2-lib\struts.jar,
用struts-1.2.8-bin.zip\struts-1.2.8-bin\lib\validator-rules.xml替换
D:\Borland\JBuilder2006\thirdparty\jakarta-struts-1.2-lib\validator-rules.xml

编辑D:\Borland\JBuilder2006\thirdparty\jakarta-struts-1.2-lib\validation.xml,修改后内容如下:
(dtd使用1.2.0版本的)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
     "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"
     "http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
<form-validation>
</form-validation>
(下面这步好像可以不用,如果没有发现validator_1_2_0.dtd,则进行这个操作)
下载http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd并将它保存到
D:\Borland\JBuilder2006\lib\dtd\apache\下面。

(顺便建议把D:\Borland\JBuilder2006\thirdparty\jakarta-struts-1.2-lib\下的commons*.jar全部升级为当前最新的版本)
至此,在jbuilder里新建的使用struts1.2的webapp都可以正常的使用validator了。


注意:struts的validator对消息的国际化是根据formset来识别的
因此假设需要支持zh_CN和en以及zh_HK。
因此需要如下配置,(formset内的form设置可以复制多份即可)
validator-test.xml
—————————
<form-validation>
  <formset><!–这个是默认的必须的–>
  </formset>
  <formset language="zh"><!–这个是zh的–>
  </formset>
  <formset language="en"><!–这个是en的–>
  </formset>
  <formset language="zh" country="CN"><!–这个是zh_CN的–>
  </formset>
  <formset language="zh" country="HK"><!–这个是zh_HK的–>
  </formset>
</form-validation>

同时注意,如果指定了一个Locale,这个locale是当然web应用没有支持的语言,
比如用户选择了locale为fr,此时服务器会使用一个默认的,
但是这个默认的不是我们所认为对应的ApplicationResources不带任何后缀的资源。
而好像是request.getLocale得到的,或者是jdk自己的。
(我的测试情况如下,formset里只支持默认,zh,zh_CN,zh_HK,当我选择locale为en_GB的时候
,页面返回的消息是zh版本的,而我的浏览器是zh的,jdk也是zh的,我没有去看struts的src了,
因此无从判定struts到底依据的是哪一个)

webapp里使用struts validator。
FormBean里, import org.apache.struts.validator.ValidatorForm; 继承extends ValidatorForm 。

用最新版本的commons validator ,把js单独提取为:commonsvalidator.js,然后使用下面这样的代码:
jsp里
显示出错信息:
<logic:messagesPresent>
  <bean:message key="errors.header"/>
  <ul>
  <html:messages id="error">
     <li><bean:write name="error"/></li>
  </html:messages>
  </ul><hr>
</logic:messagesPresent>

引用js
<script type="text/javascript" language="Javascript1.1" src="<%=request.getContextPath()%>/commonsvalidator.js"/>
<html:javascript formName="myActionForm" dynamicJavascript="true" staticJavascript="false"/>
html form里 <html:form  onsubmit="return validateMyActionForm(this);"(注意大小写变化:myActionForm–>validateMyActionForm);

2006年01月26日

Tomcat启动的时候出现下面这样的提示:

2006-1-26 19:44:11 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Java\jdk1.5.0_05\bin;.;C:\WINDOWS\system32;C:\WINDOWS;d:\ruby\bin;.;..;D:\Java\jrockit-R26.0.0-jdk

实际这是建议使用apache的apr。

如果想使用apr的话, 实际操作很简单,

下载 http://tomcat.heanet.ie/native/1.1.1/binaries/win32/tcnative-1.dll

将这个文件复制到C:\WINDOWS\system32\下面

然后重新启动tomcat,就会发现tomcat 的控制台信息为:
2006-1-26 19:48:42 org.apache.coyote.http11.Http11AprProtocol init
信息: Initializing Coyote HTTP/1.1 on http-9080

详情见 http://tomcat.apache.org/tomcat-5.5-doc/apr.html

http://www.google.com/search?hl=zh-CN&newwindow=1&q=The+Apache+Tomcat+Native+library+which+allows+optimal+performance&btnG=%E6%90%9C%E7%B4%A2&lr=

2005年12月19日

在实际应用中,经常有如下表:

log200501,log200502,log200503,log200504……..一次每月一张表,

这些表结构都是相同的,且每个月产生一张。

然后又如下的查询条件,用户选择2005年7月到11月进行查询。要求从多张表中返回符合条件的记录,并且分页显示。

由于表是在动态增长的,因此在hibernate里不可能对每张表进行映射。

通过构造视图,然后对视图进行映射的方法也不太妥当。因为创建视图的sql不能够动态改变,并且效率也不高。

打算利用DetachedCriteria也没找到怎么样动态映射到同结构的表进行查询。

因此封装了一个方法:

    /**
     * 对多张同结构的表进行分页查询
     * @param c Class 需要转换出来的类
     * @param tablenames String[] 多张表名
     * @param whereSql String where条件 " where  aa= ? and  bb =? "
     * @param values Object[] 参数值
     * @param page Pagination 分页信息
     * @return List
     */
    public List search(final Class c, final String[] tablenames,
                       final String whereSql,
                       final Object[] values, final Pagination page) {

//先计算所有的表中符合条件的记录数。

//然后根据分页信息计算出需要查询数据的表,并计算好各表中的起始位置和记录条数

//在查询各个需要提供数据的表,将结果集合并

//以一个list返回出去。

}

调用流程如下,根据用户选择的时间范围得到需要涉及到查询的表名,然后再加上相关参训条件,调用该方法即可分业查询。

目前代码功能已经实现,但是存在以下几个缺陷

1.只能够是单表查询,不支持 select * from log20050* ,userinfo  where 1=1 这样的语句。这个缺陷可以后期处理掉,目前暂时没这个必要

2.返回的list中是全部的字段,目前只支持select * ,这个也可以处理掉。

3.字段排序只能够在每张表中单独进行,比如log200501里排序完毕,然后log200502里排序完毕,但是01和02的表结果集合在一起却不是排好序的。

这就是无法对所有符合条件的记录进行排序,这个不好做,数据库基础不扎实:(

或许应该有办法可以解决。

当然,应付目前的应用用来做日志类查询已经基本满足需求。

2005年11月16日

                   1. 先写一个存放选项的bean:

package com.lizongbo.common.basic;

public class HtmlSelectStruct {

  private String label;
  private String value;
  public HtmlSelectStruct() {
  }

  public HtmlSelectStruct(String label, String value) {
    this.setLabel(label);
    this.setValue(value);
  }

  public String getLabel() {
    return label;
  }

  public void setLabel(String label) {
    this.label = label;
  }

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }
}


2.生成下拉列表:
例如
    public List listAllUserHtmlSelect() {
        List l = listAllUser();
        List rs = new java.util.ArrayList();
        for (int i = 0; i < l.size(); i++) {
            User u = (User) l.get(i);
            HtmlSelectStruct hsall = new HtmlSelectStruct(u.getid()+" / "+u.getName(),
                    String.valueOf(u.getid()));
            rs.add(hsall);
        }
        return rs;

    }

3.放到session中,放到request里也可以

        request.getSession().setAttribute("userHtmlSelect",
                                          srl.listAllUserHtmlSelect());
//如果是null的,页面上会报错,这点不太爽

4.网页上的使用

     <html:select property="userid">

<html:option value="">不选择用户</html:option>
     <html:options collection="userHtmlSelect" property="value" labelProperty="label"/>
      </html:select>

2005年11月04日

Jbuilder开发

Jbuilder重要参数设置.

1.在jbuilder2006/bin/jdk.config 最后以行加上 vmparam -Dfile.encoding=GBK
2.在jbuilder2006/bin/jbuilder.config  59行 改为:socket 88888
3.在jbuilder2006/bin/jbuilder.config最后一行加上
  vmparam -Dprimetime.editor.useVariableWidthFont=true

结合vss开发
1.先从vss上取下工程
在Jbuilder中,菜单-〉File’new’在Object Gallery窗口中选中左边的Project,然后选Pull Project From VSS,然后点"OK".如下图:
 
2.接下来的窗口中,Directory填\\192.168.9.1\Source
 
3.填写vss的登录账号
 
4.选择即将导出的工程目录,如下图::
 
5.选择保存到本地的目录
 
6.在jbuilder2006中进行相关参数配置(这几个设置很重要,设置好之后可以减少很多不必要的麻烦):
a.设置工程的编码。
打开工程,主菜单-〉Project’Project Properties’General’Encoding,大家的编码一定要一致,避免乱码现象出现,因此建议统一设置为GBK.
 
b.设置需要自动复制的资源,由于工程中用到了xml,并且需要将其自动复制到classes目录下。
请将xml文件设置为Copy.记着要点ok 噢:)
 

c.设置class的生成版本
Taget VM要设置为1.4版本。
 
d.设置编译选项
把Generate source to output path的钩取掉
把Check JSPs for errors at build-time的钩取掉,这样可以加快编译调试的速度。
 
e.设置web应用中的资源复制。
选中Web App,然后点右键’Properties…
 
设置content,选择最上面的 Include all classes and resources
 

接下来就可以在工程中添加自己的模块了。
这样就可以在jbuilder里直接点右键队文件进行check add ,check in 和checkout了 .
注意jbuilder2006里与vss的状态同步没有jb2005好,如果用vss浏览器进行的check in 和out操作,在jbuilder2006里不能够及时体现。因此大家要点"刷新"图标进行状态同步
如图:
 


使用tomcat5.0
由于jbuilder2006中的tomcat5.5在部署的时候会自动复制多余的jar
导致web-inf/lib/下出现了jsp-api.jar和,serverlet-api.jar,这样会引起Failed to load or instantiate TagExtraInfo class:org.Apache.struts.taglib.html.MessagesTei之类的错误,因此在jbuilder中调试的话,可以先选择使用Tomcat5.0
在jb2006例添加server tomcat5.0的步骤如下。
1. 从jbuilder中提取jakarta-tomcat-5.0.27
a. 复制D:\borland\JBuilder2005\thirdparty\jakarta-tomcat-5.0.27为
D:\borland\JBuilder2006\thirdparty\jakarta-tomcat-5.0.27
我已经把它压缩好放在了\\192.168.9.1\jakarta-tomcat-5.0.27.rar,复制过来解压到D:\borland\JBuilder2006\thirdparty\也可以。
b. 添加 server.
主菜单’Enterprise’configure Servers ‘选中Tomcat5.5,然后点左下角的Copy.
 
名字依然为Tomcat,版本改为5.0
如图:
 
如图,将tomcat5.0的home directory 设置为:D:\borland\JBuilder2006\thirdparty\jakarta-tomcat-5.0.27
这样就可以在jb2006使用tomcat5.0了。

 


2005年10月29日

平时调试的时候,经常需要把一个Object里的各成员变量输出到日志来查看

但是很多javabean没有实现toString方法,或者实现的根本不够用。

因此,需要一个方便的toString来查看对象内各成员变量的值。

以前用的是log.debug("对象内容为:"+org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(obj) );

但是这个有缺陷,不能够输出集合和数组,

于是想到了个好办法

下载:

http://dist.codehaus.org/xstream/distributions/xstream-1.1.2.zip

需要输出调试的地方就用:

log.debug("对象内容为:"+new XStream().toXML(obj) );

或者给javabean加上

    public String toString() {
        XStream xstream = new XStream();
        String xml = xstream.toXML(this);
    };

基本上决大部分的对象都可以搞定了,呵呵

当然可以把xstream 只生成一个实例,那样效率更高


用来调试输出hibernate的查询结果,po或者list都超级方便。


winnt4.0上面配置tomcat5.5.10的注意事项

1.安装方法如下,直接复制在win2000下的jdk1.4和tomcat5.5.10的文件夹到winnt4.0
2.把文件夹名字改短,把j2sdk1.4.2_04改成jdk,jakarta-tomcat-5.5.10改成web,新文件夹名字必须在8个字符内。
3.winnt下获取环境变量好像有问题,因此需要编辑web\bin\startup.bat
在开头加上
set JAVA_HOME=c:\j2sdk
set CATALINA_HOME=c:\web
4.然后启动,一切ok了。

同一台机器上配置运行Tomcat集群的简便方法(节选)

然后启动tomcat的时候,通过命令行参数来启动。
比如:
 
D:\JAKART~1.10\bin>catalina run -config D:\jakarta-tomcat-5.5.10\conf\server80.xml
D:\JAKART~1.10\bin>catalina run -config D:\jakarta-tomcat-5.5.10\conf\server8080.xml
D:\JAKART~1.10\bin>catalina run -config D:\jakarta-tomcat-5.5.10\conf\server9080.xml

2005年09月28日

Jbuilder的TCP Monitor是用监视端口并转发数据的,

并且把客户请求和服务端请求的数据记录下来.

用它来分析http请求和回复非常方便,

而我巧妙的吧它用来做下面一件事情.

http://torrez.net/projects/konstructor/Konstructor.exe

是一个xmlrpc调试工具,美中不足的地方,是无法设置端口,

只能够用80端口访问,于是突然想到用TCP Monitor来进行端口转发.

用 TCP Monitor 监听80端口,并转发数据到远程的服务和指定端口.

呵呵

后来想到其实连这个调试工具都省了,直接用TCP Monitor来监视xmlrpc调用.

当然,也可以用IE的插件 ieHTTPHeaders 来分析http请求,但是ieHTTPHeaders 不记录content内容:(