<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Perifort Pro.</title>
    <description>姓名：Miles W.
职业：Developer
年龄：22
位置：中国，**

差别，是我要寻找的东西。
而目前，我所要做的，就是投入自己热衷的事业，并且坚持她。</description>
    <link>http://pf-miles.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>给大伙儿preview一个有意思的东西</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/198473" style="color:red;">http://pf-miles.javaeye.com/blog/198473</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用了一段时间的seam，感觉seam有很多先进的思想值得发扬，但这段时间内我正一步一步地变得不喜欢JSF；因为它的组件开发很困难，还因为JSF本身许多已实现的组件——像richFaces或iceFaces——也有很多很多让人眼花缭乱的属性在使用的过程中需要学习，熟悉，感觉还是很麻烦，不如直接使用HTML和JS的知识来作view方便。<br />我在这里没有带任何感情色彩地针对JSF，我只是实话实说我认为的JSF的缺点；<br />并且，更重要的，我想让seam脱离JSF也能使用，而且因为比较着急，我从上个星期开始，就在抽时间做一件事情——Seam-Velocity；并且到现在，这个工具（我暂且叫它工具吧），已经能胜任大部分的seam-web开发工作了，虽然可能会有一些bug；seam手册自带的前几个例子是没问题的；<br />好了，说说这个seam-velocity到底是个什么东西吧：<br />它当然是一个抛弃JSF，转而使用velocity，用传统的HTML、JS来开发seam应用的东西，彻底替换seam中view的开发技术，算是个小小的表现层——控制层框架。<br /><br />介绍一些大致的信息：<br /><br />首先，请求处理流程：<br /><img src="http://www.javaeye.com/upload/picture/pic/15207/c34e56c9-412b-3c9b-aabc-42d8b19541c9.png?1212071277" /><br /><br />那么，front-controller的代码骨架就差不多是这样：<br /><pre name="code" class="java">protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        /*
         * if value binding exists, update values in contexts, except
         * conversationId, 'action' param and converter setting params
         */
        
        this.updateValue(req, exList);

        // if action event exists, execute the action
        if (StringUtils.isNotEmpty(req.getParameter(FORM_ACTION_PARAM))) {

            // invoke action
            String target = this.doAction(req);

            // action invoke returned non-null value
            if (StringUtils.isNotEmpty(target)) {

                // need redirect, doing redirect
                if (target.startsWith(REDIRECT_PREFIX)) {
                    resp.sendRedirect(StringUtils.substringAfter(target, REDIRECT_PREFIX));
                    return;
                    // end request
                } else {
                    /*
                     * need no redirect, merge returned page and context vars,
                     * send out conversation id, write response
                     */
                    try {
                        this.mergeContextVarsAndConversationIdAndWriteResponse(target, req, resp);
                    } catch (Exception e) {
                        log.error(e);
                    }
                    return;
                    // end request
                }
            }

            /*
             * action invoke returned empty, doing the same as
             * 'no-action-event-request'
             */
        }

        /*
         * no action event, merge requesting page and context vars, send out
         * conversation id, write response.
         */
        String requestingPageVm = this.getRequestingPageVm(req);
        try {
            this.mergeContextVarsAndConversationIdAndWriteResponse(requestingPageVm, req, resp);
        } catch (Exception e) {
            log.error("Write response failed!");
            log.error(e);
        }
        return;
        // end request
    }</pre><br /><br />也就是在一个SeamVelocityController的Servlet中描述了上图中所画出的请求处理流程。<br /><br />以及我简单实现的一个小例子，跟手册里的第一个例子——registration差不多：<br /><img src="http://www.javaeye.com/upload/picture/pic/15213/0ea4b50e-34bf-3271-a8a7-daa83fcd94ab.png?1212072233" /><br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/15215/d15ede5b-3bf2-31c1-ba9f-95e15f14175e.png" /><br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/15217/5bfb32cc-3f03-3a2b-bb87-739b9da067db.png" /><br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/15219/b5ff80b4-2ec3-3fc2-84c0-8dd1445b0135.png" /><br /><br />这个例子的页面写起来就是这样——完全是velocity的页面，没有JSF：<br /><pre name="code" class="html">#set($entries=$pullTool.pull("entries"))
&lt;html>
&lt;head>
  &lt;title>Seam Without JSF Demo&lt;/title>
  &lt;script language="javascript">
  	function deleteEntry(id){
		document.form1.entry_id.value = id;
		form1.submit();
	}
  &lt;/script>
&lt;/head>
&lt;body>
	#if(${cid})
		&lt;h1>ConversationId: ${cid}&lt;/h1>
	#end
	&lt;hr />
	Add new entry: 
	&lt;form>
		&lt;lable for="title">Entry Title:&lt;/lable>
		&lt;input id="title" type="text" name="entry_title" value="">&lt;br />
		&lt;lable for="entryContent">Entry Content:&lt;/lable>
		&lt;TEXTAREA id="entryContent" name = "entry_content">&lt;/TEXTAREA>
		&lt;input type="hidden" name="action" value="entryAction_createNewEntry">&lt;br />
		&lt;input type="submit" value="Add">
	&lt;/form>
	#if(${entries}&&${entries.size()}!=0)
		&lt;table border="1" cellpadding="0" cellspacing="0" width="500">
			&lt;tr>
				&lt;td>
					&lt;h6>Id&lt;/h6>
				&lt;/td>
				&lt;td>
					&lt;h6>Title&lt;/h6>
				&lt;/td>
				&lt;td>
					&lt;h6>Action&lt;/h6>
				&lt;/td>
			&lt;/tr>
			&lt;form name="form1">
    			#foreach(${e} in ${entries})
    				&lt;tr>
    					&lt;td>
    						${e.id}
    					&lt;/td>
    					&lt;td>
    						${e.title}
    					&lt;/td>
    					&lt;td>
    						&lt;input type="hidden" name="action" value="entryAction_deleteEntry">
    						&lt;input type="button" value="Delete" onclick="deleteEntry(${e.id})">
    					&lt;/td>
    				&lt;/tr>
				#end
				&lt;input type="hidden" name="entry_id" value="">
			&lt;/form>
		&lt;/table>
	#else
		&lt;h2>There are no entries.&lt;/h2>
	#end
&lt;/body>
&lt;/html></pre><br /><br />可以从页面源码里面看到，已经支持了表单值绑定、action方法提交、pullTool工具；<br /><br />这个例子很简单，以后我会用它实现更多手册里的示例；<br />这个小框架的目标是保留seam的所有功能，但砍掉JSF；<br /><br />对于这个表现层本身，这里列一下我想要让他支持的功能：<br />1)数据单向绑定，提交时更新<br />2)表单提交时，可执行action方法<br />3)提供“拉（pullTool）”工具，让velocity页面里也能写EL表达式从服务端“拉”数据<br />4）表单提交值转换(converter)，以及自定义converter<br />5）分模块开发，seam-velocity并不会因为失去了Facelets而失去了分页面模块开发的功能<br /><br />以后可能会再增加；<br /><br />目前在googleCode上的项目地址：<a href="http://code.google.com/p/seam-velocity/" target="_blank">http://code.google.com/p/seam-velocity/</a><br /><br />svn中有一个毛坯实现，基本能用，不过可能会有一些bug；暂不提供release下载，还需成熟。<br /><br />接下来这段时间要忙论文的事情，所以要等到7月初的时候我再来推这个项目；<br />也正好，在这段停滞时间中可以听听圈子里的意见，我相信还有人跟我有类似的想法，想用别的东西来代替JSF。<br /><br />欢迎大家讨论，最好能多提点意见。
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/198473#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 22:58:53 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/198473</link>
        <guid>http://pf-miles.javaeye.com/blog/198473</guid>
      </item>
      <item>
        <title>小谈Java Enum的多态性</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/187155" style="color:red;">http://pf-miles.javaeye.com/blog/187155</a>&nbsp;
          发表时间: 2008年04月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Enum+多态，我没说错，不过Enum是不可以被继承的，也不可以继承自别人，只是能实现接口而已，何谈多态？<br />不过还是先看看“现象”吧：<br /><pre name="code" class="java">public enum Fruit {
    APPLE, PEAR, PEACH, ORANGE;
}</pre><br />以上是一个简单的enum,关于它，我要补充一点：<br />Fruit是java.lang.Enum的<span style="color: red">子类</span>，准确地说，是Enum&lt;Fruit>的子类，这里出现了一个继承关系，不过这个继承是编译器帮我们做的，我们不能显式地去做。不信的话我们可以试着用一个Enum&lt;Fruit>的引用去指向一个APPLE，肯定是没问题的，我就不再试了。<br />为了更直观地说明这一点，我们来看看Fruit的反编译结果吧：<br /><pre name="code" class="java">package test;


public final class Fruit extends Enum
{

    private Fruit(String s, int i)
    {
        super(s, i);
    }

    public static Fruit[] values()
    {
        Fruit afruit[];
        int i;
        Fruit afruit1[];
        System.arraycopy(afruit = ENUM$VALUES, 0, afruit1 = new Fruit[i = afruit.length], 0, i);
        return afruit1;
    }

    public static Fruit valueOf(String s)
    {
        return (Fruit)Enum.valueOf(test/Fruit, s);
    }

    public static final Fruit APPLE;
    public static final Fruit PEAR;
    public static final Fruit PEACH;
    public static final Fruit ORANGE;
    private static final Fruit ENUM$VALUES[];

    static 
    {
        APPLE = new Fruit("APPLE", 0);
        PEAR = new Fruit("PEAR", 1);
        PEACH = new Fruit("PEACH", 2);
        ORANGE = new Fruit("ORANGE", 3);
        ENUM$VALUES = (new Fruit[] {
            APPLE, PEAR, PEACH, ORANGE
        });
    }
}</pre><br />注意这几行：<br /><pre name="code" class="java">public static final Fruit APPLE;
    public static final Fruit PEAR;
    public static final Fruit PEACH;
    public static final Fruit ORANGE;</pre><br />看来JDK Enum的实现也不过就是沿袭了Effective Java中提出的TypeSafeEnum模式，只不过是在编译器和JVM等更底层的级别上提供了支持。<br /><br />至此，至少说明了Fruit和Enum的继承关系，但问题是：<span style="color: red">现在不能继续再从Fruit派生子类，那么哪来的多态呢？</span><br /><br />还是再多写点代码吧：<br /><pre name="code" class="java">public enum Fruit {
    APPLE {

        public void test() {
            System.out.println("I am an apple.");
        }
    },
    PEAR {

        public void test() {
            System.out.println("I am a pear.");
        }
    },
    PEACH {

        public void test() {
            System.out.println("I am a peach.");
        }
    },
    ORANGE;

    public void test() {
        System.out.println("I am a fruit.");
    }
}</pre><br />其中，只有Orange没有Overide test()方法；<br />我们在主函数中调用它们：<br /><pre name="code" class="java">public static void main(String[] args) {
        Fruit.APPLE.test();
        Fruit.PEAR.test();
        Fruit.PEACH.test();
        Fruit.ORANGE.test();
    }</pre><br />输出结果：<br /><div class="quote_title">引用</div><div class="quote_div">I am an apple.<br />I am a pear.<br />I am a peach.<br />I am a fruit.</div><br />可以看到，重新定义了test方法的APPLE,PEAR,PEACH覆盖了从父类继承过来的默认行为，而未从新定义test方法的ORANGE却沿袭了父类的行为，多态性在这里展现出来了。<br /><br />那么我们刚才明明看见过Fruit的反编译结果，没有任何新类继承自Fruit，那么这些多态行为是哪里冒出来的呢？说它是“多态”是否准确呢？<br />其实，Fruit类在这个时候已经发生了微妙的变化，一切都与JDK的Enum的实现有关，我们现在可以到编译结果目录下面看看：<br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/12981/8d59eac5-4fd3-3248-9efe-dfc89cc1e01d.png" /><br />怎么除了Fruit.class之外，还多了几个貌似是内部类的class文件？？也许看到这里我们能有点线索了，不过还是在这个时候在看看反编译结果吧，看看它到底在搞什么鬼：<br /><pre name="code" class="java">// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Fruit.java

package test;

import java.io.PrintStream;

