2005年02月22日
网络环境如下:
 
三台服务器。
1.网关,公网IP,
2.domino邮件服务器。
3.另一台服务器。
 
通过把网关的端口25,映射到domino服务器上,让domino服务器可以收发邮件。
同时domino服务器还要把部分邮件转发到服务器3上。
大家的发邮件smtp统一是domino服务器。
由于domino过滤垃圾邮件服务器的功能不强,并且,为了实现转发邮件,因此domino服务器被迫取消了smtp验证,
即使用open reply模式。
在这种情况下,自从服务器被人盯上用来进行垃圾邮件发送和中转之后,
给服务器的性能带来很大影响,也影响了正常邮件的收发。
 
Apache James是个非常优秀的邮件服务器。
由于实际情况的特殊,没有办法通过简单的配置来同时不发送垃圾邮件和正常转发邮件到domino服务器,
在察看james文档之后,通过实现mailets接口来做到了这件事情。
 
现在的网络配置如下。
增加一台服务器,运行james,邮件域名和domino的一致。(因为域名一致,所以无法使用james内置的forward,才需要自己来实现邮件发送功能)
修改james的配置信息,使之需要smtp验证,网关端口25映射到james服务器的25端口上。
我增加了一个james matcher。来匹配邮件并进行发送到domino服务器。
大致代码如下:
 private String domain = “lizongbo.com”;
 public Collection match(Mail mail) throws MessagingException {
        if ((mail.getSender().toString().indexOf(this.getDomain()) > 0)) {
            System.out.println(“收到来自” + mail.getSender() + “的邮件”);
            String path = “mailsavein/” + System.currentTimeMillis()
                          + “.txt”;
            savemail(mail, path);
            JavaMailSender jms = new JavaMailSender();
            jms.sendmail(path);
        }
        for (Iterator i = mail.getRecipients().iterator(); i.hasNext(); ) {
            MailAddress rec = (MailAddress) i.next();
            if (rec.toString().indexOf(this.getDomain()) > 0) {
                System.out.println( “收到” + mail.getSender()
                                   + “一封发给” + rec + “的邮件”);
                String path = “mailsavein/” + System.currentTimeMillis()
                              + “.txt”;
                savemail(mail, path);
                JavaMailSender jms = new JavaMailSender();
                jms.sendmail(path);
            }
        }
        return mail.getRecipients();
    }
 
 
经过配置运行,现在domino服务器无法再会被外网的人利用起来进行垃圾邮件的发送了。
这样保证了domino服务器的稳定,也省下了买专门的邮件网关的开销。
 
通过对james的扩展,还可以实现很多更强大的垃圾邮件过滤,杀毒过滤,与SpamAssasin结合进行垃圾邮件过滤等等。
具体可以参考:http://wiki.apache.org/james
 
 
由于james使用的开发框架avalon落后,已经被apache终止。因此james3.x版本需要大的改动和升级,期待3.0版本的出现,能够提供更强大的功能。

2005年02月21日


先是直接的收件人地址.
然后cc表示抄送人地址
bcc:密送人地址。
subject:邮件标题
body:邮件内容.

示例如:
mailto:lizongbo@gamil.com?cc=lizongbo@msn.com&bcc=test@test.com&subject=test&body=Hello

see : http://www.gitnet.de/content/web-design/html/tipps/mailto.htm

2005年02月19日

出于安全考虑,只给出最简单的不带危险操作的演示例子。 copyright © lizongbo
这个例子的前提条件是你此刻已经登陆了csdn的论坛并且正是在线状态。
(根据浏览器对临时会话的继承机制,是否必须使用myie我不太确定,本例子仅在myie(Maxthon) 里测试)
打开下面的连接可以看到最简单的效果:
copyright © lizongbo


http://community.csdn.net/Expert/ForumList_Search.asp?searchtype=2&bigclassid=14&smallclassid=1404&searchKeys=<script%20language=’javascript’>alert(‘testonly’)</script>&author=&tabletype=now&Submit2=

这个连接是csdn论坛的搜索连接。

