2005年05月27日
使用UrlRewrite Filter对url进行美化转换处理
1.下载
 http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.4-src.zip
http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.4.zip
相关联接:http://tuckey.org/urlrewrite/
 
2.解压得到urlrewrite-2.4.jar和urlrewrite.xml.
 
3.创建一个测试用的webapp.
先建立一个Servlet,来输出request.getQueryString().
并将这个servlet映射为/*
4.引入urlrewrite-2.4.jar,
编辑web.xml,加入
 
        <filter>
            <filter-name>UrlRewriteFilter</filter-name>
            <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
            <init-param>
                <param-name>logLevel</param-name>
                <param-value>DEBUG</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>UrlRewriteFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
 
5.在WEB-INF目录下创建urlrewrite.xml,然后定义一些url重写规则。
然后就可以在webapp中使用url重写了。
例如:
 <rule>
  <from>(.*).html</from>
  <to>/lizongbo/$1</to>
 </rule>
 <rule>
  <from>/lizongbo.html</from>
  <to type="redirect">http://www.donews.net/lizongbo</to>
 </rule>
6.有一个特殊的url,/rewrite-status是用来显示urlrewrite的状态信息的。
 
UrlRewrite Filter确实简单实用且功能强大,不错。
Tomcat自带的Example里也有url重写的例子,不过功能比较弱。
 
参考http://tuckey.org/urlrewrite/
http://tuckey.org/urlrewrite/manual/guide.html
http://tuckey.org/urlrewrite/manual/index.html
2005年05月26日
用p6spy和sqlprofiler来进行jdbc sql日志记录和分析
 
1.相关工具下载:
p6spy:   http://heanet.dl.sourceforge.net/sourceforge/p6spy/p6spy-install.zip
http://www.p6spy.com/download.html
辅助日志分析工具:
http://heanet.dl.sourceforge.net/sourceforge/sqlprofiler/sqlprofiler-0.3-bin.zip
http://www.jahia.org/jahia/page377.html
2.解压p6spy-install.zip,把p6spy.jar和spy.properties放到classpath中。
 
修改spy.properties
realdriver=org.gjt.mm.mysql.Driver# 数据库驱动程序的名字
 
appender=com.p6spy.engine.logging.appender.StdoutLogger
 
3.在设置数据源或者配置数据库连接的地方,
修改driver为:com.p6spy.engine.spy.P6SpyDriver
 
例如:

<sql:setDataSource driver="com.p6spy.engine.spy.P6SpyDriver" user="${db_user}" password="${db_password}" url="${db_url}" var="mydb" scope="application"/>

 
运行程序,然后就可以在控制台看到所有的sql语句了。
 
4.解压sqlprofiler-0.3-bin.zip,将
spy.properties下面内容复制到先前的spy.properties替换相应地配置:
————————–
appender=com.p6spy.engine.logging.appender.Log4jLogger
#appender=com.p6spy.engine.logging.appender.StdoutLogger
#appender=com.p6spy.engine.logging.appender.FileLogger
 
# append to  the p6spy log file.  if this is set to false the
# log file is truncated every time.  (file logger only)
append=true
 
#The following are for log4j logging only
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=p6spy – %m%n
 
log4j.appender.SQLPROFILER_CLIENT=org.apache.log4j.net.SocketAppender
log4j.appender.SQLPROFILER_CLIENT.RemoteHost=localhost
log4j.appender.SQLPROFILER_CLIENT.Port=4445
log4j.appender.SQLPROFILER_CLIENT.LocationInfo=true
 
#log4j.logger.p6spy=INFO,STDOUT
log4j.logger.p6spy=DEBUG, SQLPROFILER_CLIENT
 
 
这段配置的意思是使用log4j来记录日志。
因此需要用到log4j.jar
 
先运行sqlprofiler.jar,然后再运行自己的应用,
这样就可以建立socket的logger了。
然后就可以在sqlprofiler的界面中看到sql语句。
 
参考:
http://www.javaworld.com.tw/jute/post/view?bid=21&id=93745&sty=1&tpg=1&age=0
 
windows下openldap的安装与测试
1.openldap的下载:
可以通过 openldap for windows 在google上搜索到。
目前最新版本是:2.2.19
下载地址:
http://download.bergmans.us/openldap/openldap-2.2.19/openldap-2.2.19-db-4.3.21-openssl-0.9.7e-win32.exe
相关联接:
http://lucas.bergmans.us/hacks/openldap/
 
2.运行openldap-2.2.19-db-4.3.21-openssl-0.9.7e-win32.exe安装,一路next就可以了安装ldap for windows到D:\openldap\。
 
3.假设我们使用的域名是 lizongbo.com 对应的主机IP是192.168.9.126
 
4.修改C:\WINNT\system32\drivers\etc\下的host文件
添加下面一行
192.168.9.226   lizongbo.com
 
5.配置openldap,修改D:\openldap\slapd.conf里的内容
 
把下面两行(57,58行)
 
suffix  "dc=my-domain,dc=com"
rootdn  "cn=Manager,dc=my-domain,dc=com"
 
改成
 

suffix  "dc=lizongbo,dc=com"
rootdn  "cn=Manager,dc=lizongbo,dc=com"
 
运行
 
D:\openldap>slappasswd -h {MD5}
New password: Re-enter new password: {MD5}S6CYCoq9tq5LPyFg79WaMQ==
(我输入的密码是lizongbo)
然后继续修改slapd.conf
 
把下面这行(62行)
 
rootpw  secret
 
改成
 
rootpw  {MD5}S6CYCoq9tq5LPyFg79WaMQ==
 
 
 
接下来运行D:\openldap\slapd.exe来启动LDAP服务。
或者运行slapd -d 1
可以看到日志信息。
 
6.java测试:
 
package com.lizongbo.ldapdemo;
 
import java.util.*;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
 
public class LDAPTest {
  public LDAPTest() {
  }
 
  public static void main(String[] args) {
    LDAPTest LDAPTest1 = new LDAPTest();
    String root = "dc=lizongbo,dc=com"; //root
 
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://192.168.9.226/" + root);   
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=lizongbo,dc=com");
    env.put(Context.SECURITY_CREDENTIALS, "lizongbo");
    DirContext ctx = null;
    try {
      ctx = new InitialDirContext(env);
      System.out.println("认证成功");
    }
    catch (javax.naming.AuthenticationException e) {
      e.printStackTrace();
      System.out.println("认证失败");
    }
    catch (Exception e) {
      System.out.println("认证出错:");
      e.printStackTrace();
    }
 
    if (ctx != null) {
      try {
        ctx.close();
      }
      catch (NamingException e) {
        //ignore
      }
    }
    System.exit(0);
  }
 
}
2005年05月17日

配置cgi,以支持exe文件.

参考:http://www.oreilly.com.cn/news.php?n=20040109171925&c=java
 
如果使用exe文件来做cgi,还需要设置一个参数executable,这个参数的默认值是支持perl的。
 

配置如下:
 
 <servlet>
  <servlet-name>cgi</servlet-name>
  <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
  <init-param>
   <param-name>clientInputTimeout</param-name>
   <param-value>100</param-value>
  </init-param>
  <init-param>
   <param-name>debug</param-name>
   <param-value>0</param-value>
  </init-param>
  <init-param>
   <param-name>cgiPathPrefix</param-name>
   <param-value>WEB-INF/cgi-bin</param-value>
  </init-param>
        <init-param>
            <param-name>executable</param-name>
            <param-value>cmd /c </param-value>
        </init-param>
  <load-on-startup>5</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>cgi</servlet-name>
  <url-pattern>/cgi-bin/*</url-pattern>
 </servlet-mapping>
 
testcgi.exe文件存放的路径在
D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF\cgi-bin
 
访问地址是:
 
http://localhost:8080/lizongbo/cgi-bin/testcgi.exe
 
 
但是Tomcat 4.1.30的cgi有bug.
访问http://localhost:8080/lizongbo/cgi-bin/testcgi.exe/index.php
这样的路径时候就会出现404错误。
解决办法:
那就是用Tomcat5.5.9的D:\jakarta-tomcat-5.5.9\server\lib\servlets-cgi.jar
(原名servlets-cgi.renametojar)来替换Tomcat4.1.30的,然后重新启动Tomcat即可.

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

2005年05月16日

代码改自:org.displaytag.sample.displaysourceservlet

web.xml的映射如下:
  <servlet>
    <servlet-name>displayjspsourceservlet</servlet-name>
    <servlet-class>com.lizongbo.displayjspsourceservlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>displayjspsourceservlet</servlet-name>
    <url-pattern>*.jspsrc</url-pattern>
  </servlet-mapping>

java代码如下:
package com.lizongbo;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class displayjspsourceservlet
    extends httpservlet {
  private static final string content_type = "text/html; charset=utf-8";
  public void init() throws servletexception {
  }

  public void doget(httpservletrequest request, httpservletresponse response) throws
      servletexception, ioexception {
    response.setcontenttype(content_type);
    printwriter out = response.getwriter();
    out.println("<html>");
    out.println("<head><title>jsp source ");
    string jspfn = request.getservletpath();
    jspfn = jspfn == null ? "" : jspfn;
    if (jspfn.lastindexof(".jsp.") > 1) {
      jspfn = jspfn.substring(0,jspfn.lastindexof(".jsp.") + 4);
    }
    out.print(jspfn);
    out.println("  — lizongbo edit from org.displaytag.sample.displaysourceservlet </title></head>");
    out.println("<body bgcolor=\"#ffffff\">");
    out.println("<pre>");
    inputstream inputstream = getservletcontext().getresourceasstream(
        jspfn);
    if (inputstream == null) {
      out.println("unable to find jsp file: " + jspfn);
    }
    else {
      for (int currentchar = inputstream.read(); currentchar != -1;
           currentchar = inputstream.read()) {
        if (currentchar == ‘<’) {
          out.print("&lt;");
        }
        else {
          out.print( (char) currentchar);
        }
      }
    }
    out.println("</pre>");
    out.println("</body>");
    out.println("</html>");
    out.close();
  }
  public void dopost(httpservletrequest request, httpservletresponse response) throws
      servletexception, ioexception {
    doget(request, response);
  }

  public void destroy() {
  }
}


使用方法
比如可以访问:http://lizongbo.com:/lizongbo/lizongbo.jsp
那么访问 http://lizongbo.com:/lizongbo/lizongbo.jsp.jspsrc

就可以查看到jsp文件的源代码。

2005年05月15日

1.下载地址:
Tomcat 5.5.9:
http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9.zip
http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9-fulldocs.tar.gz
http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9-compat.zip
http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9-admin.zip
Apache 2.0.54:
http://www.eu.apache.org/dist/httpd/binaries/win32/apache_2.0.54-win32-x86-no_ssl.msi
mod_jk1.2.12:
http://www.eu.apache.org/dist/jakarta/tomcat-connectors/jk/binaries/win32/jk-1.2.12/mod_jk-1.2.12-apache-2.0.54.so(好像Apache 2.0.53已经自带mod_jk.so了,但是2.0.54没有自带)
Apache2.0.54带mod_ssl.so的版本
http://hunter.campbus.com/Apache_2.0.54-Openssl_0.9.7g-Win32.zip

2.安装:
先解压tomcat;安装apache,添加mod_jk.so(复制并重命名mod_jk-1.2.12-apache-2.0.54.so)
添加mod_ssl.so(取自Apache_2.0.54-Openssl_0.9.7g-Win32.zip,或者从xampp中获取,目前只有2.0.53的)把ssl.conf,ssl.default.conf放到conf目录,

其中default.conf作为备份),libeay32.dll, ssleay32.dll(这2个都在bin目录)。把它们全都复制到你自己的apahce下的对应目录。


3.配置Apache:
编辑httpd.conf
ServerName www.lizongbo.com
注释成下面这个样子:
#<IfModule mod_ssl.c>
#    Include conf/ssl.conf
#</IfModule>
 然后再文件最后一行加上:
Include conf/ssl.conf

ssl.conf内容可以参照xampp的配置:
关键是如下两行

SSLCertificateFile conf/ca/server.crt
SSLCertificateKeyFile conf/ca/server.key


————————————–

利用tomcatca生成证书,
然后把D:\tomcat-ca\work\ca\下的ca-cert.pem改名字为:server.crt
把ca-key.pem改名字为:server.key,把这两个文件复制到E:\Apache\Apache2\conf\ca下面。
这个时候启动apache,访问https://lizongbo.com/正常的话应该就可以使用ssl了。

4.整合Tomcat:
解压tomcat到E:\jakarta-tomcat-5.5.9.
重命名并复制到E:\Apache\Apache2\modules\mod_jk.so
新建并编辑和保存E:\Apache\Apache2\conf\workers.properties:
具体内容内容参考mod_jk的源代码。


编辑http.conf,在文件结尾增加下面的内容:
 <Directory ~ "/WEB-INF/">
     Order allow,deny
     Deny from all
    </Directory>
 <Directory ~ "/META-INF/">
     Order allow,deny
     Deny from all
    </Directory>
LoadModule jk_module modules/mod_jk.so
Alias /admin E:/jakarta-tomcat-5.5.9/server/webapps/admin
JkWorkersFile E:/apache/Apache2/conf/workers.properties
JkLogFile E:/apache/Apache2/logs/mod_jk.log
JkLogLevel info
#JkLogLevel debug
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /clusterapp/servlet/* myloadbalancer
JkMount /clusterapp/*.jsp myloadbalancer
JkMount /admin/ myloadbalancer
JkMount /admin/j_security_check myloadbalancer
JkMount /admin/*.jsp myloadbalancer
JkMount /admin/*.do myloadbalancer
JkMount /status/* status


接下来配置Tomcat:
编辑E:\jakarta-tomcat-5.5.9\conf\server.xml
123行左右,把<Engine name="Catalina" defaultHost="lizongbo.com">
改成:
     <Engine name="Catalina" defaultHost="lizongbo.com" jvmRoute="tomcat1">
修改
tomcat-user.xml
内容如下:
<?xml version=’1.0′ encoding=’utf-8′?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="lizongbo" password="lizongbopass" roles="admin,manager"/>
</tomcat-users>

5.访问http://lizongbo.com/status/
可以看到jk的状态信息。

配置Tomcat的 ssl,(也可不配置,略)。
然后修改server.xml
把转向端口8843改为443
    <Connector port="8009"
               enableLookups="false" redirectPort="443" protocol="AJP/1.3" />

配置web.xml强制使用https来访问资源,(也可不配置,略)。

这样,当如果在同一台服务器上测试apache+Tomcat的集群时候
,就可以通过80,443,8080,8443端口都能够访问到网站的http服务,
可以给用户提供更高安全性的访问,实在是一件愉悦的事情:)

参考:
http://www.chinaunix.net/jh/13/523585.html

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>


2005年05月09日

<%@page contentType="text/html; charset=UTF-8"%>
<%@page import="java.util.*"%>
<%@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>language choose</title>
</head>
<body bgcolor="#ffffff">

copyright @ lizongbo @ donews.net


<c:if test="${param['locale'] != null}">
  <fmt:setLocale value="${param['locale']}" scope="session"/>
  <fmt:setTimeZone value="${param['locale']}" scope="session"/>
</c:if>
<c:if test="${param['locale'] == null}">
  <fmt:setLocale value="${header['locale']}" scope="session"/>
  <fmt:setTimeZone value="${header['locale']}" scope="session"/>
</c:if>
<%
  Locale crtl = Locale.getDefault();
  Object cobj = session.getAttribute("javax.servlet.jsp.jstl.fmt.locale.session");
  if (cobj != null && cobj instanceof Locale) {
    crtl = (Locale) cobj;
  }
  Locale[] la = java.text.NumberFormat.getAvailableLocales();
%>
<form method="POST" action="">
  language choose:
  <br />
<select name="locale">
<%for (int i = 0; i < la.length; i++) {%>
  <option value="<%=la[i]%>" <%if (la[i].equals(crtl)) {
                                 out.print("selected=\"selected\"");
                               }%>><%= la[i].getDisplayName(crtl)%></option>
<%
  }
%>
</select>
<br />
<input type="submit" value="change"/>
</form>
</body>
</html>