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"));
    }
}


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年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都超级方便。


2005年09月21日

曾经见过有人给出的最蠢的一个做法,是在ActionForm里放了20个Formfile 类型的变量。
其实只需要下面一段代码即可。

        String dirPath = getServlet().getServletContext().getRealPath("/")
                         + "/upload";
        Hashtable fileh = actionForm.getMultipartRequestHandler().
                          getFileElements();
        for (Enumeration e = fileh.keys(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            try {
                FormFile formfile = (FormFile) fileh.get(key);
                String filename = formfile.getFileName().trim(); //文件名
                if (!"".equals(filename)) {
  //不同的浏览器传上的文件名可能有区别,有的是全路径的
//在这里保存文件
                    InputStream ins = formfile.getInputStream();
                    OutputStream os = new FileOutputStream(dirPath +
                            File.separatorChar
                            + filename);
                    int bytesRead = 0;
                    byte[] buffer = new byte[8192];
                    while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                    os.close();
                    ins.close();

                }
            } catch (Exception ex) {
                logger.debug("出错了", ex);
            }
        }

2005年09月06日

java.lang.SecurityException: Unsupported keysize or algorithm parameters
            at javax.crypto.Cipher.init(DashoA6275)
的解决

在使用 bouncycastle的时候,会遇到

java.lang.SecurityException: Unsupported keysize or algorithm parameters
            at javax.crypto.Cipher.init(DashoA6275)

这个错误信息,是keysize长度被限制的缘故。

需要下载下面的文件了;来更新jdk的策略文件。

http://java.sun.com/j2se/1.4.2/download.html

Java Cryptography Extension (JCE)
Unlimited Strength Jurisdiction Policy Files 5.0

jce_policy-1_4_2.zip

Java Cryptography Extension (JCE)
Unlimited Strength Jurisdiction Policy Files 1.4.2

http://java.sun.com/j2se/1.5.0/download.jsp

jce_policy-1_5_0.zip


具体可以参考:
http://www.bouncycastle.org/specifications.html

2005年05月17日

出于java的安全限制,System.getProperty("line.seperator")是不能够直接取得的。可以这样做:
String lineSeparator = (String) java.security.AccessController.doPrivileged(
               new sun.security.action.GetPropertyAction("line.separator"));
具体参考java.io.BufferedWriter的源代码就可以找到上面这行代码。

2005年05月14日

jsp文件是UTF-8编码。

然后在使用ant进行jsp预编译打包时候出现下面的错误:

    [javac] E:\lizongbo\\WEB-INF\src\org\apache\jsp\lizongbo_jsp.java:977:

warning: unmappable character for encoding GBK

查资料之后,得到解决方法:

对jasper2(org.apache.jasper.JspC)设置

javaEncoding="UTF-8"

对javac设置 encoding="UTF-8"

,然后再次ant就可以成功预编译了。

2005年05月13日

在jstl中也可以像php那样随时声明变量而且不操心变量的类型。
下面的代码只需要修改数据库连接的参数,和需要显示的表名即可。


<%@page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<html>
<head>
<title>lizongbo 的 jstl 例子</title>
</head>
<body bgcolor="#ffffff">
<c:set var="db_driver" value="org.gjt.mm.mysql.Driver"/>
<c:set var="db_url" value="jdbc:mysql://localhost:3306/lizongbo?useUnicode=true&characterEncoding=UTF-8"/>
<c:set var="db_user" value="lizongbo"/>
<c:set var="db_password" value="lizongbo"/>
<c:set var="table_name" value="tbl_login_log"/>
<c:set var="crtpageno" value="${param.crtpageno > 0? param.crtpageno:1}"/>
<c:set var="countperpage" value="${param.countperpage > 0? param.countperpage:5}"/>
<c:set var="limitb" value="${(crtpageno-1)*countperpage}"/>
<sql:setDataSource driver="${db_driver}" user="${db_user}" password="${db_password}" url="${db_url}" var="mydb" scope="application"/>
<sql:query var="myrs" sql="select count( * ) as countnum from ${table_name}" dataSource="${mydb}" scope="request"></sql:query>
<c:out value="一共有${myrs.rows[0].countnum}条记录<br/>" escapeXml="false"></c:out>
<c:set var="allpageno" value="${myrs.rows[0].countnum % countperpage ==0 ? (myrs.rows[0].countnum) / countperpage : (myrs.rows[0].countnum) / countperpage +1}" scope="request"/>
<%String alpn =String.valueOf( java.lang.Math.round(Double.parseDouble(String.valueOf(request.getAttribute("allpageno")))));%>
<c:set var="allpageno" value="<%=alpn%>"/>
<c:set var="crtpageno" value="${crtpageno > allpageno ? allpageno : crtpageno}"/>
<c:set var="prepageno" value="${crtpageno>1 ? crtpageno-1 : crtpageno}"/>
<c:set var="nrepageno" value="${crtpageno >= allpageno? allpageno : crtpageno+1}"/>
<a href="<%=request.getRequestURI()%>?crtpageno=1">第一页</a>
<a href="<%=request.getRequestURI()%>?crtpageno=<c:out value="${prepageno}" />">上一页</a>
<a href="<%=request.getRequestURI()%>?crtpageno=<c:out value="${nrepageno}" />">下一页</a>
<a href="<%=request.getRequestURI()%>?crtpageno=<c:out value="${allpageno}" />">最后一页</a>
<sql:query var="myrs" sql="select * from ${table_name} LIMIT ${limitb}, ${countperpage} " dataSource="${mydb}" scope="request"></sql:query>
<table border="1">
<c:forEach var="row" items="${myrs.rows}" varStatus="status">
<c:if test="${status.first}">
<tr>
<c:forEach var="colname" items="${row}">
<td>
<c:out value="${colname.key}" escapeXml="true"/>
</td>
</c:forEach>
</tr>
</c:if>
<tr>
<c:forEach var="col" items="${row}">
<td>
<c:out value="${col.value}" escapeXml="true"/>
</td>
</c:forEach>
</tr>
<c:set var="crtrsnum" value="${status.count}"/>
</c:forEach>
</table>
当前是第:<c:out value="${limitb+1}"/>到第<c:out value="${limitb+crtrsnum}"/>条记录
<br/>
</body>
</html>