本示例没有用来作会造成任何任何真正危险的事情。请放心点击察看效果。
就我所知: 
1.这里的blog也是支持javascript的,
2.csdn的用户信息cookie虽然是加密的,却不是会动态改变的,
3.更可怕是csdn采取cookie实现的单点登陆机制,它的某些cookie的domain是csdn.net。

所以如果有人把这几个条件都利用了起来,扩展一下思路,那么将可能弄出给访问csdn网站的用户带来一定的危险的东西。

但愿csdn有关人员可以及时的弥补上一些缺陷。

copyright © lizongbo

通过 Tomcat的配置可以限制某些主机访问,或者禁止某些IP地址访问。
根据这个思路,我写了一个增强功能的Class,通过灵活的配置,实现可以禁止某些浏览器访问,或者只允许某些浏览器的访问,
而且,还可以用来防盗链。但是Tomcat的 bug管理人员认为这个没有必要,非要让大家自己去用过滤器来实现:(

先给配置信息示例:
<Valve className=”org.apache.catalina.valves.RequestHeaderValve” 
header=”User-Agent”          deny=”*httunit*”/> 
<Valve className=”org.apache.catalina.valves.RequestHeaderValve”
header=”Referer”     deny=”*.mydomain.com, *localhost*”/>

上面的代码表示,禁止用户用httpunit访问,和禁止localhos等盗链连接。

具体的java代码在:

package org.apache.catalina.valves;

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

import org.apache.catalina.connector.*;

/**
 * <p>Title: Request Header Filter For Tomcat</p>
 * <p>Description:
 * eg: set follow coment in ${catalina.home}/conf/server.xml:
 * <Valve className=”org.apache.catalina.valves.RequestHeaderValve” header=”User-Agent”
         deny=”*httunit*”/>
 * then you can forbidden someone use httpunit to Access the Engine ,Host or Context
 * or:
 * <Valve className=”org.apache.catalina.valves.RequestHeaderValve” header=”Referer”
         deny=”*.mydomain.com, *localhost*”/>
 * then you can forbidden someone open the link from *.mydomain.com or localhost
 * </p>
 * <p>Copyright: Apache License Version 2.0  </p>
 * <p>Company: lizongbo</p>
 * @author lizongbo @ gmail.com
 * @version 1.0
 */
public final class RequestHeaderValve
    extends RequestFilterValve {
  private String header = “”;
  public void invoke(Request request, Response response) throws IOException,
      ServletException {
    String headervalue = request.getRequest().getHeader(getHeader());
    headervalue = headervalue != null ? headervalue : “”;
    process(headervalue, request, response);
  }

  public String getHeader() {
    return header;
  }

  public void setHeader(String header) {
    this.header = header;
  }
}



编译好的class必须放到:

%TOMCATHOME%\server\classes\org\apache\catalina\valves
例如: ”D:\jakarta-tomcat-5.5.7
\server\classes\org\apache\catalina\valves\RequestHeaderValve.class.class”


bug 提交在:

http://issues.apache.org/bugzilla/show_bug.cgi?id=33632

申请了一个Google group,也在这里放了一份:
http://groups-beta.google.com/group/lizongbo/browse_thread/thread/07389803736c635e/1ee8442eee5231d9

使用我写的这个Class,然后再Tomcat里配置一下,比在自己的Webapp里配置的过滤器还要方便,高效。
一行配置就搞定:

server.xml里增加下面的配置:
<Valve className=”org.apache.catalina.valves.CharSetValve” encoding=”GBK”/>
可以放到Engine, Host, 或者 Context 元素中:

例如:
<Context docBase=”d:\lizongbo\mywebapp” path=”/lizongbo”
         privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
<Valve className=”org.apache.catalina.valves.CharSetValve” encoding=”GBK”/>
</Context>

当然这个class不存在的,于是,下面是java代码,
把编译好的class放到 D:\jakarta-tomcat-5.5.7
\server\classes\org\apache\catalina\valves\下,就可以了。

java 代码:

package org.apache.catalina.valves;

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

import org.apache.catalina.*;
import org.apache.catalina.connector.*;
import org.apache.catalina.util.*;

/**
 * <p>Title: CharSetValve </p>
 * <p>Description: a CharSet Filter for Tomcat Application</p>
 * <p>Copyright: Apache License Version 2.0  </p>
 * <p>Company: lizongbo</p>
 * @author lizongbo @ gmail.com
 * @version 1.0
 */
public class CharSetValve
    extends ValveBase implements Lifecycle {
  public CharSetValve() {
    super();
  }

  protected LifecycleSupport lifecycle = new LifecycleSupport(this);

  private StringManager sm =
      StringManager.getManager(Constants.Package);

  private boolean started = false;
  private String encoding = System.setProperty(“file.encoding”, “GBK”);

  public String getEncoding() {
    return encoding;
  }

  public void setEncoding(String encoding) {
    this.encoding = encoding;
  }

  public void invoke(Request request, Response response) throws IOException,
      ServletException {
    request.getRequest().setCharacterEncoding(getEncoding());
    getNext().invoke(request, response);

  }

  public void addLifecycleListener(LifecycleListener listener) {
    lifecycle.addLifecycleListener(listener);
  }

  public LifecycleListener[] findLifecycleListeners() {
    return lifecycle.findLifecycleListeners();

  }

  public void removeLifecycleListener(LifecycleListener listener) {

    lifecycle.removeLifecycleListener(listener);

  }

  public void start() throws LifecycleException {

    if (started) {
      throw new LifecycleException
          (sm.getString(“accessLogValve.alreadyStarted”));
    }

  }

  public void stop() throws LifecycleException {
    if (!started) {
      throw new LifecycleException
          (sm.getString(“accessLogValve.notStarted”));
    }
    lifecycle.fireLifecycleEvent(STOP_EVENT, null);
    started = false;

  }
}



详情请参考:
http://issues.apache.org/bugzilla/show_bug.cgi?id=32795


对了,Tomcat的示例里:
D:\jakarta-tomcat-5.5.7\webapps\servlets-examples\WEB-INF\web.xml

里被日本人强制指定默认值为日文编码了,FT!!!!!!!!!!!!!!!!!!!!!!!!!!!

<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>EUC_JP</param-value>
</init-param>
</filter>

2005年02月18日
1.安装perl,下载地址:
http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.6.811-MSWin32-x86-122208.msi
http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl
b.运行安装程序,安装到d:\perl,其余使用默认值,安装完成即可。
2.让Tomcat支持cgi.(只需要第一步)
1. 把servlets-cgi.renametojar (在CATALINA_HOME/server/lib/目录下)改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。
3.按照http://www.pchighway.com/helpdesk/index.php?page=index_v2&id=1675&c=2
或者http://www.turro.org/Portal?xpc=1$@8$@1$@1&folder=20050104154634840
下载那个http://www.pchighway.com/helpdesk/awstats.war
解压到D:\jakarta-tomcat-5.5.7\webapps.
先把D:\jakarta-tomcat-5.5.7\webapps\awstats\WEB-INF\cgi-bin下的awstats.model.conf命名为common.conf,
接着建立新文件,awstats.localhost.conf内容参考车东的文件,
启动Tomcat,通过
http://localhost:8080/awstats/cgi-bin/awstats.pl?config=localhost&update=1
就可以生成日志分析结果了。
 
为了保护日志分析,我在
D:\jakarta-tomcat-5.5.7\webapps\awstats\WEB-INF\web.xml里加上了下面一段
(来自D:\jakarta-tomcat-5.5.7\server\webapps\manager\web.xml)用来保护访问资源:
 

 <!– Define reference to the user database for looking up roles –>
 <resource-env-ref>
  <description>
      Link to the UserDatabase instance from which we request lists of
      defined role names.  Typically, this will be connected to the global
      user database with a ResourceLink element in server.xml or the context
      configuration file for the Manager web application.
    </description>
  <resource-env-ref-name>users</resource-env-ref-name>
  <resource-env-ref-type>org.apache.catalina.UserDatabase</resource-env-ref-type>
 </resource-env-ref>
 <!– Define a Security Constraint on this Application –>
 <security-constraint>
  <web-resource-collection>
   <web-resource-name>awstats status</web-resource-name>
   <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>manager</role-name>
  </auth-constraint>
 </security-constraint>
 <!– Define the Login Configuration for this Application –>
 <login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>Awstats status</realm-name>
 </login-config>
 <!– Security roles referenced by this web application –>
 <security-role>
  <description>
      The role that is required to log in to the Manager Application
    </description>
  <role-name>lizongbo</role-name>
 </security-role>

 
相关参考资源:
 
http://www.chedong.com/tech/awstats.html
http://www.chedong.com/cgi-bin/awstats/awstats.pl?config=chedong
http://www.chedong.com/tech/search_engines.pm
http://awstats.sourceforge.net/


2005年02月16日
java.util.Collections.sort(List list)与Comparable,Comparator 接口
 
调用java.util.Collections.sort(List list)方法来进行排序的时候,
List内的Object都必须实现了Comparable接口。
否则出现下面的错误:
java.lang.ClassCastException
 at java.util.Arrays.mergeSort(Arrays.java:1152)
 at java.util.Arrays.sort(Arrays.java:1079)
 at java.util.Collections.sort(Collections.java:113)

 
或者调用
java.util.Collections.sort(List list,Comparator c),
可以临时声明一个Comparator 来实现排序。
 
Comparable接口的 public int compareTo(Object arg0) {]
返回值大于0,则this被排在后面。arg0放在前面。
可以参看Integer 的compareTo()方法:
 
    public int compareTo(Integer anotherInteger) {
 int thisVal = this.value;
 int anotherVal = anotherInteger.value;
 return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
    }
返回值>=0,则不调用Arrays.swap(Object x[], int a, int b) 方法。
 

copyright © lizongbo

通过java.util.Collections.sort(List list,Comparator c)里临时声明的Comparator
可以方便的实现顺序或者倒序排列。

copyright © lizongbo

示例如下:

copyright © lizongbo

  Collections.sort(imageList, new Comparator() {
    public int compare(Object a, Object b) {
      int orderA = Integer.parseInt( ( (Image) a).getSequence());
      int orderB = Integer.parseInt( ( (Image) b).getSequence());
      return orderA – orderB;
    }
  });
如果需要改变排列顺序

copyright © lizongbo

改成return orderb – orderA 即可。

具体可以参考学习例子有:

copyright © lizongbo

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting
http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TableSorter.java
http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TableSorterDemo.java
 

copyright © lizongbo

这是一个实现了点击表格标题栏来实现表格数据排序的例子。
 

copyright © lizongbo

ps:  Collection(包括ArrayList等)的remove(Object o)方法
(src:java.util.AbstractCollection.java)
if (o.equals(e.next())) {
      e.remove();
使用的equals来判断的,而如果没有重写equals方法的话,
实际调用Object的
public boolean equals(Object obj) {
 return (this == obj);
    }
 
因此,放进在集合里的元素,建议都重新实现自己的 equals方法。
 

copyright © lizongbo

 
 
 

 
2005年02月15日
1.在建立好PhysicalDataModel之后,按Ctrl+Shift+O生成OOM。语言选择java。
2.打开一个class,切换到Attributes面板,先把变量的属性设置为private(这步可以不操作)
然选中需要生成getter/setter方法的变量,然后点“Add accessors”,点应用。

copyright © lizongbo

3。切换到Preview面板预览代码。与Hibernate等生成的pojo代码差不多。
 
 
 

copyright © lizongbo

 
 

 
powerdesigner版本10.0
一个使用自定义命名空间的Schema文件,xml文件和castor生成的java代码例子。
平时只使用到了最简单的xml数据绑定,现在测试一个稍微复杂点的例子。
关于xml Schema,有篇好文章:http://gis.pku.edu.cn/Resources/TR/XML_Schema.doc
通过xml数据绑定可以省下很多写Javabean代码的时间。

一个使用自定义命名空间的Schema文件,xml文件和castor生成的java代码例子。
平时只使用到了最简单的xml数据绑定,现在测试一个稍微复杂点的例子。
 
关于xml Schema,有篇好文章:http://gis.pku.edu.cn/Resources/TR/XML_Schema.doc
 
xsd文件:
 
 
<?xml version=”1.0″ encoding=”GB2312″?>
<!– edited by lizongbo –>
<xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema” xmlns:userinfo=”user” targetNamespace=”user” elementFormDefault=”qualified” attributeFormDefault=”unqualified”>
 <xs:element name=”userinfo”>
  <xs:annotation>
   <xs:documentation>Comment describing your root element</xs:documentation>
  </xs:annotation>
  <xs:complexType>
   <xs:sequence>
    <xs:element ref=”userinfo:loginifo”/>
    <xs:element ref=”userinfo:mailinfo”/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name=”loginifo”>
  <xs:annotation>
   <xs:documentation>登陆信息</xs:documentation>
  </xs:annotation>
  <xs:complexType>
   <xs:sequence>
    <xs:element name=”username” type=”xs:string” default=”lizongbo”>
     <xs:annotation>
      <xs:documentation>用户名</xs:documentation>
     </xs:annotation>
    </xs:element>
    <xs:element name=”userpass” type=”xs:string” default=”lizongbopass”>
     <xs:annotation>
      <xs:documentation>密码</xs:documentation>
     </xs:annotation>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name=”mailinfo”>
  <xs:complexType>
   <xs:sequence>
    <xs:element name=”addr” type=”xs:string” default=”lizongbo @ gamil.com”>
     <xs:annotation>
      <xs:documentation xml:lang=”zh”>邮件地址</xs:documentation>
      <xs:documentation xml:lang=”en”>Email Address</xs:documentation>
     </xs:annotation>
    </xs:element>
    <xs:element name=”person” type=”xs:string” default=”lzb”>
     <xs:annotation>
      <xs:documentation>收件人名字</xs:documentation>
     </xs:annotation>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>
 
 
 
xml文件:
 
<?xml version=”1.0″ encoding=”GB2312″?>
<!–Sample XML file edited by lizongbo–>
<userinfo xmlns=”user” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”user
C:\ntest.xsd”>
 <loginifo>
  <username>lizongbo</username>
  <userpass>lizongbopass</userpass>
 </loginifo>
 <mailinfo>
  <addr>lizongbo @ gamil.com</addr>
  <person>lzb</person>
 </mailinfo>
</userinfo>
 
 
java文件Userinfo.java:
(Loginifo.java略去)
/*
 * This class was automatically generated with
 * <a href=”http://www.castor.org” > Castor 0.9.5.3</a>, using an XML
 * Schema.
 * $Id$
 */
 
package com.lizongbo.;
 
  //———————————/
 //- Imported classes and packages -/
//———————————/
 
import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.io.Writer;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.xml.sax.ContentHandler;
 
/**
 * Comment describing your root element
 *
 * @version $Revision$ $Date$
 */
public class Userinfo implements java.io.Serializable {
 

      //————————–/
     //- Class/Member Variables -/
    //————————–/
 
    /**
     * 登陆信息
     */
    private com.lizongbo..Loginifo _loginifo;
 
    /**
     * Field _mailinfo
     */
    private com.lizongbo..Mailinfo _mailinfo;
 

      //—————-/
     //- Constructors -/
    //—————-/
 
    public Userinfo() {
        super();
    } //– com.lizongbo..Userinfo()
 

      //———–/
     //- Methods -/
    //———–/
 
    /**
     * Returns the value of field ‘loginifo’. The field ‘loginifo’
     * has the following description: 登陆信息
     *
     * @return the value of field ‘loginifo’.
     */
    public com.lizongbo..Loginifo getLoginifo()
    {
        return this._loginifo;
    } //– com.lizongbo..Loginifo getLoginifo()
 
    /**
     * Returns the value of field ‘mailinfo’.
     *
     * @return the value of field ‘mailinfo’.
     */
    public com.lizongbo..Mailinfo getMailinfo()
    {
        return this._mailinfo;
    } //– com.lizongbo..Mailinfo getMailinfo()
 
    /**
     * Method isValid
     */
    public boolean isValid()
    {
        try {
            validate();
        }
        catch (org.exolab.castor.xml.ValidationException vex) {
            return false;
        }
        return true;
    } //– boolean isValid()
 
    /**
     * Method marshal
     *
     * @param out
     */
    public void marshal(java.io.Writer out)
        throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException
    {
       
        Marshaller.marshal(this, out);
    } //– void marshal(java.io.Writer)
 
    /**
     * Method marshal
     *
     * @param handler
     */
    public void marshal(org.xml.sax.ContentHandler handler)
        throws java.io.IOException, org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException
    {
       
        Marshaller.marshal(this, handler);
    } //– void marshal(org.xml.sax.ContentHandler)
 
    /**
     * Sets the value of field ‘loginifo’. The field ‘loginifo’ has
     * the following description: 登陆信息
     *
     * @param loginifo the value of field ‘loginifo’.
     */
    public void setLoginifo(com.lizongbo..Loginifo loginifo)
    {
        this._loginifo = loginifo;
    } //– void setLoginifo(com.lizongbo..Loginifo)
 
    /**
     * Sets the value of field ‘mailinfo’.
     *
     * @param mailinfo the value of field ‘mailinfo’.
     */
    public void setMailinfo(com.lizongbo..Mailinfo mailinfo)
    {
        this._mailinfo = mailinfo;
    } //– void setMailinfo(com.lizongbo..Mailinfo)
 
    /**
     * Method unmarshal
     *
     * @param reader
     */
    public static java.lang.Object unmarshal(java.io.Reader reader)
        throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException
    {
        return (com.lizongbo..Userinfo) Unmarshaller.unmarshal(com.lizongbo..Userinfo.class, reader);
    } //– java.lang.Object unmarshal(java.io.Reader)
 
    /**
     * Method validate
     */
    public void validate()
        throws org.exolab.castor.xml.ValidationException
    {
        org.exolab.castor.xml.Validator validator = new org.exolab.castor.xml.Validator();
        validator.validate(this);
    } //– void validate()
 
}
 
 
————————————————–
/*
 * This class was automatically generated with
 * <a href=”http://www.castor.org”>Castor 0.9.5.3</a>, using an XML
 * Schema.
 * $Id$
 */
 
package com.lizongbo.;
 
  //———————————/
 //- Imported classes and packages -/
//———————————/
 
import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.io.Writer;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.xml.sax.ContentHandler;
 
/**
 * Class Mailinfo.
 *
 * @version $Revision$ $Date$
 */
public class Mailinfo implements java.io.Serializable {
 

      //————————–/
     //- Class/Member Variables -/
    //————————–/
 
    /**
     * 邮件地址
     */
    private java.lang.String _addr = “lizongbo @ gamil.com”;
 
    /**
     * 收件人名字
     */
    private java.lang.String _person = “lzb”;
 

      //—————-/
     //- Constructors -/
    //—————-/
 
    public Mailinfo() {
        super();
        setAddr(“lizongbo @ gamil.com”);
        setPerson(“lzb”);
    } //– com.lizongbo..Mailinfo()
 

      //———–/
     //- Methods -/
    //———–/
 
    /**
     * Returns the value of field ‘addr’. The field ‘addr’ has the
     * following description: 邮件地址
     *
     * @return the value of field ‘addr’.
     */
    public java.lang.String getAddr()
    {
        return this._addr;
    } //– java.lang.String getAddr()
 
    /**
     * Returns the value of field ‘person’. The field ‘person’ has
     * the following description: 收件人名字
     *
     * @return the value of field ‘person’.
     */
    public java.lang.String getPerson()
    {
        return this._person;
    } //– java.lang.String getPerson()
 
    /**
     * Method isValid
     */
    public boolean isValid()
    {
        try {
            validate();
        }
        catch (org.exolab.castor.xml.ValidationException vex) {
            return false;
        }
        return true;
    } //– boolean isValid()
 
    /**
     * Method marshal
     *
     * @param out
     */
    public void marshal(java.io.Writer out)
        throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException
    {
       
        Marshaller.marshal(this, out);
    } //– void marshal(java.io.Writer)
 
    /**
     * Method marshal
     *
     * @param handler
     */
    public void marshal(org.xml.sax.ContentHandler handler)
        throws java.io.IOException, org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException
    {
       
        Marshaller.marshal(this, handler);
    } //– void marshal(org.xml.sax.ContentHandler)
 
    /**
     * Sets the value of field ‘addr’. The field ‘addr’ has the
     * following description: 邮件地址
     *
     * @param addr the value of field ‘addr’.
     */
    public void setAddr(java.lang.String addr)
    {
        this._addr = addr;
    } //– void setAddr(java.lang.String)
 
    /**
     * Sets the value of field ‘person’. The field ‘person’ has the
     * following description: 收件人名字
     *
     * @param person the value of field ‘person’.
     */
    public void setPerson(java.lang.String person)
    {
        this._person = person;
    } //– void setPerson(java.lang.String)
 
    /**
     * Method unmarshal
     *
     * @param reader
     */
    public static java.lang.Object unmarshal(java.io.Reader reader)
        throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException
    {
        return (com.lizongbo..Mailinfo) Unmarshaller.unmarshal(com.lizongbo..Mailinfo.class, reader);
    } //– java.lang.Object unmarshal(java.io.Reader)
 
    /**
     * Method validate
     */
    public void validate()
        throws org.exolab.castor.xml.ValidationException
    {
        org.exolab.castor.xml.Validator validator = new org.exolab.castor.xml.Validator();
        validator.validate(this);
    } //– void validate()
 
}
1。当多人合作开发程序时,都使用了log4j,而且各自写了各自的log4j,properties配置文件 ,
在程序合并的时候,如果要合并配置文件的话,在后期开发维护又会产生一些不便。

//copyright © li zong bo

而log4j自身的配置信息,在读取新配置文件的时候,老配置文件的信息不会叠加。  
因此自己写了个下面的方法。用来兼容老的配置信息的读取,也增强了配置文件的灵活性。
使用方法,只要配置文件名字满足log4j*.properties,再指定配置文件存放的文件夹就可以了。
 
/*
import org.apache.log4j.PropertyConfigurator;
 
PropertyConfigurator.configure(Properties properties);
使用这个方法来调用即可。

//copyright © li zongbo

*/
 
public static Properties loadproperties(String dir)
        throws FileNotFoundException, IOException {
        return loadproperties(dir, null);
    }
 

//copyright © lizongbo

    public static Properties loadproperties(String dir, String fileNamestartWith)
        throws FileNotFoundException, IOException {
        if (fileNamestartWith == null) {
            fileNamestartWith = “log4j”;
        }
 

//copyright © li zongbo

        Properties pro = new Properties();
        File fdir = new File(dir);
 

//copyright © lizong bo

        if (fdir.isFile()) {
            if (fdir.getName().toLowerCase().endsWith(“.properties”)) {
                pro.load(new FileInputStream(fdir));
            }
        } else {
            File[] fspro = fdir.listFiles();
 

//copyright © lizongbo

            for (int i = 0; i < fspro.length; i++) {
                if (fspro[i].getName().startsWith(fileNamestartWith) &&
                        fspro[i].getName().toLowerCase().endsWith(“.properties”)) {
                    Properties temppro = new Properties();
                    temppro.load(new FileInputStream(fspro[i]));

//copyright © lizongbo

 

//copyright © lizongbo

                    for (Enumeration e = temppro.keys(); e.hasMoreElements();) {
                        String key = (String) e.nextElement();
                        pro.setProperty(key, temppro.getProperty(key));
                    }
                }
            }
        }

//copyright © lizongbo

 

//copyright © lizongbo

        return pro;
    }