﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-WEB2.0开发-随笔分类-Java Technic</title><link>http://www.blogjava.net/yaominxi/category/22281.html</link><description>心态决定行为，行为决定习惯，习惯决定命运  </description><language>zh-cn</language><lastBuildDate>Wed, 09 May 2007 11:18:21 GMT</lastBuildDate><pubDate>Wed, 09 May 2007 11:18:21 GMT</pubDate><ttl>60</ttl><item><title>个人常用的JAVA资源网站</title><link>http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Tue, 08 May 2007 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/116025.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/116025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/116025.html</trackback:ping><description><![CDATA[
<p>个人常用的JAVA资源网站</p>
<p>一.JAVA电子书</p>
<p><a href="http://www.java-cn.com/book/">http://www.java-cn.com/book/</a>　</p>
<p>优点：书籍量大，经常更新，教育网下载速度超快</p>
<p>不足：每天只能下载4本</p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/116025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-05-08 19:23 <a href="http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为公司 java 面试题</title><link>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Fri, 19 May 2006 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47096.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47096.html</trackback:ping><description><![CDATA[
<div class="postTitle"><a href="http://blog.csdn.net/shuidisha/archive/2006/05/18/744313.aspx"><img width="15" height="13" border="0" src="http://blog.csdn.net/images/zhuan.gif"/> 华为公司 java 面试题</a> <script xml:space="preserve" type="text/javascript" language="javascript">
//
ocument.title="华为公司 java 面试题 - "+document.title
//
</script></div>
<div class="postText">
<p>第一部分：选择题<br/>QUESTION NO: 1<br/>1、public class Test {<br/>public static void changeStr(String str){<br/>str="welcome";<br/>}<br/>public static void main(String[] args) {<br/>String str="1234";<br/>changeStr(str);<br/>System.out.println(str);<br/>}<br/>}<br/>Please write the output result ：</p>
<p>QUESTION NO:2<br/>1. public class Test {<br/>2. static boolean foo(char c) {<br/>3. System.out.print(c);<br/>4. return true;<br/>5. }<br/>6. public static void main( String[] argv ) {<br/>7. int i =0;<br/>8. for ( foo('A'); foo('B')&amp;&amp;(i&lt;2); foo('C')){<br/>9. i++ ;<br/>10. foo('D');<br/>12. }<br/>13. }<br/>14. }<br/>What is the result?<br/>A. ABDCBDCB<br/>B. ABCDABCD<br/>C. Compilation fails.<br/>D. An exception is thrown at runtime.</p>
<p>QUESTION NO: 3<br/>1. class A {<br/>2. protected int method1(int a, int b) { return 0; }<br/>3. }<br/>Which two are valid in a class that extends class A? (Choose two)<br/>A. public int method1(int a, int b) { return 0; }<br/>B. private int method1(int a, int b) { return 0; }<br/>C. private int method1(int a, long b) { return 0; }<br/>D. public short method1(int a, int b) { return 0; }<br/>E. static protected int method1(int a, int b) { return 0; }</p>
<p>QUESTION NO: 4<br/>1. public class Outer{<br/>2. public void someOuterMethod() {<br/>3. // Line 3<br/>4. }<br/>5. public class Inner{}<br/>6. public static void main( String[]argv ) {<br/>7. Outer o = new Outer();<br/>8. // Line 8<br/>9. }<br/>10. }<br/>Which instantiates an instance of Inner?<br/>A. new Inner(); // At line 3<br/>B. new Inner(); // At line 8<br/>C. new o.Inner(); // At line 8<br/>D. new Outer.Inner(); // At line 8//new Outer().new Inner()</p>
<p>QUESTION NO: 5<br/>Which method is used by a servlet to place its session ID in a URL that is written to the servlet's response output stream?<br/>A. The encodeURL method of the HttpServletRequest interface.<br/>B. The encodeURL method of the HttpServletResponse interface.<br/>C. The rewriteURL method of the HttpServletRequest interface.<br/>D. The rewriteURL method of the HttpServletResponse interface.</p>
<p>QUESTION NO: 6<br/>Which two are equivalent? (Choose two)<br/>A. &lt;%= YoshiBean.size%&gt;<br/>B. &lt;%= YoshiBean.getSize()%&gt;<br/>C. &lt;%= YoshiBean.getProperty("size")%&gt;<br/>D. &lt;jsp:getProperty id="YoshiBean" param="size"/&gt;<br/>E. &lt;jsp:getProperty name="YoshiBean" param="size"/&gt;<br/>F. &lt;jsp:getProperty id="YoshiBean" property="size"/&gt;<br/>G. &lt;jsp:getProperty name="YoshiBean" property="size"/&gt;</p>
<p>QUESTION NO: 7<br/>Which of the following statements regarding the lifecycle of a session bean are correct?<br/>1. java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.<br/>2. SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.<br/>3. An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.<br/>4. JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.<br/>5. Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.</p>
<p><br/>第二部分：概念题<br/>1． 描述Struts体系结构？对应各个部分的开发工作主要包括哪些？</p>
<br/><br/><br/><br/><br/><br/><p>2． XML包括哪些解释技术，区别是什么？</p>
<br/><br/><p><br/>3． JSP有哪些内置对象和动作？它们的作用分别是什么？</p>
<br/><br/><br/><br/><br/><br/><p><br/>4、SQL问答题<br/>SELECT * FROM TABLE<br/>和<br/>SELECT * FROM TABLE<br/>WHERE NAME LIKE '%%' AND ADDR LIKE '%%'<br/>AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'<br/>OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )<br/>的检索结果为何不同？</p>
<br/><p>5、SQL问答题<br/>表结构：<br/>1、 表名：g_cardapply<br/>字段(字段名/类型/长度)：<br/>g_applyno varchar 8；//申请单号（关键字）<br/>g_applydate bigint 8；//申请日期<br/>g_state varchar 2；//申请状态<br/>2、 表名：g_cardapplydetail<br/>字段(字段名/类型/长度)：<br/>g_applyno varchar 8；//申请单号（关键字）<br/>g_name varchar 30；//申请人姓名<br/>g_idcard varchar 18；//申请人身份证号<br/>g_state varchar 2；//申请状态<br/>其中，两个表的关联字段为申请单号。<br/>题目：<br/>1、 查询身份证号码为440401430103082的申请日期<br/>2、 查询同一个身份证号码有两条以上记录的身份证号码及记录个数<br/>3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07<br/>4、 删除g_cardapplydetail表中所有姓李的记录</p>
</div>
<img src ="http://www.blogjava.net/yaominxi/aggbug/47096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-19 18:10 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Log4j进行日志操作</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39351.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39351.html</trackback:ping><description><![CDATA[
<p><a name="1"><span class="atitle2">1. 概述</span></a></p>
<p><a name="1_1"><span class="atitle3">1.1. 背景</span></a></p>
<p>在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。</p>
<p>最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。</p>
<p><a name="1_2"><span class="atitle3">1.2. Log4j简介</span></a></p>
<p>在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。</p>
<p>Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。</p>
<p>此外，通过Log4j其他语言接口，您可以在C、C++、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。</p>
<p>本文介绍的Log4j版本是1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别，并详细讲解了在实践中最常使用Log4j的方法和步骤。在强调可重用组件开发的今天，相信Log4j将会给广大的设计开发人员带来方便。加入到Log4j的队伍来吧！</p>
<p><a name="2"><span class="atitle2">2. 一个简单的例子</span></a></p>
<p>我们先来看一个简单的例子，它是一个用Java实现的客户/服务器网络程序。刚开始我们不使用Log4j，而是使用了一系列的打印语句，然后我们将使用Log4j来实现它的日志功能。这样，大家就可以清楚地比较出前后两个代码的差别。</p>
<p><a name="2_1"><span class="atitle3">2.1. 不使用Log4j</span></a></p>
<p><strong>2.1.1. 客户程序</strong></p>
<pre xml:space="preserve">
<code>package log4j ;

import java.io.* ;
import java.net.* ;

/**
 *
 * &lt;p&gt; Client Without Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ClientWithoutLog4j {

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {

        String welcome = null;
        String response = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        InputStream in = null;
        OutputStream out = null;
        Socket client = null;

        try {
            client = new Socket ( "localhost", 8001 ) ;
            System.out.println ( "info: Client socket: " + client ) ;
            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {
            System.out.println ( "error: IOException : " + e ) ;
            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader( new InputStreamReader ( in ) ) ;
            writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

            welcome = reader.readLine () ;
            System.out.println ( "debug: Server says: '" + welcome + "'" ) ;

            System.out.println ( "debug: HELLO" ) ;
            writer.println ( "HELLO" ) ;
            response = reader.readLine () ;
            System.out.println ( "debug: Server responds: '" + response + "'") ;

            System.out.println ( "debug: HELP" ) ;
            writer.println ( "HELP" ) ;
            response = reader.readLine () ;
            System.out.println ( "debug: Server responds: '" + response + "'" ) ;

            System.out.println ( "debug: QUIT" ) ;
            writer.println ( "QUIT" ) ;
        } catch ( IOException e ) {
            System.out.println ( "warn: IOException in client.in.readln()" ) ;
            System.out.println ( e ) ;
        }
        try{
            Thread.sleep ( 2000 ) ;
        } catch ( Exception ignored ) {}
    }
}
</code>
</pre>
<p><strong>2.1.2. 服务器程序</strong></p>
<pre xml:space="preserve">
<code>package log4j ;

import java.util.* ;
import java.io.* ;
import java.net.* ;

/**
 *
 * &lt;p&gt; Server Without Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ServerWithoutLog4j {

    final static int SERVER_PORT = 8001 ; // this server's port

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {
        String clientRequest = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        ServerSocket server = null;
        Socket socket = null;
        InputStream in = null;
        OutputStream out = null;

        try {
            server = new ServerSocket ( SERVER_PORT ) ;
            System.out.println ( "info: ServerSocket before accept: " + server ) ;
            System.out.println ( "info: Java server without log4j, on-line!" ) ;

            // wait for client's connection
            socket = server.accept () ;
            System.out.println ( "info: ServerSocket after accept: " + server )  ;

            in = socket.getInputStream () ;
            out = socket.getOutputStream () ;

        } catch ( IOException e ) {
            System.out.println( "error: Server constructor IOException: " + e ) ;
            System.exit ( 0 ) ;
        }
        reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
        writer = new PrintWriter ( new OutputStreamWriter ( out ) , true ) ;

        // send welcome string to client
        writer.println ( "Java server without log4j, " + new Date () ) ;

        while ( true ) {
            try {
                // read from client
                clientRequest = reader.readLine () ;
                System.out.println ( "debug: Client says: " + clientRequest ) ;
                if ( clientRequest.startsWith ( "HELP" ) ) {
                    System.out.println ( "debug: OK!" ) ;
                    writer.println ( "Vocabulary: HELP QUIT" ) ;
                }
                else {
                    if ( clientRequest.startsWith ( "QUIT" ) ) {
                        System.out.println ( "debug: OK!" ) ;
                        System.exit ( 0 ) ;
                    }
                    else{
                        System.out.println ( "warn: Command '" + 
      clientRequest + "' not understood." ) ;
                        writer.println ( "Command '" + clientRequest 
      + "' not understood." ) ;
                    }
                }
            } catch ( IOException e ) {
                System.out.println ( "error: IOException in Server " + e ) ;
                System.exit ( 0 ) ;
            }
        }
    }
}
</code>
</pre>
<p><a name="2_2"><span class="atitle3">2.2. 迁移到Log4j</span></a></p>
<p><strong>2.2.1. 客户程序</strong></p>
<pre xml:space="preserve">
<code>package log4j ;

import java.io.* ;
import java.net.* ;

// add for log4j: import some package
import org.apache.log4j.PropertyConfigurator ;
import org.apache.log4j.Logger ;
import org.apache.log4j.Level ;

/**
 *
 * &lt;p&gt; Client With Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ClientWithLog4j {

    /*
    add for log4j: class Logger is the central class in the log4j package.
    we can do most logging operations by Logger except configuration.
    getLogger(...): retrieve a logger by name, if not then create for it.
    */
    static Logger logger = Logger.getLogger 
 ( ClientWithLog4j.class.getName () ) ;

    /**
     *
     * @param args : configuration file name
     */
    public static void main ( String args [] ) {

        String welcome = null ;
        String response = null ;
        BufferedReader reader = null ;
        PrintWriter writer = null ;
        InputStream in = null ;
        OutputStream out = null ;
        Socket client = null ;

        /*
        add for log4j: class BasicConfigurator can quickly configure the package.
        print the information to console.
        */
        PropertyConfigurator.configure ( "ClientWithLog4j.properties" ) ;

        // add for log4j: set the level
//        logger.setLevel ( ( Level ) Level.DEBUG ) ;

        try{
            client = new Socket( "localhost" , 8001 ) ;

            // add for log4j: log a message with the info level
            logger.info ( "Client socket: " + client ) ;

            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {

            // add for log4j: log a message with the error level
            logger.error ( "IOException : " + e ) ;

            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
            writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

            welcome = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server says: '" + welcome + "'" ) ;

            // add for log4j: log a message with the debug level
            logger.debug ( "HELLO" ) ;

            writer.println ( "HELLO" ) ;
            response = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server responds: '" + response + "'" ) ;

            // add for log4j: log a message with the debug level
            logger.debug ( "HELP" ) ;

            writer.println ( "HELP" ) ;
            response = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server responds: '" + response + "'") ;

            // add for log4j: log a message with the debug level
            logger.debug ( "QUIT" ) ;

            writer.println ( "QUIT" ) ;
        } catch ( IOException e ) {

            // add for log4j: log a message with the warn level
            logger.warn ( "IOException in client.in.readln()" ) ;

            System.out.println ( e ) ;
        }
        try {
            Thread.sleep ( 2000 ) ;
        } catch ( Exception ignored ) {}
    }
}
</code>
</pre>
<p><strong>2.2.2. 服务器程序</strong></p>
<pre xml:space="preserve">
<code>package log4j;

import java.util.* ;
import java.io.* ;
import java.net.* ;

// add for log4j: import some package
import org.apache.log4j.PropertyConfigurator ;
import org.apache.log4j.Logger ;
import org.apache.log4j.Level ;

/**
 *
 * &lt;p&gt; Server With Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ServerWithLog4j {

    final static int SERVER_PORT = 8001 ; // this server's port

    /*
    add for log4j: class Logger is the central class in the log4j package.
    we can do most logging operations by Logger except configuration.
    getLogger(...): retrieve a logger by name, if not then create for it.
    */
    static Logger logger = Logger.getLogger 
 ( ServerWithLog4j.class.getName () ) ;

    /**
     *
     * @param args
     */
    public static void main ( String args[]) {
        String clientRequest = null ;
        BufferedReader reader = null ;
        PrintWriter writer = null ;
        ServerSocket server = null ;
        Socket socket = null ;

        InputStream in = null ;
        OutputStream out = null ;

        /*
        add for log4j: class BasicConfigurator can quickly configure the package.
        print the information to console.
        */
        PropertyConfigurator.configure ( "ServerWithLog4j.properties" ) ;

        // add for log4j: set the level
//        logger.setLevel ( ( Level ) Level.DEBUG ) ;

        try{
            server = new ServerSocket ( SERVER_PORT ) ;

            // add for log4j: log a message with the info level
            logger.info ( "ServerSocket before accept: " + server ) ;

            // add for log4j: log a message with the info level
            logger.info ( "Java server with log4j, on-line!" ) ;

            // wait for client's connection
            socket = server.accept() ;

            // add for log4j: log a message with the info level
            logger.info ( "ServerSocket after accept: " + server ) ;

            in = socket.getInputStream() ;
            out = socket.getOutputStream() ;

        } catch ( IOException e ) {

            // add for log4j: log a message with the error level
            logger.error ( "Server constructor IOException: " + e ) ;
            System.exit ( 0 ) ;
        }
        reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
        writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

        // send welcome string to client
        writer.println ( "Java server with log4j, " + new Date () ) ;

        while ( true ) {
            try {
                // read from client
                clientRequest = reader.readLine () ;

                // add for log4j: log a message with the debug level
                logger.debug ( "Client says: " + clientRequest ) ;

                if ( clientRequest.startsWith ( "HELP" ) ) {

                    // add for log4j: log a message with the debug level
                    logger.debug ( "OK!" ) ;

                    writer.println ( "Vocabulary: HELP QUIT" ) ;
                }
                else {
                    if ( clientRequest.startsWith ( "QUIT" ) ) {

                        // add for log4j: log a message with the debug level
                        logger.debug ( "OK!" ) ;

                        System.exit ( 0 ) ;
                    }
                    else {

                        // add for log4j: log a message with the warn level
                        logger.warn ( "Command '" 
      + clientRequest + "' not understood." ) ;

                        writer.println ( "Command '"
      + clientRequest + "' not understood." ) ;
                    }
                }
            } catch ( IOException e ) {

                // add for log4j: log a message with the error level
                logger.error( "IOException in Server " + e ) ;

                System.exit ( 0 ) ;
            }
        }
    }
}
</code>
</pre>
<p><strong>2.2.3. 配置文件</strong></p>
<p>2.2.3.1. 客户程序配置文件</p>
<pre xml:space="preserve">
<code>log4j.rootLogger=INFO, A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
</code>
</pre>
<p>2.2.3.2. 服务器程序配置文件</p>
<pre xml:space="preserve">
<code>log4j.rootLogger=INFO, A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
</code>
</pre>
<p><a name="2_3"><span class="atitle3">2.3. 比较</span></a></p>
<p>比较这两个应用可以看出，采用Log4j进行日志操作的整个过程相当简单明了，与直接使用System.out.println语句进行日志信息输出的方式相比，基本上没有增加代码量，同时能够清楚地理解每一条日志信息的重要程度。通过控制配置文件，我们还可以灵活地修改日志信息的格式，输出目的地等等方面，而单纯依靠System.out.println语句，显然需要做更多的工作。</p>
<p>下面我们将以前面使用Log4j的应用作为例子，详细讲解使用Log4j的主要步骤。</p>
<p><a name="3"><span class="atitle2">3. Log4j基本使用方法</span></a></p>
<p>Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。</p>
<p><a name="3_1"><span class="atitle3">3.1.定义配置文件</span></a></p>
<p>其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。</p>
<p>Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：</p>
<ol class="n01">
<li>配置根Logger，其语法为：<br/><pre xml:space="preserve">
log4j.rootLogger = [ level ] , appenderName, appenderName, …
</pre>
其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。<br/>appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br/></li>
<li>配置日志信息输出目的地Appender，其语法为<br/><pre xml:space="preserve">
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
</pre>
其中，Log4j提供的appender有以下几种：<br/>org.apache.log4j.ConsoleAppender（控制台），<br/>org.apache.log4j.FileAppender（文件），<br/>org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br/>org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br/></li>
<li>配置日志信息的格式（布局），其语法为：<br/><pre xml:space="preserve">
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
</pre>
其中，Log4j提供的layout有以下几种：<br/>org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br/>org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br/>org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br/>org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br/></li>
</ol>
<p><a name="3_2"><span class="atitle3">3.2.在代码中使用Log4j</span></a></p>
<p>下面将讲述在程序代码中怎样使用Log4j。</p>
<p><strong>3.2.1.得到记录器</strong></p>
<p>使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为：<br/></p>
<pre xml:space="preserve">
public static Logger getLogger( String name)，
</pre>
通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：<br/><pre xml:space="preserve">
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;
</pre>
<p><strong>3.2.2.读取配置文件</strong></p>
<p>当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br/>BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br/>PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br/>DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</p>
<p><strong>3.2.3.插入记录信息（格式化日志信息）</strong></p>
<p>当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：</p>
<pre xml:space="preserve">
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
</pre>
<p><a name="resources" id="resources"><span class="atitle2">4. 参考资料</span></a></p>
<p>如果您想更深入地了解Log4j，请经常访问下面提及的相关链接。<br/>Log4j项目主页------------------------------------------------------<a href="http://www.log4j.org/"><span style="COLOR: #003399">http://www.log4j.org/</span></a><br/>Log4j FAQ -------------------------------------------------------<a href="http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html"><span style="COLOR: #003399">http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html</span></a></p>
<!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed-->
<img src ="http://www.blogjava.net/yaominxi/aggbug/39351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:38 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT学习指南</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39336.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39336.html</trackback:ping><description><![CDATA[
<table width="95%" align="center" cellspacing="3" border="0" class="chs">
<tbody>
<tr>
<td>
<h4><strong><span style="FONT-SIZE: 0.75em">内容摘要：</span></strong></h4>
<span style="FONT-SIZE: 0.75em">ANT是一个基于Java的自动化脚本引擎，脚本格式为XML。除了做Java编译相关任务外，ANT还可以通过插件实现很多应用的调用。 1)ANT的基本概念：<br/>2)ANT的安装：解包，设置路径<br/>3)ANT的使用：最好的学习只不过是一个简单实用的例子起步……</span>
<p><strong><span style="FONT-SIZE: 0.75em">作者：</span></strong> <span style="FONT-SIZE: 0.75em"><a href="mailto:chedong@chedong.com"><span style="COLOR: #002c99">车东</span></a> <a href="http://www.chedong.com/tech/default.html"><span style="COLOR: #002c99">http://www.chedong.com/tech/default.html</span></a></span></p>
</td>
</tr>
</tbody>
</table>
<span style="FONT-SIZE: 0.75em"><br/></span>
<hr width="95%" noshade="noshade"/>
<h2><span style="FONT-SIZE: 0.75em">ANT的基本概念：Java的Makefile</span></h2>
<p><span style="FONT-SIZE: 0.75em">当一个代码项目大了以后，每次重新编译，打包，测试等都会变得非常复杂而且重复，因此c语言中有make脚本来帮助这些工作的批量完成。在Java中应用是平台无关性的，当然不会用平台相关的make脚本来完成这些批处理任务了，ANT本身就是这样一个流程脚本引擎，用于自动化调用程序完成项目的编译，打包，测试等。除了基于JAVA是平台无关的外，脚本的格式是基于XML的，比make脚本来说还要好维护一些。<br/></span></p>
<p><span style="FONT-SIZE: 0.75em">每个ant脚本（缺省叫build.xml）中设置了一系列任务(target)：比如对于一个一般的项目可能需要有以下任务。</span></p>
<ul>
<li><span style="FONT-SIZE: 0.75em">任务1：usage 打印本脚本的帮助信息（缺省）</span></li>
<li><span style="FONT-SIZE: 0.75em">任务2：clean &lt;-- init 清空初始化环境</span></li>
<li><span style="FONT-SIZE: 0.75em">任务3：javadoc &lt;-- build &lt;-- init 生成JAVADOC</span></li>
<li><span style="FONT-SIZE: 0.75em">任务4：jar &lt;-- build &lt;-- init 生成JAR</span></li>
<li><span style="FONT-SIZE: 0.75em">任务5：all &lt;-- jar + javadoc &lt;-- build &lt;-- init 完成以上所有任务：jar javadoc</span></li>
</ul>
<span style="FONT-SIZE: 0.75em">而多个任务之间往往又包含了一定了依赖关系：比如把整个应用打包任务(jar)的这个依赖于编译任务(build)，而编译任务又依赖于整个环境初始化任务(init)等。<br/><br/>注：我看到很多项目的ant脚本中的命名基本上都是一致的，比如：编译一般叫build或者compile；打包一般叫jar或war；生成文档一般命名为javadoc或javadocs；执行全部任务all。在每个任务的中，ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富，但其实最常用的就2，3个：比如javac javadoc jar等。</span>
<h2><span style="FONT-SIZE: 0.75em">ANT的安装</span></h2>
<span style="FONT-SIZE: 0.75em">解包后在系统可执行路径中加入指向ant的bin的路径就可以了，比如可以在GNU/Linux上把以下配置加入/etc/profile中：<br/>export ANT_HOME=/home/ant<br/>export JAVA_HOME=/usr/java/j2sdk1.4.1<br/>export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin<br/><br/>这样执行ant 后，如果不指定配置文件ant会缺省找build.xml这个配置文件，并根据配置文件执行任务，缺省的任务设置可以指向最常用的任务，比如：build，或指向打印帮助信息：usage，告诉用户有那些脚本选项可以使用。<br/><br/></span>
<h2><span style="FONT-SIZE: 0.75em">ANT的使用</span></h2>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">最好的学习过程就是看懂那些open source项目中的build.xml脚本，然后根据自己的需要简化成一个更简单的，ANT和APACHE上很多非常工程派的项目：简单易用，而且适应性非常强，因为这些项目的建立往往来源于开发人员日常最直接的需求。<br/>以下是的一个<a href="http://sourceforge.net/projects/weblucene/"><span style="COLOR: #002c99">WebLucene</span></a>应用的例子：修改自<a href="http://www.jdom.org/"><span style="COLOR: #002c99">JDOM</span></a>的build.xml：<br/><br/></span>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em">&lt;project default="usage" basedir="."&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Initialization target --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="init"&gt;<br/>&lt;tstamp/&gt;<br/>&lt;property file="${basedir}/build.properties" /&gt;<br/>&lt;property name="Name" value="ProjectFullName"/&gt;<br/>&lt;property name="name" value="project_name"/&gt;<br/>&lt;property name="version" value="0.2"/&gt;<br/>&lt;property name="year" value="2003"/&gt;<br/><br/>&lt;echo message="----------- ${Name} ${version} [${year}] ------------"/&gt;<br/><br/>&lt;property name="debug" value="off"/&gt;<br/>&lt;property name="optimize" value="on"/&gt;<br/>&lt;property name="deprecation" value="on"/&gt;<br/><br/>&lt;property name="src.dir" value="./src/WEB-INF/src"/&gt;<br/>&lt;property name="lib.dir" value="./src/WEB-INF/lib"/&gt;<br/>&lt;property name="packages" value="com.chedong.*,org.apache.lucene.*"/&gt;<br/><br/>&lt;property name="build.src" value="./src/WEB-INF/build"/&gt;<br/>&lt;property name="build.dest" value="./src/WEB-INF/classes"/&gt;<br/>&lt;property name="build.javadocs" value="./src/doc"/&gt;<br/><br/>&lt;path id="classpath"&gt;<br/>&lt;pathelement path="${jsdk_jar}"/&gt;<br/>&lt;fileset dir="${lib.dir}"&gt;<br/>&lt;include name="**/*.jar"/&gt;<br/>&lt;/fileset&gt;<br/>&lt;/path&gt;<br/><br/>&lt;filter token="year" value="${year}"/&gt;<br/>&lt;filter token="version" value="${version}"/&gt;<br/>&lt;filter token="date" value="${TODAY}"/&gt;<br/>&lt;filter token="log" value="true"/&gt;<br/>&lt;filter token="verbose" value="true"/&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Help on usage --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="usage" depends="init"&gt;<br/>&lt;echo message="${Name} Build file"/&gt;<br/>&lt;echo message="-------------------------------------------------------------"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" available targets are:"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" jar --&gt; generates the ${name}.jar file"/&gt;<br/>&lt;echo message=" build --&gt; compiles the source code"/&gt;<br/>&lt;echo message=" javadoc --&gt; generates the API documentation"/&gt;<br/>&lt;echo message=" clean --&gt; cleans up the directory"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" Please rename build.properties.default to build.properties"/&gt;<br/>&lt;echo message=" and edit build.properties to specify JSDK 2.3 classpath."/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" See the comments inside the build.xml file for more details."/&gt;<br/>&lt;echo message="-------------------------------------------------------------"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Prepares the source code --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="prepare-src" depends="init"&gt;<br/>&lt;!-- create directories --&gt;<br/>&lt;mkdir dir="${build.src}"/&gt;<br/>&lt;mkdir dir="${build.dest}"/&gt;<br/><br/>&lt;!-- copy src files --&gt;<br/>&lt;copy todir="${build.src}"&gt;<br/>&lt;fileset dir="${src.dir}"/&gt;<br/>&lt;/copy&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Compiles the source directory --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="build" depends="prepare-src"&gt;<br/>&lt;javac srcdir="${build.src}"<br/>destdir="${build.dest}"<br/>debug="${debug}"<br/>optimize="${optimize}"&gt;<br/>&lt;classpath refid="classpath"/&gt;<br/>&lt;/javac&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the class package --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="jar" depends="build"&gt;<br/>&lt;jar jarfile="${lib.dir}/${name}.jar"<br/>basedir="${build.dest}"<br/>includes="**"/&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the API documentation --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="javadoc" depends="build"&gt;<br/>&lt;mkdir dir="${build.javadocs}"/&gt;<br/>&lt;javadoc packagenames="${packages}"<br/>sourcepath="${build.src}"<br/>destdir="${build.javadocs}"<br/>author="true"<br/>version="true"<br/>use="true"<br/>splitindex="true"<br/>windowtitle="${Name} API"<br/>doctitle="${Name}"&gt;<br/>&lt;classpath refid="classpath"/&gt;<br/>&lt;/javadoc&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Clean targets --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="clean" depends="init"&gt;<br/>&lt;delete dir="${build.src}"/&gt;<br/>&lt;delete dir="${build.dest}/org"/&gt;<br/>&lt;delete dir="${build.dest}/com"/&gt;<br/>&lt;delete&gt;<br/>&lt;fileset dir="${build.dest}" includes="**/*.class"/&gt;<br/>&lt;/delete&gt;<br/>&lt;/target&gt;<br/>&lt;/project&gt;<br/>&lt;!-- End of file --&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em"><br/><br/>缺省任务：usage 打印帮助文档，告诉有那些任务选项：可用的有build, jar, javadoc和clean.<br/><br/>初始化环境变量：init<br/>所有任务都基于一些基本环境变量的设置初始化完成，是后续其他任务的基础，在环境初始化过程中，有2点比较可以方便设置：<br/><br/>1 除了使用却缺省的property设置了JAVA源路径和输出路径外，引用了一个外部的build.properties文件中的设置，<br/>&lt;property file="${basedir}/build.properties" /&gt;<br/>这样大部分简单配置用户只要会看懂build.properties就可以了，毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。<br/><br/>2 CLASSPATH设置：使用了其中的：</span></p>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em">&lt;path id="classpath"&gt;<br/>&lt;pathelement path="${jsdk_jar}"/&gt;<br/>&lt;fileset dir="${lib.dir}"&gt;<br/>&lt;include name="**/*.jar"/&gt;<br/>&lt;/fileset&gt;<br/>&lt;/path&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">则相当于设置了：CLASSPATH=/path/to/resin/lib/jsdk23.jar;/path/to/project/lib/*.jar;<br/><br/>文件复制：prepare-src<br/>创建临时SRC存放目录和输出目录。</span></p>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em">&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Prepares the source code --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="prepare-src" depends="init"&gt;<br/>&lt;!-- create directories --&gt;<br/>&lt;mkdir dir="${build.src}"/&gt;<br/>&lt;mkdir dir="${build.dest}"/&gt;<br/><br/>&lt;!-- copy src files --&gt;<br/>&lt;copy todir="${build.src}"&gt;<br/>&lt;fileset dir="${src.dir}"/&gt;<br/>&lt;/copy&gt;<br/>&lt;/target&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">编译任务：build<br/>编译时的CLASSPATH环境通过一下方式找到引用一个path对象</span></p>
<table width="90%" cellspacing="1" border="1" class="en" bgcolor="#EBEBEB">
<tbody>
<tr>
<td class="c"><span style="FONT-SIZE: 0.75em">&lt;classpath refid="classpath"/&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">打包任务：jar<br/>对应用打包生成项目所写名的.jar文件</span></p>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em"><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the class package --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="jar" depends="build"&gt;<br/>&lt;jar jarfile="${lib.dir}/${name}.jar"<br/>basedir="${build.dest}"<br/>includes="**"/&gt;<br/>&lt;/target&gt;<br/><br/>生成JAVADOC文档任务: javadoc<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the API documentation --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="javadoc" depends="build"&gt;<br/>&lt;mkdir dir="${build.javadocs}"/&gt;<br/>&lt;javadoc packagenames="${packages}"<br/>sourcepath="${build.src}"<br/>destdir="${build.javadocs}"<br/>author="true"<br/>version="true"<br/>use="true"<br/>splitindex="true"<br/>windowtitle="${Name} API"<br/>doctitle="${Name}"&gt;<br/>&lt;classpath refid="classpath"/&gt;<br/>&lt;/javadoc&gt;<br/>&lt;/target&gt;<br/><br/>清空临时编译文件：clean<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Clean targets --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="clean" depends="init"&gt;<br/>&lt;delete dir="${build.src}"/&gt;<br/>&lt;delete dir="${build.dest}/org"/&gt;<br/>&lt;delete dir="${build.dest}/com"/&gt;<br/>&lt;delete&gt;<br/>&lt;fileset dir="${build.dest}" includes="**/*.class"/&gt;<br/>&lt;/delete&gt;<br/>&lt;/target&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">TODO：<br/>更多任务/扩展：（样例）<br/></span></p>
</div>
<ul>
<li><span style="FONT-SIZE: 0.75em">测试任务：JUnit测试</span></li>
<li><span style="FONT-SIZE: 0.75em">代码风格检查任务：CheckStyle，Jalopy等</span></li>
<li><span style="FONT-SIZE: 0.75em">邮件警报任务：可以把以上这些任务的输出警告发送到制定的用户列表中，这个任务可以设置每天自动运行。</span></li>
</ul>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:14 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>