public class Fruit extends Enum
{

    private Fruit(String s, int i)
    {
        super(s, i);
    }

    public void test()
    {
        System.out.println("I am a fruit.");
    }

    public static Fruit[] values()
    {
        Fruit afruit[];
        int i;
        Fruit afruit1[];
        System.arraycopy(afruit = ENUM$VALUES, 0, afruit1 = new Fruit[i = afruit.length], 0, i);
        return afruit1;
    }

    public static Fruit valueOf(String s)
    {
        return (Fruit)Enum.valueOf(test/Fruit, s);
    }

    Fruit(String s, int i, Fruit fruit)
    {
        this(s, i);
    }

    public static final Fruit APPLE;
    public static final Fruit PEAR;
    public static final Fruit PEACH;
    public static final Fruit ORANGE;
    private static final Fruit ENUM$VALUES[];

    static 
    {
        APPLE = new Fruit("APPLE", 0) {

            public void test()
            {
                System.out.println("I am an apple.");
            }

        };
        PEAR = new Fruit("PEAR", 1) {

            public void test()
            {
                System.out.println("I am a pear.");
            }

        };
        PEACH = new Fruit("PEACH", 2) {

            public void test()
            {
                System.out.println("I am a peach.");
            }

        };
        ORANGE = new Fruit("ORANGE", 3);
        ENUM$VALUES = (new Fruit[] {
            APPLE, PEAR, PEACH, ORANGE
        });
    }
}</pre><br />注意这段代码：<br /><pre name="code" class="java">static 
    {
        APPLE = new Fruit("APPLE", 0) {

            public void test()
            {
                System.out.println("I am an apple.");
            }

        };
        PEAR = new Fruit("PEAR", 1) {

            public void test()
            {
                System.out.println("I am a pear.");
            }

        };
        PEACH = new Fruit("PEACH", 2) {

            public void test()
            {
                System.out.println("I am a peach.");
            }

        };
        ORANGE = new Fruit("ORANGE", 3);
</pre><br />这个时候的APPLE，PEAR，PEACH已经以匿名内部类的方式对Fruit进行了Overide，自然体现出了多态，多出的那三个疑似内部类的class文件也就是它们！而ORANGE，没有重写test方法，仍然以一个Fruit实例的形式出现。<br /><br />关于Enum为什么会有多态大概也就这么点猫腻了，那我们来考虑一下它有多大价值吧？<br /><br />我们或许可以利用这一点来改造Strategy模式，传统的Strategy会产生出稍微多一些的父类、子类，而如果用Enum的话，“一个类”（对程序作者来讲）就能搞定，能简化一下类层次，再说了，用枚举来表示区分各种不同策略也是很合情理的，所以，Java Enum的这点小小特性感觉还是比较有前途发挥一些作用的，起码在代码组织上；<br />更多应用可能或是局限性就还需要逐步在实际应用中摸索。
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/187155#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 Apr 2008 22:23:36 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/187155</link>
        <guid>http://pf-miles.javaeye.com/blog/187155</guid>
      </item>
      <item>
        <title>Jboss Seam, mysql中文乱码问题4步骤总结</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/184665" style="color:red;">http://pf-miles.javaeye.com/blog/184665</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          其实以下总结适合于任何hibernate+mysql的情况；<br /><br />步骤1：在创建数据库Schema的时候请指定编码，例如mysql，就用这样的语句来建立Schema:<br /><pre name="code" class="sql">create schema xxxx default character set utf8;</pre><br />这一步必须这样，因为至少我在网上还没找到hbm2ddl的配置方法使得hibernate生成的数据库表的编码能被指定，那么为schema设置一个默认的编码就是最简便的方法；当然，你也可以不在schema上设置默认编码，等到hibernate生成表之后，在一个一个表地去改编码。具体可查阅数据库帮助文档。<br /><br />“步骤1”得不到确认的话，下面的步骤可以忽略；<br /><br />步骤2：在工程中的每一个页面，设置meta信息<pre name="code" class="html">&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></pre><br />这个不多解释了，设置了这个后，起码你的页面能“容得下”中文了。这一步建议在模板技术里解决，在最外层的模板里加上这个meta就行了，不用每个页面都加。<br /><br />至此，你会发现直接写死在页面上的中文没问题；直接用数据库管理客户端的console插入的中文也没问题；就是经由程序插入的中文数据有问题；那么：<br /><br />步骤3：指定数据库连接url的参数，例：<br /><pre name="code" class="xml">jdbc:mysql://localhost:3306/data115?useUnicode=true&#38;amp;characterEncoding=utf-8</pre><br />这样，经由程序插入的数据应该也能行了。<br /><br />最后，有时候需要用GET方式在url的参数里传中文，url里的中文是需要被编码之后才能传的，像tomcat默认的uriEncoding是iso-8859-1，这会导致经由url传过来的中文值变乱码；这就需要在server.xml的connector节点里配置“URIEncoding='UTF-8'”，例如：<pre name="code" class="xml">&lt;Connector port="8080" address="${jboss.bind.address}"    
         maxThreads="250" maxHttpHeaderSize="8192"
         emptySessionPath="true" protocol="HTTP/1.1"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='UTF-8'/></pre><br />我这个是jboss的，server.xml位置在deploy/jboss-web.deployer下，tomcat的话很好找了，配置起来都一样。<br /><br />最最后，你是不是认为还有一招“filter”的方式？以前用过一段时间struts的时候filter很管用，但现在我在seam下试验过后发觉有没有这个filter都没关系，只要确认上述4步骤那么乱码应该就能解决了；我估计如果框架程序里没有硬编码使用非UTF-8的字符集来encode的话都用不着filter.
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/184665#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Apr 2008 22:54:46 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/184665</link>
        <guid>http://pf-miles.javaeye.com/blog/184665</guid>
      </item>
      <item>
        <title>李连杰在淘宝</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/169974" style="color:red;">http://pf-miles.javaeye.com/blog/169974</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="http://pf-miles.javaeye.com/upload/picture/pic/9064/8512a9c3-d453-3aed-9198-ddb1d8cb1555.jpg" /><br /><br />李连杰和马云：<br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/9058/ead2e94e-7fb5-3426-9c2f-7fb95ef34ff4.jpg" /><br /><br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/9060/f3124d0e-e9be-34ae-84ef-acdbc9a92b0c.jpg" /><br /><br /><img src="http://pf-miles.javaeye.com/upload/picture/pic/9062/405830b5-9d5b-37e1-ad55-803b8c9343ab.jpg" /><br /><br /><br />附：2007华人明星年收入排行榜（元）<br /><br />　　1李连杰4.65亿<br /><br />　　2成龙4.28亿<br /><br />　　3张学友3亿<br /><br />　　4梁朝伟2.9亿<br /><br />　　5刘德华2.3亿<br /><br />　　6周润发1亿<br /><br />　　7杨紫琼8000万<br /><br />　　8章子怡6500万<br /><br />　　9S.H.E6250万<br /><br />　　10周杰伦6000万
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/169974#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Mar 2008 21:02:01 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/169974</link>
        <guid>http://pf-miles.javaeye.com/blog/169974</guid>
      </item>
      <item>
        <title>Do what the fuck you want to!</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/157380" style="color:red;">http://pf-miles.javaeye.com/blog/157380</a>&nbsp;
          发表时间: 2008年01月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这可能是世界上最自由的开源软件协议:<br />The license text:<br /><div class="quote_title">引用</div><div class="quote_div"><br />            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE <br />                    Version 2, December 2004 <br /><br /> Copyright (C) 2004 Sam Hocevar <br />  14 rue de Plaisance, 75014 Paris, France <br /> Everyone is permitted to copy and distribute verbatim or modified <br /> copies of this license document, and changing it is allowed as long <br /> as the name is changed. <br /><br />            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE <br />   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION <br /><br />  0. You just DO WHAT THE FUCK YOU WANT TO. <br /></div><br /><br />详见:http://sam.zoy.org/wtfpl/
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/157380#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jan 2008 16:59:26 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/157380</link>
        <guid>http://pf-miles.javaeye.com/blog/157380</guid>
      </item>
      <item>
        <title>Perizone project started.</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/147437" style="color:red;">http://pf-miles.javaeye.com/blog/147437</a>&nbsp;
          发表时间: 2007年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          "This is a professional, web-based simulator of the game of Pokemon..."<br /><br />I just started a project named <a href="http://code.google.com/p/perizone/" target="_blank"><em>Perizone</em></a> on google code. My ultimate aim is to bring PMs into reality, and the web based Perizone project would be a very important step.<br />How could it be 'reality'? Err...it's not the time to talk about that, let me keep a little secret~<img src="/images/smiles/icon_biggrin.gif"/><br />Any how, you can get detailed infomation and keep track of the progress of <a href="http://code.google.com/p/perizone/" target="_blank"><em>Perizone</em></a> on the project's <a href="http://code.google.com/p/perizone/" target="_blank">main page</a>.<br /><br />BTW, this newly created category will be the weblog page of Perizone.<br /><br />我在google code上启动了一个名叫<a href="http://code.google.com/p/perizone/" target="_blank"><em>Perizone</em></a>的项目。我的最终目标是将PM带到现实生活中来, 这次的基于web的Perizone项目将是非常重要的一步。<br />怎样才叫做“现实中”? 呃...现在还不是讨论那个的时候，请让我保留一点小秘密吧:D <br />总之，大家现在可以到<a href="http://code.google.com/p/perizone/" target="_blank"><em>Perizone</em></a>的主页上获取更详细的信息并关注本项目的进展了。<br /><br />另外，本博客新建立的本栏目将主要记录一些perizone项目进行过程中的一些重要事件。
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/147437#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Dec 2007 01:08:30 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/147437</link>
        <guid>http://pf-miles.javaeye.com/blog/147437</guid>
      </item>
      <item>
        <title>其实Annotation这样就美了...</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/147093" style="color:red;">http://pf-miles.javaeye.com/blog/147093</a>&nbsp;
          发表时间: 2007年12月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          是的，annotation的出现减少了繁杂的配置文件，将那些原本可能是runtimeException的东西扼杀在了编译期。<br />不过最近在考虑一个小项目的时候发现想要用它来完全代替传统的配置文件还很困难。<br />首先，它无疑使得代码变得难看，这一点不用多说了；<br />其次，它不支持多份配置：<br />因为annotation怎么说也是直接写在代码里的，写在类的定义里的。也就是说一个类也就只能对应一套annotation。那么遇到这种情况：我想初始化同一个类的很多个对象作为prototype或者说单例的共享对象，我要求这些对象虽然是同种类型、拥有同样的行为，但要包含不同的数据。我在项目中遇到这样配置要求的话目前的annotation根本无法满足，还得使用传统的“配置”。<br /><br />上面说的只是“对象”层次的“多份配置”，或许有人认为这本来就不该是annotation的工作，所以不怎么有说服力。但是我仍然相信存在真正的“类”层次的“多份配置”的需求的：比如你想对同一个类做出同种类型但不同实例的代理呢？显然靠annotation是不行的。<br /><br />那么，我有一个想法：为什么不把annotation“抽出来”呢？也就是把annotation从Java源码里面搬到一个专门的文件里。我们也许会觉得“这跟‘配置文件’有什么不同？”，但我觉得如果这成为Java的规范的话，它完全可以提供编译器的支持，把这些独立出来的文件当成那些java类文件的延伸，编译的时候还是作为一个整体处理...这样的话它既有了annotation的优势，又能像传统配置文件一样强大，就更美了。<br /><br />另外，我也不是故意要将annotation用传统的配置文件的标准来衡量。其实依现在的annotation来看，它的目标并不是作为传统配置文件的替代品。它只是想让大家把那些“不至于”或者说根本不应该放在配置文件里的东西放到它里面来，可以缓解滥用配置文件的情况。但该“配置”的地方还是要配置，传统配置文件的作用在很多情况下仍然无可替代。<br /><br />当然，我想如果annotation真的迈出这一步，那么它就真的能很大程度上替代传统配置文件了。
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/147093#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 09 Dec 2007 19:53:57 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/147093</link>
        <guid>http://pf-miles.javaeye.com/blog/147093</guid>
      </item>
      <item>
        <title>一个有趣的配色方案在线生成工具</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/143603" style="color:red;">http://pf-miles.javaeye.com/blog/143603</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">&quot;The color wizard lets you submit your own base color, and it automatically returns matching colors for the one you selected. &quot;</font></p>
<p><font face="Arial">它能够将你提供的基础颜色在色调,饱和度,明暗方面做出搭配, 同时也给出好几套基于你给定的颜色的配色方案, 你可以选择基于互补色,或是相似的颜色等等来生成你的配色方案. 如果你连基础颜色都不想自己决定,那么这个工具自带的random功能会随机为你生成一种配色方案.</font></p>
<p>整个过程不需要什么配色原理理论知识,一下就能搞定:</p>
<p><font face="Arial"><br />
<a href="http://www.colorsontheweb.com/colorwizard.asp#wizard">http://www.colorsontheweb.com/colorwizard.asp#wizard</a></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/143603#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 Nov 2007 13:19:00 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/143603</link>
        <guid>http://pf-miles.javaeye.com/blog/143603</guid>
      </item>
      <item>
        <title>自由访问wikipedia的一个折衷方案</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/141942" style="color:red;">http://pf-miles.javaeye.com/blog/141942</a>&nbsp;
          发表时间: 2007年11月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>即&quot;双浏览器&quot;的方法.一个浏览器用来正常上网,而另一个设置专门的代理,专门用来访问wikipedia.我这样用得很满意:</p>
<p>到<font face="Arial"><a href="http://www.proxycn.com/html_proxy/30fastproxy-1.html">http://www.proxycn.com/html_proxy/30fastproxy-1.html</a>上随便记一个国外的ip+端口号,然后在浏览器里设置它为代理,比如我在windows下平时用IE上网,我专门用火狐设置:工具-&gt;选项-&gt;网络-&gt;设置,点选&quot;手动配置代理,&quot;把刚才记的ip+端口号设置成http代理.这样就可以用火狐专门访问wikipedia,用IE上别的网了.</font></p>
<p>当然也可以使用其它浏览器搭配.</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/141942#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 Nov 2007 10:06:37 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/141942</link>
        <guid>http://pf-miles.javaeye.com/blog/141942</guid>
      </item>
      <item>
        <title>将由BeanUtils的getProperty方法返回的Date对象的字符串表示还原为对象</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/137910" style="color:red;">http://pf-miles.javaeye.com/blog/137910</a>&nbsp;
          发表时间: 2007年11月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>现象描述:</p>
<p>打算将由BeanUtils的getProperty方法返回的Date类型的字符串表示重新通过SimpleDateFormat转换成Date类型的对象老是失败,抛ParseException异常.</p>
<p>分析:</p>
<p>调用commons项目里的BeanUtils对象里的getProperty方法返回某个对象中的Date类型的成员变量.BeanUtil中对getProperty方法的描述如下:</p>
<p><font color="#ff0000">Return the value of the specified property of the specified bean, no matter which property reference format is used, as a String.</font></p>
<p>也就是说,无论这个成员变量的类型是什么,经由getProperty方法返回的值都将是一个字符串.</p>
<p>如果这个成员变量的类型是java.util.Date,那么BeanUtils会调用一个专门为Date类型准备的converter来对这个Date进行转换,其实最终是调用了Date的toString方法.</p>
<p>在某些特殊的时候,我们需要将这个字符串表示的Date还原成真正的Date类,以备后用.</p>
<p>如果抛出异常,则肯定是由于转换格式的不匹配造成的.</p>
<p>解决过程及成果:</p>
<p>查阅JDK的manual,找到Date类的toString方法,其中描述说所有的Date类都将被转换成形如&quot;dow mon dd hh:mm:ss zzz yyyy&quot;的形式,&quot;dow,mon&quot;是什么?从表面上看,似乎是&quot;E&quot;和&quot;MMM&quot;,由debug的跟踪结果来看,确实像是&quot;E&nbsp;MMM dd hh:mm:ss zzz yyyy&quot;.</p>
<p>但是,以上述的格式对字符串进行转换,照样出错.没办法,直接冲入JDK源码,查看Date类的toString方法:</p>
<p>public String toString() {<br />&nbsp;// &quot;EEE MMM dd HH:mm:ss zzz yyyy&quot;;<br />&nbsp;BaseCalendar.Date date = normalize();<br />&nbsp;StringBuilder sb = new StringBuilder(28);<br />&nbsp;int index = date.getDayOfWeek();<br />&nbsp;if (index == gcal.SUNDAY) {<br />&nbsp;&nbsp;&nbsp;&nbsp; index = 8;<br />&nbsp;}<br />&nbsp;convertToAbbr(sb, wtb[index]).append(' ');&nbsp;&nbsp;&nbsp;&nbsp; // EEE<br />&nbsp;convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');&nbsp; // MMM<br />&nbsp;CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd</p>
<p>&nbsp;CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');&nbsp;&nbsp; // HH<br />&nbsp;CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm<br />&nbsp;CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss<br />&nbsp;TimeZone zi = date.getZone();<br />&nbsp;if (zi != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp; sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz<br />&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;GMT&quot;);<br />&nbsp;}<br />&nbsp;sb.append(' ').append(date.getYear());&nbsp; // yyyy<br />&nbsp;return sb.toString();<br />&nbsp;&nbsp;&nbsp; }</p>
<p>这一眼就看出它的日期格式确实是用的&quot;EEE MMM dd HH:mm:ss zzz yyyy&quot;(都不用读代码,人家注释里直接告诉你了),这么说我最初判断它的格式字符串并没有错,确实是&quot;E&nbsp;MMM dd hh:mm:ss zzz yyyy&quot;(E的个数在1-3之间是没有区别的),那么到底问题在哪呢?</p>
<p>没办法,那么干脆照着&quot;E&nbsp;MMM dd hh:mm:ss zzz yyyy&quot;的格式,亲手把一个Date对象转换一下,看看出来是什么样子:</p>
<p>public static void main(String args[]) {<br />&nbsp;&nbsp;Calendar c = Calendar.getInstance();<br />&nbsp;&nbsp;SimpleDateFormat format = new SimpleDateFormat(&quot;E MMM dd hh:mm:ss z yyyy&quot;);<br />&nbsp;&nbsp;System.out.println(format.format(c.getTime()));<br />&nbsp;}</p>
<p>输出结果:&quot;星期日 十一月 04 05:03:52 CST 2007&quot;</p>
<p>好了,至此,可以恍然大悟了.原来是因为我们是中国人,身在中国,Java库的开发人员十分体贴我们,充满人性关怀地将SimpleDateFormat类使用的Locale默认成了我们所在位置的Locale,输出了符合我们中国人习惯的日期表示方式.然而,却没有在Date的toString方法里做同样的人性化设定,toString方法一律输出美国的时间字符串格式&quot;Sun Nov 04 17:10:26 CST 2007&quot;.无奈中美语言不通,这样你来我往转换一个回合,不出错才叫怪了.</p>
<p>解决方法很简单,就是在构造SimpleDateFormat对象时使用两个参数的构造函数,将Locale指定为US,就可以了:</p>
<p>SimpleDateFormat format = new SimpleDateFormat(&quot;E MMM dd hh:mm:ss z yyyy&quot;, Locale.US);</p>
<p>完结.</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/137910#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 Nov 2007 09:16:25 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/137910</link>
        <guid>http://pf-miles.javaeye.com/blog/137910</guid>
      </item>
      <item>
        <title>ABC's of Life</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/118132" style="color:red;">http://pf-miles.javaeye.com/blog/118132</a>&nbsp;
          发表时间: 2007年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre><tt><tt>To Achieve Your Dreams Remember Your ABC's<br /><br />A-void negative sources, people, places, things and habits<br />B-elieve in yourself<br />C-onsider things from every angle<br />D-on't give up and don't give in<br />E-njoy life today, yesterday is gone and tomorrow may never come<br />F-amily and friends are hidden treasures, seek them and enjoy their<br /> riches<br />G-ive more than you planned to<br />H-ang on to your dreams<br />I-gnore those who try to discourage you<br />J-ust do it<br />K-eep trying no matter how hard it seems it will get easier<br />L-ove yourself first and most<br />M-ake it happen<br />N-ever lie, cheat or steal, always strike a fair deal <br />O-pen your eyes and see things as they really are<br />P-ractice makes perfect<br />Q-uitters never win and winners never quit<br />R-ead study and learn about everything important in your life<br />S-top procrastinating<br />T-ake control of your own destiny<br />U-nderstand yourself in order to better understand others<br />V-isualize it<br />W-ant it more than anything<br />X-cellerate your efforts<br />Y-ou are unique of all God's creations nothing can replace you<br />Z-ero in on your target and go for it !</tt></tt></pre>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/118132#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 29 Aug 2007 01:17:25 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/118132</link>
        <guid>http://pf-miles.javaeye.com/blog/118132</guid>
      </item>
      <item>
        <title>经历0分的洗礼，该死的6级终于结束了</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/113967" style="color:red;">http://pf-miles.javaeye.com/blog/113967</a>&nbsp;
          发表时间: 2007年08月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天四六级终于能查分了，522，过了。然我郁闷了好久的0分噩梦终于结束了。这是第二次考了，第一次考估分很高，但没想到下来是0分；这回没复习，也不如上次顺手，但总算结束了。</p>
<p>该死的考试，无聊的考试，但不考有那么令人不甘心，那么多人往里面扑，似乎没有那张薄薄的纸片就少了点什么似的。</p>
<p>要的不是形式，要的是能力，英语对我们专业的人是何其重要，这种形式化的东西早该废除了，眼看那么多同学为了它而浪费时间真是痛心。</p>
<p>学以致用才是真，形式主义是妖道。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/113967#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 18 Aug 2007 07:06:44 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/113967</link>
        <guid>http://pf-miles.javaeye.com/blog/113967</guid>
      </item>
      <item>
        <title>她太NB了，我承认她是御宅族的战士，但这句话也太NB了...</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/109555" style="color:red;">http://pf-miles.javaeye.com/blog/109555</a>&nbsp;
          发表时间: 2007年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><img src="http://116.img.pp.sohu.com/images/blog/2007/8/6/23/20/114d59621e6.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" />其实我玩了7年的口袋妖怪也才达到这个水平哦，而且只是中文名和部分英文名...日语实在不好。</p>
<p>PS:我想掐死她！除非她穿圣诞老人装给我看让我高兴高兴萌一回～</p>
<p>嗯，至少要把她头上那根蠢毛给拔掉！</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/109555#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Aug 2007 15:54:41 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/109555</link>
        <guid>http://pf-miles.javaeye.com/blog/109555</guid>
      </item>
      <item>
        <title>SCJP 310-055 84%通过</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/97924" style="color:red;">http://pf-miles.javaeye.com/blog/97924</a>&nbsp;
          发表时间: 2007年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="right"><font color="#ff0000"><strong>DO NOT LOSE THIS REPORT</strong></font><img src="http://117.img.pp.sohu.com/images/blog/2007/7/4/20/14/1142a331e94.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></p>
<p align="center"><strong>Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 Examination Score Report</strong></p>
<p>CANDIDATE: YUE WEN</p>
<p>ADDRESS: YUNDING BLDG NO 24-2-4</p>
<p>WENCUI RD HEPING DIST</p>
<p>SHENYANG, 110004</p>
<p>CANDIDATE ID:SR2752976&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE:July 04, 2007</p>
<p>REGISTRATION NUMBER:OF7SYD5221&nbsp;&nbsp; SITE NUMBER:CN91U</p>
<p>EXAM:Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0</p>
<p>SERIES:055</p>
<p><strong>Exam Results</strong></p>
<p>Your percentage score was determined by taking the overall number of correct answers divided by the total number of questions.</p>
<p>There are 72 questions in this exam. You answered 61 questions correctly whitch gives you a score of 84%.</p>
<p align="center"><strong>PASSING SCORE</strong>:59%&nbsp;&nbsp; <strong>YOUR SCORE</strong>:84%&nbsp;&nbsp; <strong>TEST STATUS</strong>:Pass</p>
<p align="left"><strong>Assessment Section</strong></p>
<p align="left">This report shows the percentage of items in each section you answered correctly for the Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 exam. The following information is provided to give you feedback on your relative strengths on a per section basis.</p>
<p align="left"><strong>SectionAnalysis&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Score %</strong></p>
<p align="left">Declarations, Initialization and Scoping.......................................100%</p>
<p align="left">Flow Control...................................................................100%</p>
<p align="left">API Contents...................................................................80%</p>
<p align="left">Concurrency....................................................................50%</p>
<p align="left">OO Concepts....................................................................100%</p>
<p align="left">Collections / Generics.........................................................90%</p>
<p align="left">Fundamentals...................................................................63%</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/97924#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jul 2007 14:40:09 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/97924</link>
        <guid>http://pf-miles.javaeye.com/blog/97924</guid>
      </item>
      <item>
        <title>Jakarta Commons使用总结</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/96577" style="color:red;">http://pf-miles.javaeye.com/blog/96577</a>&nbsp;
          发表时间: 2007年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>浏览了一下<strong>《Jakarta Commons Cookbook》（</strong><a target="_new"><strong>Timothy M.&nbsp;O'Brien</strong></a><strong>）。</strong>里面介绍了commons各子项目提供的各种实用类，大致浏览了一遍，做个总结，以后遇到相同的问题可以到commons里去寻找答案。</p>
<p>以下列出一些我认为比较有价值的功能，方便以后参考：</p>
<p>lang：</p>
<p>1）反射地生成hashcode、equals、toString方法。</p>
<p>2）反转数组</p>
<p>3）在数组中搜索指定项，并可设置起始位置</p>
<p>4）线程安全地使用日期格式化</p>
<p>5）验证方法参数的合法性</p>
<p>6）为程序计时</p>
<p>lang.StringUtils、WordUtils:</p>
<p>1）检查空字符串</p>
<p>2）省略字符串，可指定缩减位置</p>
<p>3）搜寻被嵌套的字符串，解析字符串</p>
<p>4）自定义要消除的字符，并执行操作</p>
<p>5）去掉串尾的换行符和回车符</p>
<p>6）反转字符串</p>
<p>7）以单词为单位反转字符串</p>
<p>8）设定一行的显示单词数量，且不破坏单词</p>
<p>9）检测字串内容（数字？字符？空格？混合？）</p>
<p>10）非海量文本中统计单词出现次数</p>
<p>11）计算字符串差别（差别字符，位置，编辑距离）</p>
<p>codec：12）计算字符串的soundex编码（语音编码）</p>
<p>beanUtils、propertyUtils</p>
<p>1）对某个bean的属性反射地访问、检查类型或设置或复制或克隆或检查可访问性，包括简单的、带下标的或Map型的属性</p>
<p>2）用Predicate验证bean</p>
<p>3）用map封装bean属性</p>
<p>4）动态创建bean</p>
<p>collections.comparators，beanUtils</p>
<p>1）将comparator链接为comparatorChain</p>
<p>2）以固定顺序比较（如&ldquo;冠军&rdquo;、&ldquo;亚军&rdquo;、&ldquo;季军&rdquo;）</p>
<p>3）使用predicate模拟电路的门逻辑</p>
<p>4）用transformer和closure封装对对象的操作，并可创建transformer链或closure链以及有条件的closure（commons functor项目中的UnaryFunction和UnaryProcedure对象可代替它们）</p>
<p>5）使用loopingIterator实现循环遍历</p>
<p>6）结合Predicate和FilterIterator筛选地遍历集合</p>
<p>7）使用Bag，一个维护对象数量或顺序的仿collection</p>
<p>8）使用MultiMap可将一个键对应到多个值上</p>
<p>9）使用BidiMap，根据值检索相应的键</p>
<p>10）使用LRUMap作为缓存</p>
<p>11）使用LazyMap直到检索时才加载相应的项</p>
<p>除了以上列出的功能外，commons还提供Digester包和BetWixt包来实现xml文件和java对象之间的映射和序列化功能；</p>
<p>CLI项目用来解析命令行参数；</p>
<p>Configuration项目用来读取property文件形式或xml形式的程序配置文件；</p>
<p>Math项目用来进行一些科学计算，涉及分数、复数运算、线性方程求解、求相关性等；</p>
<p>FreeMarker和Velocity提供两种可选的模板技术；</p>
<p>IO项目提供文件操作和流操作的一些便利，过滤文件等；</p>
<p>ORO项目专门处理正则表达式；</p>
<p>Net项目实现简单的FTP和mail客户端；</p>
<p>HttpClient项目处理对Http协议的编程；</p>
<p>Slide处理WebDEV协议的编程；</p>
<p>JXPath实现了xPath查询，用于查询xml节点和对象图等；</p>
<p>Lucene，一个高效的文本搜索实现。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/96577#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 01 Jul 2007 15:03:52 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/96577</link>
        <guid>http://pf-miles.javaeye.com/blog/96577</guid>
      </item>
      <item>
        <title>I've never missed my aims!</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/94437" style="color:red;">http://pf-miles.javaeye.com/blog/94437</a>&nbsp;
          发表时间: 2007年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最难搞的日文考试结束，接下来该进行课程实践了。</p>
<p>我们打算将这次的学院项目作为我们4人的课程设计来上交。</p>
<p>计划7月15号之前回家，之前有这个项目和scjp的考试，看来时间很紧，不过一定要拿下！</p>
<p>六级考试也结束了，上网估分，我不求多高的分数，只希望能得到一个真实地反应我水平的分数！别TM的再来0分了，分也不让查，四六级办公室的那帮傻X，对考生非常之不负责！不出意外就是万幸！多么颓废的想法！不过没办法，面对的就是颓废的东西。哦对了，最近我很讨厌说&ldquo;没办法&rdquo;这三个字&mdash;&mdash;这次要再是出上次那种意外我不考6级了，两次够多了，已经感觉委屈得不得了，不会再考第三次了。水平摆在那里，还差它个证书么？</p>
<p>项目负责的同学又跟老师交流过了，得到两个很蹊跷的消息：</p>
<p>1）学院的老师队伍准备架设一个掌管全学院所有事务的巨型系统(感觉上像是ERP)，计划9月份动工。这个系统将包括我们现在这个项目的所有功能。这让我感觉现在让我们做的这个东西岂不是有点浪费？或者说学院估计那个类ERP项目要很久才能做完（老师队伍的效率通常不怎么高，其实这件事情开学初就有所耳闻，但现在还没动工），所以才叫我们做这个功能重复的项目暂时用上？总之，若是学院老师他们做成了那个系统，我们的这个系统将被并进去，或者干脆被取代。嗯，不过，这似乎我管不着了，那时候我早走了。</p>
<p>2）课程设计开始，所有班的所有同学都在找项目，11班的某某找到负责的老师，问他有没有项目可作为课程设计。那个老师干脆就把我们团队撰写的那份完整的需求文档给了他们说&ldquo;那你们就做做这个吧&rdquo;。也就是说，现在除了我们，11班还有一个团队在做这个项目，虽然他们的目的只是交差一个课程设计，但我比较反感老师把需求文档给了他们的做法，就算这份文档的所有权属于学院。虽然说最后真正上线运行的是我们做的系统，但我潜意识中仍然有&ldquo;竞争&rdquo;这个念头，我们要做得比11班的强（这是当然的，这个不足为惧），还要比老师队伍计划中的那个系统的这部分功能强，关键是用户体验上。</p>
<p>这个系统到底能运行多久取决于学院，不知道学院怎么打算的，我只是想实践动手，培养我们班的实践能力，并不是缺那少得可怜的1千来块钱，给自己人做东西有些事情是要忍一忍的。</p>
<p>不多说了，接下来拿出实际的东西来。目标的明确加上一点奉献精神，就一定能完成计划。</p>
<p>可怜的猎物只有哭的份，'cause I've never missed my aims.</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/94437#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Jun 2007 06:27:05 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/94437</link>
        <guid>http://pf-miles.javaeye.com/blog/94437</guid>
      </item>
      <item>
        <title>企业应用开发分层原则</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/84609" style="color:red;">http://pf-miles.javaeye.com/blog/84609</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>有什么标准足以不惜复杂度的增加让在系统中多出一个层次来呢？大概分为以下三个标准：</p>
<p>1）该层次是否具有重用的价值</p>
<p>2）独立一个层次就意味着保留了某种扩展性</p>
<p>3）有时候可能还为了明确一种依赖关系</p>
<p>嗯！暂时就这些，金玉良言，呵呵～写给自己看的，怕自己忘，做个笔记，不多解释了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/84609#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 May 2007 14:59:18 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/84609</link>
        <guid>http://pf-miles.javaeye.com/blog/84609</guid>
      </item>
      <item>
        <title>为什么java要用checkedExceptions，精彩的争论</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/83434" style="color:red;">http://pf-miles.javaeye.com/blog/83434</a>&nbsp;
          发表时间: 2007年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.javaeye.com/topic/2038">http://www.javaeye.com/topic/2038</a></p>
<p>这是javaeye论坛上的文章，比较老了，但看完后仍然感触很大，对进一步建立OO思想很有帮助，值得一看。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/83434#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 May 2007 05:45:33 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/83434</link>
        <guid>http://pf-miles.javaeye.com/blog/83434</guid>
      </item>
      <item>
        <title>iBatis学习笔记（映射文件小结）</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/82348" style="color:red;">http://pf-miles.javaeye.com/blog/82348</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>映射文件总体形式：</p>
<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;</p>
<p>&lt;!DOCTYPE sqlMap</p>
<p>PUBLIC &quot;-//ibatis.apache.org//DTD SQL Map 2.0//EN&quot;</p>
<p>&quot;http://ibatis.apache.org/dtd/sql-map-2.dtd&quot;&gt;</p>
<p>&lt;sqlMap namespace=&rdquo;Product&rdquo;&gt;</p>
<p><font color="#ff6600">&lt;cacheModel id=&rdquo;productCache&rdquo; type=&rdquo;LRU&rdquo;&gt;</font></p>
<p><font color="#ff6600">&lt;flushInterval hours=&rdquo;24&rdquo;/&gt;</font></p>
<p><font color="#ff6600">&lt;property name=&rdquo;size&rdquo; value=&rdquo;1000&rdquo; /&gt;</font></p>
<p><font color="#ff6600">&lt;/cacheModel&gt;</font></p>
<p><font color="#ff0000">&lt;typeAlias alias=&rdquo;product&rdquo; type=&rdquo;com.ibatis.example.Product&rdquo; /&gt;</font></p>
<p><font color="#9933cc">&lt;parameterMap id=&rdquo;productParam&rdquo; class=&rdquo;product&rdquo;&gt;</font></p>
<p><font color="#9933cc">&lt;parameter property=&rdquo;id&rdquo;/&gt;</font></p>
<p><font color="#9933cc">&lt;/parameterMap&gt;</font></p>
<p><font color="#3366cc">&lt;resultMap id=&rdquo;productResult&rdquo; class=&rdquo;product&rdquo;&gt;</font></p>
<p><font color="#3366cc">&lt;result property=&rdquo;id&rdquo; column=&rdquo;PRD_ID&rdquo;/&gt;</font></p>
<p><font color="#3366cc">&lt;result property=&rdquo;description&rdquo; column=&rdquo;PRD_DESCRIPTION&rdquo;/&gt;</font></p>
<p><font color="#3366cc">&lt;/resultMap&gt;</font></p>
<p><font color="#33cc33">&lt;select id=&rdquo;getProduct&rdquo; parameterMap=&rdquo;productParam&rdquo;</font></p>
<p><font color="#33cc33">resultMap=&rdquo;productResult&rdquo; cacheModel=&rdquo;product-cache&rdquo;&gt;</font></p>
<p><font color="#33cc33">select * from PRODUCT where PRD_ID = ?</font></p>
<p><font color="#33cc33">&lt;/select&gt;</font></p>
<p>&lt;/sqlMap&gt;</p>
<p>映射的查询语句形式：</p>
<p>&lt;statement<i> </i>id=&rdquo;statementName&rdquo;</p>
<p>[parameterClass=&rdquo;some.class.Name&rdquo;]</p>
<p>[resultClass=&rdquo;some.class.Name&rdquo;]</p>
<p>[parameterMap=&rdquo;nameOfParameterMap&rdquo;]</p>
<p>[resultMap=&rdquo;nameOfResultMap&rdquo;]</p>
<p>[cacheModel=&rdquo;nameOfCache&rdquo;]</p>
<p>[timeout=&ldquo;5&rdquo;]&gt;</p>
<p>select * from PRODUCT where PRD_ID = [?|#propertyName#]</p>
<p>order by [$simpleDynamic$]</p>
<p>&lt;/statement&gt;</p>
<p>&lt;insert id=&rdquo;insertTestProduct&rdquo; &gt;</p>
<p>insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (1, &ldquo;Shih Tzu&rdquo;)</p>
<p>&lt;/insert&gt;</p>
<p>&lt;select id=&quot;getPersonsByAge&quot; parameterClass=&rdquo;int&rdquo; resultClass=&quot;examples.domain.Person&quot;&gt;</p>
<p>SELECT *</p>
<p>FROM PERSON</p>
<p>WHERE AGE <font color="#0099cc">&lt;![CDATA[ <font color="#ff0000">&gt;</font> ]]&gt; </font>#value#</p>
<p>&lt;/select&gt;</p>
<p>下面的表格说明了所有支持的查询语句形式及其属性：</p>
<p><img src="http://117.img.pp.sohu.com/images/blog/2007/5/23/20/10/113510bf671.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></p>&nbsp; 
<p>可定义SQL Fragments对部分SQL语句进行复用：</p>
<p>&lt;sql id=&quot;selectItem_fragment&quot;&gt;</p>
<p>FROM items</p>
<p>WHERE parentid = 6</p>
<p>&lt;/sql&gt;</p>
<p>&lt;select id=&quot;selectItemCount&quot; resultClass=&quot;int&quot;&gt;</p>
<p>SELECT COUNT(*) AS total</p>
<p>&lt;include refid=&quot;selectItem_fragment&quot;/&gt;</p>
<p>&lt;/select&gt;</p>
<p>&lt;select id=&quot;selectItems&quot; resultClass=&quot;Item&quot;&gt;</p>
<p>SELECT id, name</p>
<p>&lt;include refid=&quot;selectItem_fragment&quot;/&gt;</p>
<p>&lt;/select&gt;</p>
<p>&nbsp;</p>
<p>对某些数据库的自动增长键有支持，但不同的支持策略，例： </p>
<p>&nbsp;</p>
<p>&lt;!&mdash;Oracle SEQUENCE Example --&gt;</p>
<p>&lt;insert id=&quot;insertProduct-ORACLE&quot; parameterClass=&quot;com.domain.Product&quot;&gt;</p>
<p>&lt;selectKey resultClass=&quot;int&quot; &gt;</p>
<p>SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL</p>
<p>&lt;/selectKey&gt;</p>
<p>insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)</p>
<p>values (#id#,#description#)</p>
<p>&lt;/insert&gt;</p>
<p>&lt;!&mdash; Microsoft SQL Server IDENTITY Column Example --&gt;</p>
<p>&lt;insert id=&quot;insertProduct-MS-SQL&quot; parameterClass=&quot;com.domain.Product&quot;&gt;</p>
<p>insert into PRODUCT (PRD_DESCRIPTION)</p>
<p>values (#description#)</p>
<p>&lt;selectKey resultClass=&quot;int&quot; &gt;</p>
<p>SELECT @@IDENTITY AS ID</p>
<p>&lt;/selectKey&gt;</p>
<p>&lt;/insert&gt;</p>
<p>更具体内容参见帮助文档。</p>
<p>&nbsp;</p>
<p>存储过程：</p>
<p>&lt;parameterMap id=&quot;swapParameters&quot; class=&quot;map&quot; &gt;</p>
<p>&lt;parameter property=&quot;email1&quot; jdbcType=&quot;VARCHAR&quot; javaType=&quot;java.lang.String&quot; mode=&quot;INOUT&quot;/&gt;</p>
<p>&lt;parameter property=&quot;email2&quot; jdbcType=&quot;VARCHAR&quot; javaType=&quot;java.lang.String&quot; mode=&quot;INOUT&quot;/&gt;</p>
<p>&lt;/parameterMap&gt;</p>
<p>&lt;procedure id=&quot;swapEmailAddresses&quot; parameterMap=&quot;swapParameters&quot; &gt;</p>
<p>{call swap_email_address (?, ?)}</p>
<p>&lt;/procedure&gt;</p>
<p>&nbsp;</p>
<p>存储过程影响数据库表，同时也影响参数对象，mode若是INOUT或OUT，参数对象会被改变，否则不改变。</p>
<p>&nbsp;</p>
<p>对于映射查询，iBatis建议：参数使用inline-parameter，也就是parameterClass(不是parameterMap)，而结果使用resultMap（不是resultClass）。</p>
<p>&nbsp;</p>
<p>parameterMap格式：</p>
<p>&lt;parameterMap id=&rdquo;parameterMapName&rdquo; [class=&rdquo;com.domain.Product&rdquo;]&gt;</p>
<p>&lt;parameter property =&rdquo;propertyName&rdquo; [jdbcType=&rdquo;VARCHAR&rdquo;] [javaType=&rdquo;string&rdquo;]</p>
<p>[nullValue=&ldquo;-9999&rdquo;]</p>
<p>[typeName=&rdquo;{REF or user-defined type}&rdquo;]</p>
<p>[resultMap=someResultMap]</p>
<p>[mode=IN|OUT|INOUT]</p>
<p>[typeHandler=someTypeHandler]</p>
<p>[numericScale=2]/&gt;</p>
<p>&lt;parameter &hellip;&hellip; /&gt;</p>
<p>&lt;parameter &hellip;&hellip; /&gt;</p>
<p>&lt;/parameterMap&gt;</p>
<p>&nbsp;</p>
<p>resultMap格式：</p>
<p>&lt;resultMap id=&rdquo;resultMapName&rdquo; class=&rdquo;some.domain.Class&rdquo;</p>
<p>[extends=&rdquo;parent-resultMap&rdquo;]</p>
<p>[groupBy=&ldquo;some property list&rdquo;]&gt;</p>
<p>&lt;result property=&rdquo;propertyName&rdquo; column=&rdquo;COLUMN_NAME&rdquo;</p>
<p>[columnIndex=&rdquo;1&rdquo;] [javaType=&rdquo;int&rdquo;] [jdbcType=&rdquo;NUMERIC&rdquo;]</p>
<p>[nullValue=&rdquo;-999999&rdquo;] [select=&rdquo;someOtherStatement&rdquo;]</p>
<p>[resultMap=&ldquo;someOtherResultMap&rdquo;]</p>
<p>[typeHandler=&ldquo;com.mydomain.MyTypehandler&rdquo;]</p>
<p>/&gt;</p>
<p>&lt;result &hellip;&hellip;/&gt;</p>
<p>&lt;result &hellip;&hellip;/&gt;</p>
<p>&lt;result &hellip;&hellip;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&nbsp;</p>
<p>java.util.Map接口的实现类也可作为parameterMap或resultMap的class。</p>
<p>&nbsp;</p>
<p>复杂查询：</p>
<p>N+1查询（结合cache的话会比连接查询好，没有cache很糟）：</p>
<p>&lt;resultMap id=&rdquo;get-product-result&rdquo; class=&rdquo;com.ibatis.example.Product&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;PRD_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;PRD_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;category&rdquo; column=&rdquo;<i>PRD_CAT_ID</i>&rdquo; select=&rdquo;getCategory&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;resultMap id=&rdquo;get-category-result&rdquo; class=&rdquo;com.ibatis.example.Category&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;CAT_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;CAT_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;select id=&rdquo;getProduct&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;get-product-result&rdquo;&gt;</p>
<p>select * from PRODUCT where PRD_ID = #value#</p>
<p>&lt;/select&gt;</p>
<p>&lt;select id=&rdquo;getCategory&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;get-category-result&rdquo;&gt;</p>
<p>select * from CATEGORY where <i>CAT_ID </i>= #value#</p>
<p>&lt;/select&gt;</p>
<p>&nbsp;</p>
<p>连接查询（iBatis解决复杂查询的通常方式，但有cache时候可能不如N+1查询）：</p>
<p>&lt;resultMap id=&rdquo;get-product-result&rdquo; class=&rdquo;com.ibatis.example.Product&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;PRD_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;PRD_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;category.id&rdquo; column=&rdquo;<i>CAT_ID</i>&rdquo; /&gt;</p>
<p>&lt;result property=&rdquo;category.description&rdquo; column=&rdquo;<i>CAT_DESCRIPTION</i>&rdquo; /&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;select id=&rdquo;getProduct&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;get-product-result&rdquo;&gt;</p>
<p>select *</p>
<p>from PRODUCT, CATEGORY</p>
<p>where PRD_CAT_ID=CAT_ID</p>
<p>and PRD_ID = #value#</p>
<p>&lt;/select&gt;</p>
<p>或者：</p>
<p>&lt;resultMap id=&rdquo;get-product-result&rdquo; class=&rdquo;com.ibatis.example.Product&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;PRD_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;PRD_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;category&rdquo; resultMap=&ldquo;get-category-result&rdquo; /&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;resultMap id=&rdquo;get-category-result&rdquo; class=&rdquo;com.ibatis.example.Category&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;<i>CAT_ID</i>&rdquo; /&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;<i>CAT_DESCRIPTION</i>&rdquo; /&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;select id=&rdquo;getProduct&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;get-product-result&rdquo;&gt;</p>
<p>select *</p>
<p>from PRODUCT, CATEGORY</p>
<p>where PRD_CAT_ID=CAT_ID</p>
<p>and PRD_ID = #value#</p>
<p>&lt;/select&gt;</p>
<p>复杂集合查询：</p>
<p>N+1法：</p>
<p>&lt;resultMap id=&rdquo;get-category-result&rdquo; class=&rdquo;com.ibatis.example.Category&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;CAT_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;CAT_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;productList&rdquo; column=&rdquo;<i>CAT_ID</i>&rdquo; select=&rdquo; getProductsByCatId&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;resultMap id=&rdquo;get-product-result&rdquo; class=&rdquo;com.ibatis.example.Product&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;PRD_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;PRD_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;select id=&rdquo;getCategory&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;get-category-result&rdquo;&gt;</p>
<p>select * from CATEGORY where CAT_ID = #value#</p>
<p>&lt;/select&gt;</p>
<p>&lt;select id=&rdquo;getProductsByCatId&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;get-product-result&rdquo;&gt;</p>
<p>select * from PRODUCT where <i>PRD_CAT_ID </i>= #value#</p>
<p>&lt;/select&gt;</p>
<p>groupBy法：</p>
<p>&lt;sqlMap namespace=&quot;ProductCategory&quot;&gt;</p>
<p>&lt;resultMap id=&rdquo;categoryResult&rdquo; class=&rdquo;com.ibatis.example.Category&rdquo; groupBy=&rdquo;id&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;CAT_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;CAT_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;productList&rdquo; resultMap=&rdquo;ProductCategory.productResult&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;resultMap id=&rdquo;productResult&rdquo; class=&rdquo;com.ibatis.example.Product&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;PRD_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;description&rdquo; column=&rdquo;PRD_DESCRIPTION&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;select id=&rdquo;getCategory&rdquo; parameterClass=&rdquo;int&rdquo; resultMap=&rdquo;categoryResult&rdquo;&gt;</p>
<p>select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION</p>
<p>from CATEGORY C</p>
<p>left outer join PRODUCT P</p>
<p>on C.CAT_ID = P.PRD_CAT_ID</p>
<p>where CAT_ID = #value#</p>
<p>&lt;/select&gt;</p>
<p>&lt;/sqlMap&gt;</p>
<p align="left">注：groupBy属性不能和queryForPaginatedList()调用同时使用。</p>
<p align="left">N+1查询中的符合查询：</p>
<p>&lt;resultMap id=&rdquo;get-order-result&rdquo; class=&rdquo;com.ibatis.example.Order&rdquo;&gt;</p>
<p>&lt;result property=&rdquo;id&rdquo; column=&rdquo;ORD_ID&rdquo;/&gt;</p>
<p>&lt;result property=&rdquo;customerId&rdquo; column=&rdquo;ORD_CST_ID&rdquo;/&gt;</p>
<p>&hellip;</p>
<p>&lt;result property=&rdquo;payments&rdquo; column=&rdquo;<i>{itemId=ORD_ID, custId=ORD_CST_ID}</i>&rdquo;</p>
<p>select=&rdquo;getOrderPayments&rdquo;/&gt;</p>
<p>&lt;/resultMap&gt;</p>
<p>&lt;select id=&rdquo;getOrderPayments&rdquo; resultMap=&rdquo;get-payment-result&rdquo;&gt;</p>
<p>select * from PAYMENT</p>
<p>where <i>PAY_ORD_ID </i>= #itemId#</p>
<p>and <i>PAY_CST_ID </i>= #custId#</p>
<p>&lt;/select&gt;</p>
<p>数据类型表：</p>
<p><img src="http://117.img.pp.sohu.com/images/blog/2007/5/23/20/13/113510ed7ed.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></p>
<p>&nbsp; </p>
<p>自定义TypeHandler:</p>
<p>public class YesNoBoolTypeHandlerCallback implements TypeHandlerCallback {</p>
<p>private static final String YES = &quot;Y&quot;;</p>
<p>private static final String NO = &quot;N&quot;;</p>
<p>public Object getResult(ResultGetter getter)</p>
<p>throws SQLException {</p>
<p>String s = getter.getString();</p>
<p>if (YES.equalsIgnoreCase(s)) {</p>
<p>return new Boolean (true);</p>
<p>} else if (NO.equalsIgnoreCase(s)) {</p>
<p>return new Boolean (false);</p>
<p>} else {</p>
<p>throw new SQLException (</p>
<p>&quot;Unexpected value &quot; + s + &quot; found where &quot; + YES + &quot; or &quot; + NO + &quot; was expected.&quot;);</p>
<p>}</p>
<p>}</p>
<p>public void setParameter(ParameterSetter setter, Object parameter)</p>
<p>throws SQLException {</p>
<p>boolean b = ((Boolean)parameter).booleanValue();</p>
<p>if (b) {</p>
<p>setter.setString(YES);</p>
<p>} else {</p>
<p>setter.setString(NO);</p>
<p>}</p>
<p>}</p>
<p>public Object valueOf(String s) {</p>
<p>if (YES.equalsIgnoreCase(s)) {</p>
<p>return new Boolean (true);</p>
<p>} else {</p>
<p>return new Boolean (false);</p>
<p>}</p>
<p>}</p>
<p>然后在sqlMapConfig文件里加上如下配置：</p>
<p>&lt;typeHandler</p>
<p>javaType=&quot;boolean&quot;</p>
<p>jdbcType=&rdquo;VARCHAR&rdquo;</p>
<p>callback=&quot;org.apache.ibatis.sqlmap.extensions.YesNoBoolTypeHandlerCallback&quot;/&gt;</p>
<p>缓存设置：</p>
<p>&lt;cacheModel id=&quot;product-cache&quot; type =&quot;LRU&quot; readOnly=&rdquo;true&rdquo; serialize=&rdquo;false&rdquo;&gt;</p>
<p>&lt;flushInterval hours=&quot;24&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;insertProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;updateProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;deleteProduct&quot;/&gt;</p>
<p>&lt;property name=&rdquo;cache-size&rdquo; value=&rdquo;1000&rdquo; /&gt;</p>
<p>&lt;/cacheModel&gt;</p>
<p>&lt;select id=&rdquo;getProductList&rdquo; cacheModel=&rdquo;product-cache&rdquo;&gt;</p>
<p>select * from PRODUCT where PRD_CAT_ID = #value#</p>
<p>&lt;/select&gt;</p>
<p>Readonly属性默认为true，但若想要在返回的对象上做更改的话，设为false。</p>
<p>Serialize属性设置为false后，该cache为全局共享cache，这种cache不能是readOnly的（因为没意义）。</p>
<p>Cache的种类：</p>
<p>MEMORY&mdash;&mdash;java特殊引用类实现的cache</p>
<p>&lt;cacheModel id=&quot;product-cache&quot; type=&quot;MEMORY&quot;&gt;</p>
<p>&lt;flushInterval hours=&quot;24&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;insertProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;updateProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;deleteProduct&quot;/&gt;</p>
<p>&lt;property name=&rdquo;reference-type&rdquo; value=&rdquo;WEAK&rdquo; /&gt;</p>
<p>&lt;/cacheModel&gt;</p>
<p>所有的referencetype：</p>
<p><img src="http://117.img.pp.sohu.com/images/blog/2007/5/23/20/14/113510f7390.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></p>
<p>&nbsp; </p>
<p>LRU&mdash;&mdash;最少使用算法的cache:</p>
<p>&lt;cacheModel id=&quot;product-cache&quot; type=&quot;LRU&quot;&gt;</p>
<p>&lt;flushInterval hours=&quot;24&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;insertProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;updateProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;deleteProduct&quot;/&gt;</p>
<p>&lt;property name=&rdquo;size&rdquo; value=&rdquo;1000&rdquo; /&gt;</p>
<p>&lt;/cacheModel&gt;</p>
<p>FIFO&mdash;&mdash;先进先出算法的cache：</p>
<p>&lt;cacheModel id=&quot;product-cache&quot; type=&quot;FIFO&quot;&gt;</p>
<p>&lt;flushInterval hours=&quot;24&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;insertProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;updateProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;deleteProduct&quot;/&gt;</p>
<p>&lt;property name=&rdquo;size&rdquo; value=&rdquo;1000&rdquo; /&gt;</p>
<p>&lt;/cacheModel&gt;</p>
<p align="left">OSCACHE&mdash;&mdash;插件cache，opensymphony的cache实现，参见：<a href="http://www.opensymphony.com/oscache/">http://www.opensymphony.com/oscache/</a></p>
<p>&lt;cacheModel id=&quot;product-cache&quot; type=&quot;OSCACHE&quot;&gt;</p>
<p>&lt;flushInterval hours=&quot;24&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;insertProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;updateProduct&quot;/&gt;</p>
<p>&lt;flushOnExecute statement=&quot;deleteProduct&quot;/&gt;</p>
<p>&lt;/cacheModel&gt;</p>
<p>构造动态SQL语句：</p>
<p>&lt;dynamic&gt;元素： 总的包含元素，并提供最外层的开头预设字、开始字符串和结束字符串。</p>
<p>prepend &ndash; 加在本体前面的预设字符 (可选)</p>
<p>open &ndash; 标识本体开始的开始字符串(可选)</p>
<p>close &ndash; 标识本题结束的结束字符串 (可选)</p>
<p>dynamic元素的removeFirstPrepend属性是强制的，所以它的第一个子元素的prepend字符串在生成语句的时候总是会被取消掉。</p>
<p>&nbsp;</p>
<p>二元操作标记：</p>
<p>&lt;isEqual&gt; 检查一个属性和一个给定值或另一个属性是否相等。</p>
<p>&lt;isNotEqual&gt;检查一个属性和一个给定值或另一个属性是否不相等。</p>
<p>&lt;isGreaterThan&gt; 检查一个属性是否大于一个给定值或另一个属性。</p>
<p>&lt;isGreaterEqual&gt; 检查一个属性是否大于或等于一个给定值或另一个属性。</p>
<p>&lt;isLessThan&gt; 检查一个属性是否小于一个给定值或另一个属性。</p>
<p>&lt;isLessEqual&gt; 检查一个属性是否小于或等于一个给定值或另一个属性。</p>
<p>属性：</p>
<p>prepend &ndash; the overridable SQL part that will be prepended to the statement (optional)</p>
<p>property &ndash; the property to be compared (required)</p>
<p>compareProperty &ndash; the other property to be compared (required or compareValue)</p>
<p>compareValue &ndash; the value to be compared (required or compareProperty)</p>
<p>removeFirstPrepend &ndash; removes the prepend of the first nested content producing tag (true|false, optional)</p>
<p>open &ndash; the string with which to open the entire resulting body content (optional)</p>
<p>close &ndash; the string with which to close the entire resulting body content (optional)</p>
<p>&nbsp;</p>
<p>举例：</p>
<p>&lt;isLessEqual prepend=&rdquo;AND&rdquo; property=&rdquo;age&rdquo; compareValue=&rdquo;18&rdquo;&gt;</p>
<p>ADOLESCENT = &lsquo;TRUE&rsquo;</p>
<p>&lt;/isLessEqual&gt;</p>
<p>&nbsp;</p>
<p>一元判断标记：</p>
<p>&lt;isPropertyAvailable&gt; Checks if a property is available (i.e is a property of the parameter bean)</p>
<p>&lt;isNotPropertyAvailable&gt; Checks if a property is unavailable (i.e not a property of the parameter bean)</p>
<p>&lt;isNull&gt; Checks if a property is null.</p>
<p>&lt;isNotNull&gt; Checks if a property is not null.</p>
<p>&lt;isEmpty&gt; Checks to see if the value of a Collection, String or String.valueOf() property</p>
<p>is null or empty (&ldquo;&rdquo; or size() &lt; 1).</p>
<p>&lt;isNotEmpty&gt; Checks to see if the value of a Collection, String or String.valueOf() property</p>
<p>is not null and not empty (&ldquo;&rdquo; or size() &lt; 1).</p>
<p>属性：</p>
<p>prepend &ndash; the overridable SQL part that will be prepended to the statement (optional)</p>
<p>property &ndash; the property to be checked (required)</p>
<p>removeFirstPrepend &ndash; removes the prepend of the first nested content producing tag (true|false, optional)</p>
<p>open &ndash; the string with which to open the entire resulting body content (optional)</p>
<p>close &ndash; the string with which to close the entire resulting body content (optional)</p>
<p>举例：</p>
<p>&lt;isNotEmpty prepend=&rdquo;AND&rdquo; property=&rdquo;firstName&rdquo; &gt;</p>
<p>FIRST_NAME=#firstName#</p>
<p>&lt;/isNotEmpty&gt;</p>
<p>其它标记：</p>
<p>&lt;isParameterPresent&gt; Checks to see if the parameter object is present (not null).</p>
<p>&lt;isNotParameterPresent&gt; Checks to see if the parameter object is not present (null).</p>
<p>属性：</p>
<p>prepend &ndash; the overridable SQL part that will be prepended to the statement (optional)</p>
<p>removeFirstPrepend &ndash; removes the prepend of the first nested content producing tag (true|false, optional)</p>
<p>open &ndash; the string with which to open the entire resulting body content (optional)</p>
<p>close &ndash; the string with which to close the entire resulting body content (optional)</p>
<p>举例：</p>
<p>&lt;isNotParameterPresent prepend=&rdquo;AND&rdquo;&gt;</p>
<p>EMPLOYEE_TYPE = &lsquo;DEFAULT&rsquo;</p>
<p>&lt;/isNotParameterPresent&gt;</p>
<p>&nbsp;</p>
<p>&lt;iterate&gt; Iterates over a property that is an implementation java.util.Collection, or</p>
<p>java.util.Iterator, or is an array.</p>
<p>例：</p>
<p>&lt;iterate prepend=&rdquo;AND&rdquo; property=&rdquo;userNameList&rdquo;</p>
<p>open=&rdquo;(&rdquo; close=&rdquo;)&rdquo; conjunction=&rdquo;OR&rdquo;&gt;</p>
<p>username=#userNameList[]#</p>
<p>&lt;/iterate&gt;</p>
<p>当集合类单独被当作参数传进此查询时，也可以这么写：</p>
<p>&lt;iterate prepend=&rdquo;AND&rdquo; open=&rdquo;(&rdquo; close=&rdquo;)&rdquo; conjunction=&rdquo;OR&rdquo;&gt;</p>
<p>username=#[]#</p>
<p>&lt;/iterate&gt;</p>
<p>也可以像这样选择集合中对象的属性：</p>
<p>&lt;iterate prepend=&rdquo;AND&rdquo; property=&rdquo;userList&rdquo;</p>
<p>open=&rdquo;(&rdquo; close=&rdquo;)&rdquo; conjunction=&rdquo;OR&rdquo;&gt;</p>
<p>firstname=#userList[].firstName# and</p>
<p>lastname=#userList[].lastName#</p>
<p>&lt;/iterate&gt;</p>
<p>该标签还可以自己嵌套：</p>
<p>&lt;dynamic prepend=&quot;where&quot;&gt;</p>
<p>&lt;iterate property=&quot;orConditions&quot; conjunction=&quot;or&quot;&gt;</p>
<p>(</p>
<p>&lt;iterate property=&quot;orConditions[].conditions&quot;</p>
<p>conjunction=&quot;and&quot;&gt;</p>
<p>$orConditions[].conditions[].condition$</p>
<p>#orConditions[].conditions[].value#</p>
<p>&lt;/iterate&gt;</p>
<p>)</p>
<p>&lt;/iterate&gt;</p>
<p>&lt;/dynamic&gt;</p>
<p>若只是想生成一些简单的动态sql语句，这样写就可以：</p>
<p>&lt;select id=&rdquo;getProduct&rdquo; resultMap=&rdquo;get-product-result&rdquo;&gt;</p>
<p>select * from PRODUCT order by $preferredOrder$</p>
<p>&lt;/select&gt;</p>
<p>注意&ldquo;$&rdquo;，不是&ldquo;#&rdquo;，这是和为preparedStatement赋值的普通属性的取得的不同之处。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/82348#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 May 2007 12:23:52 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/82348</link>
        <guid>http://pf-miles.javaeye.com/blog/82348</guid>
      </item>
      <item>
        <title>iBatis学习笔记（配置文件小结）</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/82020" style="color:red;">http://pf-miles.javaeye.com/blog/82020</a>&nbsp;
          发表时间: 2007年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          iBatis学习笔记：（versions 2.2.0 and higher） 
<p>配置文件SqlMapConfig.xml：</p>
<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;</p>
<p>&lt;!DOCTYPE sqlMapConfig</p>
<p>PUBLIC &quot;-//ibatis.apache.org//DTD SQL Map Config 2.0//EN&quot;</p>
<p>&quot;http://ibatis.apache.org/dtd/sql-map-config-2.dtd&quot;&gt;</p>
<p>&lt;!-- Always ensure to use the correct XML header as above! --&gt;</p>
<p>&lt;sqlMapConfig&gt;</p>
<p>&lt;!-- The properties (name=value) in the file specified here can be used placeholders in this config</p>
<p>file (e.g. &ldquo;${driver}&rdquo;. The file is relative to the classpath and is completely optional. --&gt;</p>
<p>&lt;properties resource=&quot; examples/sqlmap/maps/SqlMapConfigExample.properties &quot; /&gt;</p>
<p>&lt;!-- These settings control SqlMapClient configuration details, primarily to do with transaction</p>
<p>management. They are all optional (more detail later in this document). --&gt;</p>
<p>&lt;settings</p>
<p>cacheModelsEnabled=&quot;true&quot;</p>
<p>enhancementEnabled=&quot;true&quot;</p>
<p>lazyLoadingEnabled=&quot;true&quot;</p>
<p>maxRequests=&quot;128&quot;</p>
<p>maxSessions=&quot;10&quot;</p>
<p>maxTransactions=&quot;5&quot;</p>
<p>useStatementNamespaces=&quot;false&quot;</p>
<p>defaultStatementTimeout=&quot;5&quot;</p>
<p>statementCachingEnabled=&quot;true&quot;</p>
<p>classInfoCacheEnabled=&quot;true&quot;</p>
<p>/&gt;</p>
<p>&lt;!-- This element declares a factory class that iBATIS will use for creating result objects.</p>
<p>This element is optional (more detail later in this document). --&gt;</p>
<p>&lt;resultObjectFactory type=&quot;com.mydomain.MyResultObjectFactory&quot; &gt;</p>
<p>&lt;property name=&quot;someProperty&quot; value=&quot;someValue&quot;/&gt;</p>
<p>&lt;/resultObjectFactory&gt;</p>
<p>&lt;!-- Type aliases allow you to use a shorter name for long fully qualified class names. --&gt;</p>
<p>&lt;typeAlias alias=&quot;order&quot; type=&quot;testdomain.Order&quot;/&gt;</p>
<p>&lt;!-- Configure a datasource to use with this SQL Map using SimpleDataSource.</p>
<p>Notice the use of the properties from the above resource --&gt;</p>
<p>&lt;transactionManager type=&quot;JDBC&quot; &gt;</p>
<p>&lt;dataSource type=&quot;SIMPLE&quot;&gt;</p>
<p>&lt;property name=&quot;JDBC.Driver&quot; value=&quot;${driver}&quot;/&gt;</p>
<p>&lt;property name=&quot;JDBC.ConnectionURL&quot; value=&quot;${url}&quot;/&gt;</p>
<p>&lt;property name=&quot;JDBC.Username&quot; value=&quot;${username}&quot;/&gt;</p>
<p>&lt;property name=&quot;JDBC.Password&quot; value=&quot;${password}&quot;/&gt;</p>
<p>&lt;property name=&quot;JDBC.DefaultAutoCommit&quot; value=&quot;true&quot; /&gt;</p>
<p>&lt;property name=&quot;Pool.MaximumActiveConnections&quot; value=&quot;10&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.MaximumIdleConnections&quot; value=&quot;5&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.MaximumCheckoutTime&quot; value=&quot;120000&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.TimeToWait&quot; value=&quot;500&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.PingQuery&quot; value=&quot;select 1 from ACCOUNT&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.PingEnabled&quot; value=&quot;false&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.PingConnectionsOlderThan&quot; value=&quot;1&quot;/&gt;</p>
<p>&lt;property name=&quot;Pool.PingConnectionsNotUsedFor&quot; value=&quot;1&quot;/&gt;</p>
<p>&lt;/dataSource&gt;</p>
<p>&lt;/transactionManager&gt;</p>
<p>&lt;!-- Identify all SQL Map XML files to be loaded by this SQL map. Notice the paths</p>
<p>are relative to the classpath. For now, we only have one&hellip; --&gt;</p>
<p>&lt;sqlMap resource=&quot;examples/sqlmap/maps/Person.xml&quot; /&gt;</p>
<p>&lt;/sqlMapConfig&gt;</p>
<p>其中：</p>
<p>&lt;properties&gt;元素指定了一个标准java properties文件的位置，用classpath相对位置或URL形式指定，之后整个配置文件以及所有被包含进来的映射文件都可以用${key}形式的占位符来获取properties文件中的value值。</p>
<p>&lt;settings&gt;元素：</p>
<p>设置一些全局属性，如延迟加载、缓存模式等。</p>
<p>所有可设置属性及其说明如下：</p>
<p><b>maxRequests </b>This is the maximum number of threads that can execute an SQL</p>
<p>statement at a time. Threads beyond the set value will be blocked until</p>
<p>another thread completes execution. Different DBMS have different</p>
<p>limits, but no database is without these limits. This should usually be at</p>
<p>least 10 times maxTransactions (see below) and should always be greater</p>
<p>than both maxSessions and maxTransactions. Often reducing the</p>
<p>maximum number of concurrent requests can <i>increase </i>performance.</p>
<p><i>Example: maxRequests=</i><i>&rdquo;256&rdquo;</i></p>
<p><i>Default: </i><i>512</i></p>
<p><b>maxSessions </b>This is the number of sessions (or clients) that can be active at a given</p>
<p>time. A session is either an explicit session, requested</p>
<p>programmatically, or it is automatic whenever a thread makes use of an</p>
<p>SqlMapClient instance (e.g. executes a statement etc.). This should</p>
<p>always be greater than or equal to maxTransactions and less than</p>
<p>maxRequests. Reducing the maximum number of concurrent sessions</p>
<p>can reduce the overall memory footprint.</p>
<p><i>Example: maxSessions=</i><i>&rdquo;64&rdquo;</i></p>
<p><i>Default: 128</i></p>
<p><b>maxTransactions </b>This is the maximum number of threads that can enter</p>
<p>SqlMapClient.startTransaction() at a time. Threads beyond the set value</p>
<p>will be blocked until another thread exits. Different DBMS have</p>
<p>different limits, but no database is without these limits. This value</p>
<p>should always be less than or equal to maxSessions and always much</p>
<p>less than maxRequests. Often reducing the maximum number of</p>
<p>concurrent transactions can <i>increase </i>performance.</p>
<p><i>Example: maxTransactions=</i><i>&rdquo;16&rdquo;</i></p>
<p><i>Default: 32</i></p>
<p><b>cacheModelsEnabled </b>This setting globally enables or disables all cache models for an</p>
<p>SqlMapClient. This can come in handy for debugging.</p>
<p><i>Example: cacheModelsEnabled=</i><i>&rdquo;true&rdquo;</i></p>
<p><i>Default: true (enabled)</i></p>
<p><b>lazyLoadingEnabled </b>This setting globally enables or disables all lazy loading for an</p>
<p>SqlMapClient. This can come in handy for debugging.</p>
<p><i>Example: lazyLoadingEnabled=</i><i>&rdquo;true&rdquo;</i></p>
<p><i>Default: true (enabled)</i></p>
<p><b>enhancementEnabled </b>This setting enables runtime bytecode enhancement to facilitate</p>
<p>optimized JavaBean property access as well as enhanced lazy loading.</p>
<p><i>Example: </i><i>enhancementEnabled</i><i>=</i><i>&rdquo;true&rdquo;</i></p>
<p><i>Default: false (disabled)</i></p>
<p><b>useStatementNamespaces </b>With this setting enabled, you must always refer to mapped statements</p>
<p>by their fully qualified name, which is the combination of the sqlMap</p>
<p>name and the statement name. For example:</p>
<p>queryForObject(&ldquo;sqlMapName.statementName&rdquo;);</p>
<p><i>Example: useStatementNamespaces=</i><i>&rdquo;false&rdquo;</i></p>
<p><i>Default: false (disabled)</i></p>
<p><b>defaultStatementTimeout </b>(iBATIS versions 2.2.0 and later)</p>
<p>This setting is an integer value that will be applied as the JDBC query</p>
<p>timeout for all statements. This value can be overridden with the</p>
<p>&ldquo;statement&rdquo; attribute of any mapped statement. If not specified, no</p>
<p>query timeout will be set unless specified on the &ldquo;statement&rdquo; attribute of</p>
<p>a mapped statement. The specified value is the number of seconds the</p>
<p>driver will wait for a statement to finish. Note that not all drivers</p>
<p>support this setting.</p>
<p><b>classInfoCacheEnabled </b>With this setting enabled, iBATIS will maintain a cache of introspected</p>
<p>classes. This will lead to a significant reduction in startup time if many</p>
<p>classes are reused.</p>
<p><i>Example: classInfoCacheEnabled=</i><i>&ldquo;true&rdquo;</i></p>
<p><i>Default: true (enabled)</i></p>
<p><b>statementCachingEnabled </b>(iBATIS versions 2.3.0 and later)</p>
<p>With this setting enabled, iBATIS will maintain a local cache of</p>
<p>prepared statements. This can lead to significant performance</p>
<p>improvements.</p>
<p><i>Example: statementCachingEnabled=</i><i>&ldquo;true&rdquo;</i></p>
<p><i>Default: true (enabled)</i></p>
<p>&lt;resultObjectFactory&gt;元素：</p>
<p align="left">指定对象生成工厂类，用于将查询结果封装成对象返回。这是可选设置，若不指定，ibatis将使用Class.newInstance()的方式生成查询结果类。对象工厂类必须实现com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactory接口。</p>
<p align="left">&lt;typeAlias&gt;元素：</p>
<p align="left">用来为一些亢长的类名起&ldquo;别名&rdquo;，例如：</p>
<p>&lt;typeAlias alias=&quot;shortname&quot; type=&quot;com.long.class.path.Class&quot;/&gt;</p>
<p>以后就能用&ldquo;shortname&rdquo;来取代&ldquo;com.long.class.path.Class&rdquo;了。</p>
<p>除了自己定义别名外，iBatis框架预先定义了一些别名，以方便使用，他们是：</p>
<p>Transaction Manager Aliases：</p>
<p>JDBC&nbsp;&nbsp;&nbsp; com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig</p>
<p>JTA&nbsp;&nbsp;&nbsp;&nbsp; com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig</p>
<p>EXTERNAL com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig</p>
<p>Data Source Factory Aliases：</p>
<p>SIMPLE&nbsp;&nbsp; com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory</p>
<p>DBCP&nbsp;&nbsp;&nbsp;&nbsp; com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory</p>
<p>JNDI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory</p>
<p>&lt;transactionManager&gt;元素：</p>
<p>设置事务类型和&lt;dataSource&gt;元素，如上文所说，预定义的事务类型有JDBC, JTA, EXTERNAL；数据源类型有SIMPLE, DBCP, JNDI；若指定EXTERNAL或JTA，那就还有额外的属性需要设置：</p>
<p><img src="http://116.img.pp.sohu.com/images/blog/2007/5/22/13/4/1134a550265.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></p>
<p>
<p>&lt;dataSource&gt;元素：</p>
<p>在transactionManager元素中，定义数据源。预定义三种数据源工厂：SIMPLE, DBCP, JNDI，不过也可以自己写一个。</p>
<p>SIMPLE:在没有容器数据源支持的情况下使用的最简单的数据源实现，具体设置见刚才的例子。</p>
<p>DBCP:使用apache的DBCP数据源，ibatis框架对其直接提供支持，设置方法如下：</p>
<p>&lt;transactionManager type=&quot;JDBC&quot;&gt;</p>
<p>&lt;dataSource type=&quot;DBCP&quot;&gt;</p>
<p>&lt;property name=&quot;driverClassName&quot; value=&quot;${driver}&quot;/&gt;</p>
<p>&lt;property name=&quot;url&quot; value=&quot;${url}&quot;/&gt;</p>
<p>&lt;property name=&quot;username&quot; value=&quot;${username}&quot;/&gt;</p>
<p>&lt;property name=&quot;password&quot; value=&quot;${password}&quot;/&gt;</p>
<p>&lt;!-- OPTIONAL PROPERTIES BELOW --&gt;</p>
<p>&lt;property name=&quot;maxActive&quot; value=&quot;10&quot;/&gt;</p>
<p>&lt;property name=&quot;maxIdle&quot; value=&quot;5&quot;/&gt;</p>
<p>&lt;property name=&quot;maxWait&quot; value=&quot;60000&quot;/&gt;</p>
<p>&lt;!-- Use of the validation query can be problematic.</p>
<p>If you have difficulty, try without it. --&gt;</p>
<p>&lt;property name=&quot;validationQuery&quot; value=&quot;select * from ACCOUNT&quot;/&gt;</p>
<p>&lt;property name=&quot;logAbandoned&quot; value=&quot;false&quot;/&gt;</p>
<p>&lt;property name=&quot;removeAbandoned&quot; value=&quot;false&quot;/&gt;</p>
<p>&lt;property name=&quot;removeAbandonedTimeout&quot; value=&quot;50000&quot;/&gt;</p>
<p>&lt;property name=&quot;Driver.DriverSpecificProperty&quot; value=&quot;SomeValue&quot;/&gt;</p>
<p>&lt;/datasource&gt;</p>
<p>&lt;/transactionManager&gt;</p>
<p align="left">所有的设置属性请参考：<a href="http://jakarta.apache.org/commons/dbcp/configuration.html">http://jakarta.apache.org/commons/dbcp/configuration.html</a></p>
<p align="left">注：以&lsquo;Driver.&rsquo;开头的属性会被加入到JDBC的属性中（有些JDBC需要）。</p>
<p align="left">JNDI:指定配置的JNDI数据源。设置格式：</p>
<p>&lt;transactionManager type=&quot;JDBC&quot; &gt;</p>
<p>&lt;dataSource type=&quot;JNDI&quot;&gt;</p>
<p>&lt;property name=&quot;DataSource&quot; value=&quot;java:comp/env/jdbc/jpetstore&quot;/&gt;</p>
<p>&lt;/dataSource&gt;</p>
<p>&lt;/transactionManager&gt;</p>
<p>上面只是使用普通的JDBC事务，但通常设置JNDI数据源更愿意用JTA全局事务：</p>
<p>&lt;transactionManager type=&quot;JTA&quot; &gt;</p>
<p>&lt;property name=&quot;UserTransaction&quot; value=&quot;java:/comp/UserTransaction&quot;/&gt;</p>
<p>&lt;dataSource type=&quot;JNDI&quot;&gt;</p>
<p>&lt;property name=&quot;DataSource&quot; value=&quot;java:comp/env/jdbc/jpetstore&quot;/&gt;</p>
<p>&lt;/dataSource&gt;</p>
<p>&lt;/transactionManager&gt;</p>
<p align="left">&lt;sqlMap&gt;元素：</p>
<p align="left">用来包含SQL映射文件或另一个配置文件，以classpath或URL的形式：</p>
<p>&lt;!-- CLASSPATH RESOURCES --&gt;</p>
<p>&lt;sqlMap resource=&quot;com/ibatis/examples/sql/Customer.xml&quot; /&gt;</p>
<p>&lt;sqlMap resource=&quot;com/ibatis/examples/sql/Account.xml&quot; /&gt;</p>
<p>&lt;sqlMap resource=&quot;com/ibatis/examples/sql/Product.xml&quot; /&gt;</p>
<p>&lt;!-- URL RESOURCES --&gt;</p>
<p>&lt;sqlMap url=&quot;file:///c:/config/Customer.xml &quot; /&gt;</p>
<p>&lt;sqlMap url=&quot;file:///c:/config/Account.xml &quot; /&gt;</p>
<p>&lt;sqlMap url=&quot;file:///c:/config/Product.xml&quot; /&gt;</p></p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/82020#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 May 2007 05:06:29 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/82020</link>
        <guid>http://pf-miles.javaeye.com/blog/82020</guid>
      </item>
      <item>
        <title>学院项目的架构设计图&amp;近期任务计划说明</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/81236" style="color:red;">http://pf-miles.javaeye.com/blog/81236</a>&nbsp;
          发表时间: 2007年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>考试告一段落，该忙乎院长交与的项目了。《学生信息管理系统》，准备用struts+iBatis+spring构建，今天算是考完试后小组的第一次开会，交代了近两个星期内的任务。我立刻将结构的想法画成简图，以及计划建议交给组长和各组员。以下是结构设计简图，精彩的工作由这里开始：</p>
<p><img src="http://116.img.pp.sohu.com/images/blog/2007/5/19/23/25/1133d23143d.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></p>
<p>&nbsp;</p>
<p>接下来是半个月左右的计划：<br />下星期完成数据层到服务层的详细类图，其间我将确定後的实体类图交与邓飞，让他们建表。<br />再下个星期开会+培训後组织第一阶段的编码，我打算这样的：首先我来建立工程，建立好包结构和服务层的所有接口、添加好所有需要的库，也就是搭个骨架。然后我将工程文件夹、开发工具（Eclipse）、JDK安装文件（统一JDK也很重要）、数据库一并打包传给每个参加编码的人。之后开始分配任务从右至左编码：从Sql查询语句开始至FacadeManagerImp类结束算是完成了这个阶段的任务，其间要注意代码同步，我担心subversion我们都没经验，硬要用上也不见得是好事。所以我觉得要避免代码版本冲突就要严格划分任务区域，各司其职就没事了。可以考虑在某个FTP中为每个人都指定一个代码文件夹，谁有新版本的代码就传到属于他自己的文件夹里，并放上一个名字为更新日期的文本文档，这样我们每隔一段时间就上这个FTP，去每个人的文件夹里下载最新的代码到本地覆盖就可以了。</p>
<p>如上计划完成了的话，我们几乎算是完成了一半的工作。剩下的工作分两种方案：一起作为一个阶段做完、分两个阶段做完。</p>
<p>1）：作为一个阶段做完：业务逻辑层就是struts框架的Action层，直接编写Action，并组织页面流程，完成之后整个项目也就差不多了。这样的话业务逻辑层和表现层就都交给struts来组织。<br />2）：分为两个阶段做完：先做我们自己定义的业务逻辑层的设计和实现（不跟任何struts的api耦合）（这一层的类多，但形式单一，属于劳动密集型，大概占总的20%的工作量），称为&ldquo;业务逻辑组件&rdquo;。；然后就是结合struts来摆纯的表现层，也就是最后30%的工作，其中&ldquo;业务逻辑组件&rdquo;中的方法要么返回某种计算结果，要么返回指示是否执行成功的true/false信息，也就是说跟struts达成&ldquo;控制耦合&rdquo;，Struts在这里就只管表现层。</p>
<p>方案1）其实属于一般常用做法，循规蹈矩；但方案2）由于实现了独立于任何框架的业务逻辑组件，今后如果要改表现层框架（如放弃struts用webwork或jsf），甚至想把本项目重做成C/S架构都是很方便的事情，只需要做最后30%的工作；但若是方案1）作出这样的改动的话就要做50%的工作（业务逻辑层以上均重新构建）。<br />也许方案2）有点画蛇添足，我们的项目或许做好后再也不需要做那么大的改动...这是鱼和熊掌的问题...<br />不过决定用那个方案起码是半个月之后的事情，现在不用着急，先完成最上面的计划吧。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pf-miles.javaeye.com/blog/81236#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 May 2007 15:58:50 +0800</pubDate>
        <link>http://pf-miles.javaeye.com/blog/81236</link>
        <guid>http://pf-miles.javaeye.com/blog/81236</guid>
      </item>
      <item>
        <title>《超右脑英语学习软件》杀入决赛</title>
        <author>pf_miles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pf-miles.javaeye.com">pf_miles</a>&nbsp;
          链接：<a href="http://pf-miles.javaeye.com/blog/79937" style="color:red;">http://pf-miles.javaeye.com/blog/79937</a>&nbsp;
          发表时间: 2007年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>上周就获悉我和一位学弟做的东软杯的比赛项目已经晋级决赛，于这周二晚上进行决赛。由于我要考试，所以没办法去给学弟助阵，只是对软件的结构写点介绍性的文字，帮助他到时候上台讲解。</p>
<p>其实这个东西有多么烂的表现层我们心理都很清楚，但为什么能进决赛？说明&mdash;&mdash;别人的比我们更烂！！哈哈～废话不多说了，不管有多烂，毕竟自己曾经花时间做过的东西，就留作纪念吧，要说维护的话其实也难&mdash;&mdash;我没多少时间再去帮他维护了...这里把我为他明天写的东西贴上来留作纪念吧，我很少写那么多字，我也讨厌写那么多文字，不容易，所以一定要贴出来留个纪念：</p>
<p><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: &apos;Times New Roman&apos;; mso-hansi-font-family: &apos;Times New Roman&apos;">软件结构示意图：</span></p>
<p><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: &apos;Times New Roman&apos;; mso-hansi-font-family: &apos;Times New Roman&apos;"><img src="http://116.img.pp.sohu.com/images/blog/2007/5/14/21/25/11322c467ad.jpg" border="0" alt="" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" /></span></p>
<p><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: &apos;Times New Roman&apos;; mso-hansi-font-family: &apos;Times New Roman&apos;">&nbsp; </span></p>
<p><span style="mso-fareast-font-family: &apos;Times New Roman&apos;"><span style="mso-list: Ignore">1）<span style="FONT: 7pt &apos;Times New Roman&apos;">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: &apos;Times New Roman&apos;; mso-hansi-font-family: &apos;Times New Roman&apos;">软件结构简介：本软件采用分层结构设计，自顶向下分为表现层、逻辑层、服务层和数据层。数据层负责组织软件中用到的数据，采用</span><span>xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: &apos;Times New Roman&apos;; mso-hansi-font-family: &apos;Times New Roman&apos;">文件格式存储；服务层提供了对底层数据的存取的基本功能，是上面一层（逻辑层）获得数据的唯一通道，仿</span><span>DAO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: &apos;Times New Roman&apos;; mso-hansi-font-family: &apos;Times New Roman&apos;">模式构建；再上面一层的逻辑层是整个软件功能实现的基础，它提供了一系列与软件主要功能相关的类来实现主要功能，如生成试题、播放音乐、为试