<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>闲人居</title>
    <description>程序，吾之所爱，程序，亦吾所恶。</description>
    <link>http://zyl.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>关于服务端生成js的构思</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/152412" style="color:red;">http://zyl.javaeye.com/blog/152412</a>&nbsp;
          发表时间: 2008年01月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          研究了ext很久了，一直想为ext直接封装一个服务端组件。考虑到ext组件的构建都是需要使用js来完成，那么服务端生成的代码也就是js而不是html。<br />    如果采取纯Ajax的方式，类似于Echo2的构造，不过这样对于Session可能是一个负担，同时可能会造成服务端的拥堵。不过使用纯Ajax有个好处，就是js只需要装载一次就行了。而如果使用各个不同的页面方式，则需要多次装载ext的js文件，这对于网络也是一个压力。<br />    不过创建的初衷，此框架主要还是使用于内部网，这样对于性能方面的担心可以略过了。<br />    设计流程如下：<br />    类似于Jsf的请求流程,提供Lifecycle，基本上也就五个生命周期，apply request,process validators,update model,invokeAction,render ajax。<br />    先不考虑其他的生命周期，先来处理render ajax部分。基本构思还是以render xml为主，主要的格式如下：<br />    <br />&lt;message xmlns="http://www.esoft.org/servermessage"><br />  &lt;lib><br />    &lt;js url="widgets/ext-component"/><br />  &lt;/lib><br />  &lt;script>Ext.QuickTips.init();&lt;/script><br />  &lt;content cid="W9">&lt;div id="W39"/>&lt;/content><br />  &lt;remove>Ext.get('W29').remove();&lt;/remove><br />&lt;/message><br /><br />lib 中主要用来装载ext的各个组件js,这样不需要一次装载。<br />script，主要的执行js脚本<br />content用于创建相应的html<br />remove相应的删除js脚本<br /><br />为什么需要增加remove而不是把所有的脚本都放在script中。<br />这是由于整个处理都在一个页面中，为了能按照顺序执行相应的脚本，remove的脚本需要优先执行，当两个组件不停的切换的时候。<br /><br />client 对于脚本的解析流程如下：<br />首先分批装载js url<br />当所有的js装载完成后<br />执行remove 脚本<br />遍历content,增加相应的html node<br />执行script脚本。<br /><br />对于页面的生成，基本上没有什么问题。<br />只是如果采用这种方式，可能目前来说只能依赖于ext这个框架，对于服务端的灵活性也就大打折扣，不过既然是为了ext而做的，那也就无所谓了。<br /><br />不知道各位对这种生成方式有什么不同意见，期待讨论。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/152412#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jan 2008 18:38:37 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/152412</link>
        <guid>http://zyl.javaeye.com/blog/152412</guid>
      </item>
      <item>
        <title>ext 之我见</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/151585" style="color:red;">http://zyl.javaeye.com/blog/151585</a>&nbsp;
          发表时间: 2007年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="font-size: 14px; line-height: 30px;">&nbsp;&nbsp;&nbsp; 最近的这段时间，感觉Ext挺火的。接触Ext还是半年前的事情了，那时候就想对Ext进行封装，做一个服务端的Ajax框架出来。可由于身体的原因，还是搁浅了。<br />
&nbsp;&nbsp;&nbsp; 使用Ext是从1.1开始的，那时候觉得Ext，几乎已经简化了所有的客户端脚本。就算不会js，不会Ajax，使用Ext也可以很容易的搭建不错的页 面。而且Ext在兼容性上面做的也算不错，至少我在ie 6,ie 7 ff和opera 9上运行demo的时候基本上没有什么问题。当然最主要的一个吸引我的因素是，和其他的框架相比，Ext的界面做的比较的出色，就美观而言，算是 perfect了。<br />
&nbsp;&nbsp;&nbsp; 随着Ext 2.0的正式发布，关注Ext的人也越来越多。Ext变得越来越大众化，这是一件值得高兴的事情，毕竟使用Ext能够帮助简化不少的js代码，而且对于html代码的编写，是数量级的减少。<br />
&nbsp;&nbsp;&nbsp; 让数据和内容分离，一直是Ajax所提倡的，而Ext可以完全做到这些。Grid作为表示组件而Store作为数据存储，数据可以通过Reader来读取，包括xml和json，或者其它的自定义实现。<br />
&nbsp;&nbsp;&nbsp; 组件化，这是Ext最大的特色。所有的组件都继承Ext.Component这个基础类。而Ext.Component继承 Ext.util.Observable，让组件事件的处理变得更为的强大和灵活。Ext可以模拟所有的桌面事件，如双击，拖拽，这些只有在桌面程序中才 见到的，而这些事件的处理变得和桌面程序一样的简捷。<br />
&nbsp;&nbsp;&nbsp; 动画以及控件的resize和drag，这些比较难处理的js，在Ext中变得实在很简洁。基本的Window都有drag和resize行为，动画更是简单。当然这些功能只是次要的。不过在ria中，这些功能又都是不能缺少的。<br />
&nbsp;&nbsp;&nbsp; 当然Ext的诟病也不少，如性能，这个在浏览器中关键的因素。完整的Ext.js需要400多k，随着宽带的普及，以及Ajax技术的应用，这个应该不成 为问题。真正的问题在于Ext都是使用js构建页面，其中的html代码，可能比较的繁琐，过多的div的使用，可能也会是一个灾难。如 Ext.Button这个组件的表现层一样。当然Ext也提供了自定义的html模板功能，这个问题也就可能不是问题了。最后毕竟Ext只是一个客户端的 组件实现，和服务端的集成，还需要自己实现。不过Ext在这个方面，也提供了很多的简化功能，如延迟装载，数据读取等。<br />
&nbsp;&nbsp;&nbsp; 当然，个人还是比较的看好Ext，希望这个框架能够越走越好。<br />
<br />
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/151585#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Dec 2007 19:04:36 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/151585</link>
        <guid>http://zyl.javaeye.com/blog/151585</guid>
      </item>
      <item>
        <title>回来了</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/151321" style="color:red;">http://zyl.javaeye.com/blog/151321</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: 12pt">    很久没有更新了，由于过去的半年都在医院呆着，也就没有时间去维护自己的blog了。不过发现浏览的人还是挺多的，有点对不起大家，毕竟没有办法回复。<br />    半年过去了，看了看网上的技术，还好新的东东不太多，不然又得需要花费大量的时间去学了。不过，现在对于新的技术，也没有以前那种热情了，其实搞软件的还是得要踏踏实实的打好基础，毕竟内涵的东西都差不多，不像硬件，更新的速度实在跟不上。<br />    编程也好多年了，看着周围的人，基本上都已经从编程开始转向管理，在国内就是这样。不过我还是不想放弃，继续做一个程序员，继续开发。喜欢编程没有理由，看着一行行的代码，内心总是有种莫名的喜悦，毕竟这是自己创造的。就像小时候搭积木一样，完成后总是感觉很有成就感。<br />    当然，这种感觉，有时候可能会被压抑。在公司的时候，老是重复着基本的东西，失去了创造的乐趣。而今离开了公司，终于不再感觉压抑，做一个自由的程序员是快乐的，不过也可能是悲哀的。为什么人家老外能写出那么好的程序，而看看国内，好的程序真的不多，同样都是搞程序的，差别怎么能这么大，可能这就是环境的缘故吧。<br />    在住院的时候，只要有时间还是会写几行代码，虽然身体不允许，不过还是没有办法停止。也许这就是程序员的天性，离开了程序，我发现我做别的都没有什么兴趣。而今，已经离开了医院，又可以开始自己的程序员生涯，不过真的不想再去公司任职了，虽然在经济上可能会有点压力，不过我还是喜欢做一个自由的程序员，认真地做一些自己想做的东西。</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/151321#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Dec 2007 19:04:00 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/151321</link>
        <guid>http://zyl.javaeye.com/blog/151321</guid>
      </item>
      <item>
        <title>jsf中的 国际化，验证和转换</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/82572" style="color:red;">http://zyl.javaeye.com/blog/82572</a>&nbsp;
          发表时间: 2007年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这些东东，对于web框架来说，是必不可少的，来看看jsf是如何实现的。首先看一下国际化，默认的情况下，会选择默认的locale，以及相应的资源文件。当然可以通过以下方式进行配置：<br /><pre name="code" class="java">
&lt;application>
&lt;locale-config>
&lt;default-locale>en&lt;/default-locale>
&lt;supported-locale>en&lt;/supported-locale>
&lt;supported-locale>es&lt;/supported-locale>
&lt;/locale-config>
&lt;message-bundle>CustomMessages&lt;/message-bundle>
&lt;/application>
</pre><br />资源文件，也是和其他web应用一致。<br /><pre name="code" class="java">
halloween=Every day is like Halloween.
numberOfVisits=You have visited us {0} time(s), {1}. Rock on!
toggleLocale=Translate to Spanish
helloImage=../images/hello.gif
</pre><br /><br />如果需要在页面中使用相应的bundle，需要使用以下的标记：<br /><pre name="code" class="java">
&lt;f:loadBundle basename="LocalizationResources" var="bundle"/>
&lt;h:outputText value="#{bundle.halloween}"/>
</pre><br /><br />当然这是使用默认的locale设置，如果想动态切换locale，目前我的处理方式是这样的：<br /><pre name="code" class="java">
&lt;f:loadBundle basename="messages_#{localeBean.locale}" var="msg"/>
</pre><br />当然localeBean.locale的值是动态更改的，可以为en,zh_CN，等等。<br />个人觉得和spring 的web framework相比，没有spring的那么灵活，不过基本上都能解决问题，凑合着用吧。<br /><br />如果想在代码中使用，还是需要使用以下方法：<br /><pre name="code" class="java">
public static String getMessageString(String name, Object params) {
    String str = "";
    FacesContext facesContext = FacesContext.getCurrentInstance();
    String bundleName = facesContext.getApplication().getMessageBundle();
    if (bundleName != null) {
        Locale locale = facesContext.getViewRoot().getLocale();
        ResourceBundle bundle = ResourceBundle.getBundle(bundleName,
            locale, getCurrentClassLoader(params));
        str = bundle.getString(name);
    }
    return str;
    }
</pre><br />    对于验证机制，基本的接口为Validator,只有一个方法validate。通常的验证机制，都是通过服务端来实现。如果想支持客户端支持，估计还得自己写一套接口去替换。不过看了其生命周期，觉得很难实现，除非脱离其生命周期。当然，这些使用ajax来处理，可能会减少服务端的通信负担。<br />   其默认的验证实现，包括以下几个：<br /><pre name="code" class="java">
   DoubleRange：&lt;f:validateDoubleRange>
      Length：&lt;f:validateLength>
      LongRange：&lt;f:validateLongRange>
</pre><br />   从字面意思可以看出来。<br />   当然，每个组件都有默认的验证器required。只要设置其属性为ture，就会进行空值判断。<br />  <br />   对于组件来说，支持多个验证器。但是没有看到关联组件的验证器，需要自己实现。如password的是否一致<br /><br />   类型转换，接口Converter，包括两个方法:<br /><pre name="code" class="java">
    public Object getAsObject(FacesContext context, UIComponent component,
                              String value);
    public String getAsString(FacesContext context, UIComponent component,
                              Object value);
</pre><br />  <br />  前者转化为对象，后者为用于页面输出。<br />  在进行验证前，都会先进行值转换。<br />  对于转换,内部已经提供了基本类型的实现，包括数字，日期，boolean型。<br />  当然Converter另外一个功能，就是提供格式化输出，支持NumberFormat和DateFormat的输出：<br />  包括：&lt;f:convertDateTime>和&lt;f:convertNumber pattern="###,###.##;(###,###.##)"/>其样式，完全采用相应的java样式。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/82572#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 May 2007 13:29:46 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/82572</link>
        <guid>http://zyl.javaeye.com/blog/82572</guid>
      </item>
      <item>
        <title>velocity 二 开发篇</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/80476" style="color:red;">http://zyl.javaeye.com/blog/80476</a>&nbsp;
          发表时间: 2007年05月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先来看看velocity是怎么工作的？<br />
<br />
在应用中使用velocity，一般需要以下的几个步骤：<br />
<ul>
    <li>&nbsp; 初始化Velocity,可以使用单例，或者运行期实例</li>
    <li>&nbsp; 创建context对象，用于包括相应的变量</li>
    <li>&nbsp; 在context中增加相应的数据</li>
    <li>&nbsp; 选择模板</li>
    <li>&nbsp; 合并模板，产生输出</li>
</ul>
<br />
如下的例子：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.StringWriter;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.velocity.VelocityContext;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.velocity.Template;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.velocity.app.Velocity;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.velocity.exception.ResourceNotFoundException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.velocity.exception.ParseErrorException;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.velocity.exception.MethodInvocationException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Velocity.init();&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;<span class="number">1</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>VelocityContext&nbsp;context&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;VelocityContext();&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">2</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>context.put(&nbsp;<span class="string">&quot;name&quot;</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(</span><span class="string">&quot;Velocity&quot;</span><span>)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">3</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Template&nbsp;template&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;template&nbsp;=&nbsp;Velocity.getTemplate(<span class="string">&quot;mytemplate.vm&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">4</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">catch</span><span>(&nbsp;ResourceNotFoundException&nbsp;rnfe&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;couldn't&nbsp;find&nbsp;the&nbsp;template</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">catch</span><span>(&nbsp;ParseErrorException&nbsp;pee&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;syntax&nbsp;error:&nbsp;problem&nbsp;parsing&nbsp;the&nbsp;template</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">catch</span><span>(&nbsp;MethodInvocationException&nbsp;mie&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;something&nbsp;invoked&nbsp;in&nbsp;the&nbsp;template</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;threw&nbsp;an&nbsp;exception</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">catch</span><span>(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>StringWriter&nbsp;sw&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;StringWriter();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>template.merge(&nbsp;context,&nbsp;sw&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">5</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
上面的例子使用的是单例模式，可以使用运行期实例：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>VelocityEngine&nbsp;ve&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;VelocityEngine();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>ve.setProperty(&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;VelocityEngine.RUNTIME_LOG_LOGSYSTEM,&nbsp;<span class="keyword">this</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>ve.init();&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
关于context<br />
context，类似于map环境，包括两个主要的方法：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;Object&nbsp;put(String&nbsp;key,&nbsp;Object&nbsp;value);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;Object&nbsp;get(String&nbsp;key);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
而默认的VelocityContext是使用map封装，保存相应的变量<br />
<br />
当然，如果想和其他环境合并，如FacesContext中的Elcontext，需要定义自己的实现类。<br />
<br />
<span style="font-weight: bold;">Context chaining，</span><br />
context支持多个context串，如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>VelocityContext&nbsp;context1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;VelocityContext();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>context1.put(<span class="string">&quot;name&quot;</span><span>,</span><span class="string">&quot;Velocity&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>context1.put(<span class="string">&quot;project&quot;</span><span>,&nbsp;</span><span class="string">&quot;Jakarta&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>context1.put(<span class="string">&quot;duplicate&quot;</span><span>,&nbsp;</span><span class="string">&quot;I&nbsp;am&nbsp;in&nbsp;context1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>VelocityContext&nbsp;context2&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;VelocityContext(&nbsp;context1&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>context2.put(<span class="string">&quot;lang&quot;</span><span>,&nbsp;</span><span class="string">&quot;Java&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>context2.put(<span class="string">&quot;duplicate&quot;</span><span>,&nbsp;</span><span class="string">&quot;I&nbsp;am&nbsp;in&nbsp;context2&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>template.merge(&nbsp;context2,&nbsp;writer&nbsp;);&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<br />
Velocity不仅可以用于提供模板输出，而且可以直接对字符串进行评估：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>StringWriter&nbsp;w&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringWriter();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Velocity.mergeTemplate(<span class="string">&quot;testtemplate.vm&quot;</span><span>,&nbsp;context,&nbsp;w&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>String&nbsp;s&nbsp;=&nbsp;<span class="string">&quot;We&nbsp;are&nbsp;using&nbsp;$project&nbsp;$name&nbsp;to&nbsp;render&nbsp;this.&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>w&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;StringWriter();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Velocity.evaluate(&nbsp;context,&nbsp;w,&nbsp;<span class="string">&quot;mystring&quot;</span><span>,&nbsp;s&nbsp;);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/80476#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 May 2007 07:30:24 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/80476</link>
        <guid>http://zyl.javaeye.com/blog/80476</guid>
      </item>
      <item>
        <title>关于velocity 一语法篇</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/79720" style="color:red;">http://zyl.javaeye.com/blog/79720</a>&nbsp;
          发表时间: 2007年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 一个古老而又强大的模版引擎。在模版引擎中,velocity中，应该属于最常用的，不管是在maven的项目模版，还是在源代码输出，甚至直接网页输出中，都可以看到其身影。当然，最近的freemarker大有平分天下之意。<br />
&nbsp;&nbsp; 以前的时候，曾用velocity设计过一个自动代码的项目，在用的过程中，享受了其简单而又灵活的功能。后来由于，自动代码的项目一直没有什么进展，也就很少去关注velocity。这段时间，被jsf搞得焦头烂额，最后想起了velocity，看看能不能用其来实现替换jsf的标记库功能。于是又复习了一遍velocity。<br />
&nbsp;&nbsp; 先来看看velocity的语法：vtl也就是velocity的基本语言.用过脚本语言的，对于这个应该会很容易上手，其实，基本上，语法可以分为变量和关键词。先来看看变量，变量使用$作为开头符号，$a 和${a}是一致的。类似于jstl中的变量定义。在模版中声明一个变量是很容易的，使用set关键字<br />
&nbsp;&nbsp; #set( $foo = &quot;Velocity&quot; )。对于velocity中，感觉比较灵活的就是变量中，可以直接使用方法，和javabean属性一样方便使用：<br />
&nbsp;&nbsp; 对于javabean 支持内置属性，如下：$customer.Address，$purchase.Total，$customer.Address.phone。不过好像不支持map语法，如：<br />
a[&quot;key&quot;]这种写法。但是可以使用方法代替：a.get(&quot;key&quot;)。而使用了方法，感觉就在使用java代码一样方便。当然变量中支持简单的表达式计算：$a+1等等<br />
&nbsp;&nbsp; 有一点需要注意的是，如果变量没有解析，还是会输出$a这个变量，而不是空白，或者报错，这一点，不知道是方便还是不方便。<br />
&nbsp;&nbsp; 语法中另外一个，就是关键字了，关键字使用#开头。<br />
&nbsp;&nbsp; 其关键字也不多，只有少数的几个，但是已经足够用了。如前面的声明变量：#set<br />
&nbsp;&nbsp; #if #elseif #else&nbsp; #end 这是最常用的条件判断，每个判断使用#end结尾<br />
&nbsp;&nbsp; #if($a==1)true enough#{else}no way!#end<br />
<br />
&nbsp;&nbsp; #foreach() #end用于循环输出<br />
&nbsp;&nbsp; #foreach( $key in $allProducts.keySet() )&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp; Key: $key -&gt; Value: $allProducts.get($key)<br />
&nbsp;&nbsp; #end<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; #include，用于包括一些资源文件，当然include是不会去解析资源文件，这和#parse不同<br />
&nbsp;&nbsp; #include( &quot;one.txt&quot; )<br />
<br />
&nbsp;&nbsp; #parse，用于解析并且包括相应的资源文件<br />
&nbsp;&nbsp; #parse( &quot;me.vm&quot; )，和主文件共享相应的Context<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; #stop,用于停止执行解析，并返回，主要用于调试功能。<br />
<br />
&nbsp;&nbsp; 基本上，使用以上的语法，可以定义出任何的模版了。当然，为了简化模版的定义，velocity特意推出了#macro这个强大的功能.<br />
&nbsp;&nbsp; #macro，类似于宏定义，用于自定义相应的标记。<br />
&nbsp;&nbsp; 如下定义了一段宏，用于输出表格中的列表<br />
&nbsp;&nbsp; #macro( tablerows $color $somelist )<br />
&nbsp;&nbsp;&nbsp; #foreach( $something in $somelist )<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $something<br />
&nbsp;&nbsp;&nbsp; #end<br />
&nbsp;&nbsp; #end<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 在模版中，只需要使用#tablerows($color $somelist)就可以取代里面的代码了：<br />
&nbsp;&nbsp; #set( $greatlakes = [&quot;Superior&quot;,&quot;Michigan&quot;,&quot;Huron&quot;,&quot;Erie&quot;,&quot;Ontario&quot;] )<br />
&nbsp;&nbsp; #set( $color = &quot;blue&quot; )<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; #tablerows( $color $greatlakes )<br />
&nbsp;
<table>
</table>
<br />
&nbsp; <br />
&nbsp;&nbsp; 而且#macro 支持内嵌语法，所以对于模版的定义，就变得更加的灵活而简单了。<br />
&nbsp;&nbsp;
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/79720#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 May 2007 08:27:59 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/79720</link>
        <guid>http://zyl.javaeye.com/blog/79720</guid>
      </item>
      <item>
        <title>关于jsf 的标记库</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/78319" style="color:red;">http://zyl.javaeye.com/blog/78319</a>&nbsp;
          发表时间: 2007年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="font-size: 14px; line-height: 30px;">&nbsp; 对于标记库，不想再说些什么了。jsf可能最大的毛病都在这个标记库上面，首先定义的标记在jsp中，并不起到相应的输出功能，而只是用来增加相应得组 件。在jsf中，最上层的组件为UIViewRoot，基本上所有的操作都是需要围绕着此组件。而标记库的存在，只是为了简化相应的操作。如下的标记：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">f:view</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:panelGrid</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" src_cetemp="http://www.blogjava.net/Images/dot.gif" />.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">h:panelGrid</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">h:form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">f:view</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
其实对应的java代码，如下：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="color: rgb(0, 0, 0);">FacesContext&nbsp;context&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;FacesContext.getCurrentInstance();<br />
UIViewRoot&nbsp;root&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;context.getViewRoot();<br />
HtmlForm&nbsp;form&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;HtmlForm();<br />
HtmlPanelGrid&nbsp;grid&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;HtmlPanelGrid();<br />
form.getChildren().add(grid);<br />
root.getChildren().add(form);</span></div>
<br />
也就是说没有标记库，我完全可以使用java代码完成。<br />
&nbsp;&nbsp;&nbsp; 那么标记库的存在到底有没有意义，意义可能就在于简化相应的操作，想想html的属性是比较多的，如果每个都要用java代码去控制，那么可能对于应用来 说，显得很不灵活，因为改代码毕竟没有改jsp来的快。而且代码需要重新编译。所以jsf的标记库存在也是有点意义的。<br />
可是，现在的问题是，由于 jsf本身就是规范，其实现也就会各有不同，对于每种实现都会带有自己的那一套标记库，随着标记库的增加，对于使用者来说，也是不堪忍受的重负。所以，有 些时候，如果需要动态做一些配置，那么还是丢弃标记库，用java代码来完成吧。当然facelets，提供了一种方式，用于很灵活的扩展多个标记库，可 是，看着那么多的标记，总是还有些头疼。<br />
<br />
&nbsp;&nbsp;&nbsp; 其次，对于标记库来说，各个标记库的不兼容也是一个很大的问题。就拿jstl和jsf来说，jstl的变量声明，在jsf中肯定是没有办法解析的，同样jsf中的变量，在jstl中也不能认识。我指的是页面声明的变量，而不是session变量，如下的例子：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h:dataTable&nbsp;</span><span style="color: rgb(255, 0, 0);">styleClass</span><span style="color: rgb(0, 0, 255);">=&quot;table-background&quot;</span><span style="color: rgb(255, 0, 0);"><br />
&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;rowClasses</span><span style="color: rgb(0, 0, 255);">=&quot;table-odd-row,table-even-row&quot;</span><span style="color: rgb(255, 0, 0);"><br />
&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;cellpadding</span><span style="color: rgb(0, 0, 255);">=&quot;3&quot;</span><span style="color: rgb(255, 0, 0);"><br />
&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;value</span><span style="color: rgb(0, 0, 255);">=&quot;#{recordBean.records}&quot;</span><span style="color: rgb(255, 0, 0);"><br />
&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;var</span><span style="color: rgb(0, 0, 255);">=&quot;record&quot;</span><span style="color: rgb(255, 0, 0);"><br />
&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;binding</span><span style="color: rgb(0, 0, 255);">=&quot;#{recordBean.recordData}&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">c:if&nbsp;</span><span style="color: rgb(255, 0, 0);">test</span><span style="color: rgb(0, 0, 255);">=&quot;${record}&quot;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">c:if</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">h:dataTable</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
在dataTable中声明了变量record，但是在jstl中是不会认识的。<br />
&nbsp;&nbsp;&nbsp; 可能这个问题，facelets已经解决了，主要facelets把所有的Elcontext中的变量都结合在了一起，使用自身的FaceletsContext。<br />
不过，如果我只是需要简单的功能，还需要使用facelets，那么也就有点大材小用了。况且facelets也只是提供了类似tiles的功能。<br />
最 后，想说的是，虽然jsf目前的ide支持，比其他框架多多了。可惜，人家都是建立在相应的标记库上的，如果你定义了自己标记库，人家不一定会认识。所以 标记库的存在，对于jsf来说，也许并不一定是好事情，可能sun觉得如果把jsp抛弃了，有点可惜。所以在升级jsf的同时，也升级了相应得jsp规 范。<br />
&nbsp;&nbsp;&nbsp; 个人觉得，也许模版技术，可能也会是一种选择，看看velocity和freemarker，觉得其比jsp有优势多了。<br />
<br />
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/78319#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 May 2007 20:31:37 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/78319</link>
        <guid>http://zyl.javaeye.com/blog/78319</guid>
      </item>
      <item>
        <title>关于jsf 生命周期</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/76988" style="color:red;">http://zyl.javaeye.com/blog/76988</a>&nbsp;
          发表时间: 2007年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: 14px; line-height: 30px;">&nbsp;&nbsp;&nbsp; 这是jsf 的分析系列第三篇，随着不断的深入，jsf的设计变得越来越清晰。当然，在目前的规范中，jsf还是很不完善的，这也就导致了为什么jsf还是不能成为目前的主流框架。先不去谈论这些弊端，还是先看看一下jsf具体是如何运作的。<br />
&nbsp;&nbsp;&nbsp; 对于jsf规范，个人觉得和其他框架相比，最大的区别，可能在于jsf划分了web 请求的生命周期。like ejb一样，web 请求也是有生命周期的。虽然，在其他的框架中，也可以看到相关的生命周期，但还是没有jsf划分的清晰。也许，这也是jsf的一大特色。<br />
&nbsp;&nbsp;&nbsp; 对于生命周期的执行，所有的操作都归结到Lifecycle这个接口。接口包括了两个主要的方法：<br />
&nbsp;&nbsp;&nbsp; public abstract void execute(FacesContext context) throws FacesException;和<br />
&nbsp;&nbsp;&nbsp; public abstract void render(FacesContext context) throws FacesException;<br />
&nbsp;&nbsp; 前者是用来执行各个生命周期的阶段，也就是除了render之外的其他五个阶段，而且是按照相应的顺序执行。而render，是执行最后一个阶段，展示页 面。可能有人不太理解，为什么不把两个方法合并成一个方法，刚开始，我也是这么认为。既然已经定义了相应的Phase，何必要把最后的render过程分 离出来。看了sun 的RI实现类，发现在render之前需要进行context.getResponseComplete()判断，可能规范中，认为render是必须要 执行的阶段，其他的阶段可以跳过，所以分离了相应的方法,同时在执行前,为了避免重复输出,需要对render过程进行特殊的处理.<br />
&nbsp;&nbsp; 规范中定义了6个阶段，从下面的流程图中可以看到。<br />
<img src="http://www.blogjava.net/images/blogjava_net/zyl/lct.GIF" height="768" alt="" width="524" src_cetemp="/images/blogjava_net/zyl/lct.GIF" /><br />
简单介绍一下每个阶段的工作：<br />
<br />
<span style="font-weight: bold;">RESTORE_VIEW：</span>查找原有的view ，恢复原有的状态，如果没有，则调用ViewHandler.createView，如果为post操作，则按照顺序执行各个阶段。<br />
否则执行RENDER_RESPONSE阶段。<br />
<span style="font-weight: bold;">APPLY_REQUEST_VALUES：</span>读取客户端参数，处理各个组件的processDecodes方法，内部调用decode方法，由Renderer执行decode方法<br />
<span style="font-weight: bold;">PROCESS_VALIDATIONS：</span>执行组件的processValidators方法，对于UIInput执行validate方法，用于绑定值，调用convert,和validate<br />
<span style="font-weight: bold;">UPDATE_MODEL_VALUES:</span>执行组件的processUpdates方法，对于UIViewRoot，执行broadcastEvents和notifyPhaseListeners<br />
所有的UIInput,执行updateModel方法。<br />
<span style="font-weight: bold;">INVOKE_APPLICATION：</span>调 用UIViewRoot.processApplication方法。这一过程主要读取相应的action配置，如果存在action，则调用 action，也就是调用应用逻辑。在执行完相应的逻辑后，查询action是否返回值，如果有，由navigationHandler去读取下一个 view id。<br />
<span style="font-weight: bold;">RENDER_RESPONSE：</span>展示view，调用ViewHandler.renderView,展示view。<br />
<br />
每 个阶段定义定义的都比较清晰，有一点需要注意的是，在处理请求时，并不一定会执行每个阶段，可能其中会直接跳到最后的render response阶段。举例来说，如果validator时，存在错误信息，那么就会直接到render response阶段，而下一个阶段不会执行。<br />
<br />
<br />
</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/76988#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 May 2007 15:40:53 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/76988</link>
        <guid>http://zyl.javaeye.com/blog/76988</guid>
      </item>
      <item>
        <title>了解jsf的架构二</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/74677" style="color:red;">http://zyl.javaeye.com/blog/74677</a>&nbsp;
          发表时间: 2007年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 接上一篇内容。这次主要分析一下jsf的相关组件包，也是jsf和structs主要不同的地方。jsf 规范中，对于组件的设计，和其他组件架构一样，分离表现层和模型层。对于组件的render由具体的Renderer来处理，这也达到了Model和 View分离的原则。<br />
&nbsp;&nbsp;&nbsp; component:所有的基本组件都在其中，如下的主要类图，对于各个组件就不一一详细介绍了。主要介绍一下几个接口：<br />
<img src="http://www.blogjava.net/images/blogjava_net/zyl/1.GIF" height="573" alt="" width="1051" src_cetemp="http://www.blogjava.net/images/blogjava_net/zyl/1.GIF" /><br />
<br />
<br />
StateHolder：用于表示在请求之间需要保存相应的状态信息,必须实现saveState和resotreState方法。<br />
ValueHolder：用于支持本地值的保持，用于访问model数据，通过表达式，支持转换。<br />
EditableValueHolder：用于表示那些可以编辑的组件值<br />
ActionSource：由UIComponet实现，用于作为ActionEvent的事件源，支持默认的ActionListener调用<br />
ActionSource2：这是最近的规范中增加的，提供了对于MethodExpression的支持。<br />
ContextCallback：用于组件执行相应的回调<br />
NamingContainer：标志接口，表示容器组件<br />
<br />
&nbsp;&nbsp;&nbsp; convert:包括了主要的Convert接口，以及内置的Convert实现类，主要的作用用于在页面值绑定时，进行类型的转换工作<br />
&nbsp;&nbsp;&nbsp; validator：主要的验证包，定义了通过的Validator接口，以及简单的几个验证类。默认情况下，jsf都是进行服务端验证，如果想需要客户 端验证，暂时从规范中，还没有找出相应的解决方案。不过现在已经是Ajax时代了，使用异步的传输，从效果上已经接近于客户端之间验证。<br />
&nbsp;&nbsp;&nbsp; event:主要的事件体系。个人觉得jsf的事件体系还是比较弱的。和强大的Swing事件体制相比，那简直差远了。而且jsf默认使用一个 ActionListener来委派所有的客户端动作触发。大多数的调用都是使用MethodExpression来进行。<br />
&nbsp;&nbsp;&nbsp; model:只是加强了对于DataTable的支持，以及SelectItems。<br />
&nbsp;&nbsp;&nbsp; render：主要的展示包，当然只是提供规范，具体由实现类提供。对于Renderer，都需要一套RenderKit.而RenderKit由 RenderKitFactory管理。ResponseStateManager，作为StateManager的帮助类，进行主要的State操作。<br />
&nbsp;&nbsp;&nbsp; 基本上，规范也就这么些东东。从整体来看，并不算太复杂。可惜现在的jsf实现实在太多了，而且各个实现并不一定兼容，导致了jsf世界的庞大。<br />
&nbsp;&nbsp;&nbsp; <br />
<br />
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/74677#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Apr 2007 16:40:40 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/74677</link>
        <guid>http://zyl.javaeye.com/blog/74677</guid>
      </item>
      <item>
        <title>了解jsf的架构 一</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/73071" style="color:red;">http://zyl.javaeye.com/blog/73071</a>&nbsp;
          发表时间: 2007年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: 14px; line-height: 30px;">&nbsp;&nbsp;&nbsp; 经过一段时间的学习，对jsf的认识也逐渐清晰。总结了一下jsf和structs的区别，首先在于分离了请求的处理。使用事件处理机制来代替原有的 request分发。其次在页面的展示上，采用组件的概念，而不是到处散落的html标记。再有，jsf对于请求的生命周期重新进行了划分，对于每个阶段 都可以派遣事件，这使得整个请求的处理比较的清晰。最后，jsf对于页面的流转使用Navigation系统来处理，这一点感觉和structs还是比较 类似的，只是换了一个概念。<br />
&nbsp;&nbsp;&nbsp; 从jsf的规范来看，jsf整个架构还是比较清晰，各个层次分的也挺明显。从总体上看，规范主要划分了application,context, lifecycle,render,component,validator,event,el几个部分，当然少不了主要的入口Servlet。有一点不 太明白，大多数的类都是抽象类而不是接口，可能是为了规定层次吧，不允许多层次继承。下面简单以下介绍各个包的功能：<br />
&nbsp;&nbsp; application:从定义上就可以看出来，这是应用级的。中间包括了Application主类，这是主要的程序入口，规范中最具有重量级的类，也 是用来连接各个模块的。jsf规范使用工厂的模式,来创建相应的实现类.当然如果需要Application的实现，需要从 ApplicationFactory中取得。除了Application类，其中还包括了ViewHandler，这个主要负责View的 Renderer调配工作。而许多jsf实现框架，如果想定义自己的行为，一般上都会使用自身的ViewHandler，如facelets。 NavigationHandler的工作，不用说已经很明显，就是用来负责页面之间的导航。包中，还包括了view状态管理类-- StateManager,主要用于恢复view，以及保存view。目前一般使用Session来保存相应的view，当然也可以使用客户端来保存。其 实，对于view状态的保存，非议还是挺多的，而且问题也比较多。<br />
&nbsp; context：包括了主要的上下文环境类，如FacesContext和ExternalContext，前者是jsf的主要Context类，包括对 message的管理，Application的取得，以及ResponseWrite的引用。后者主要类似于作为外部环境的引用类，如 ServletContext和PortletContext.ResponseWriter,主要的服务端Writer，用于输出相应的html, xml内容，所有的Renderer都需要引用此类<br />
&nbsp; lifecycle:这是jsf最大的特色，划分了请求的相应的处理阶段。规范中，只有两个类Lifecycle和LifecycleFactory。Lifecycle管理整个jsf请求的生命周期。通过指定的顺序执行相应的阶段。<br />
&nbsp; webapp:定义了主要的Servlet，FacesServlet，主要的请求分发类，用于转换相应得faces为实际的资源。在规范中， Servlet并不是主要的初始化类，jsf 的初始化工作主要由具体的实现完成。在RI实现中，基本上由ConfigureListener完成初始化工作。而Servlet的任务只是简单的传递请 求参数而已，以及调用相应的Lifecycle而已。<br />
&nbsp; 这里主要讲了jsf 的整体架构包，下一篇主要分析一下jsf相关组件的包。<br />
<br />
&nbsp; <br />
&nbsp; <br />
<br />
<br />
<br />
</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/73071#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Apr 2007 20:02:56 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/73071</link>
        <guid>http://zyl.javaeye.com/blog/73071</guid>
      </item>
      <item>
        <title>用泛型时遇到的尴尬问题</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/71710" style="color:red;">http://zyl.javaeye.com/blog/71710</a>&nbsp;
          发表时间: 2007年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 几天前遇到这么一个问题，让我郁闷了半天。当初为了方便定义了以下的一个接口：<br />
<pk serializable="" extends=""><br />
</pk>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;IBusinessObject</span><span class="keyword">《PK extends</span><span>&nbsp;Serializable&gt;&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Serializable&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;PK&nbsp;getPrimaryKey();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">void</span><span>&nbsp;setPrimaryKey(PK&nbsp;id);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
在我的子类中是这么实现的<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Code&nbsp;</span><span class="keyword">implements</span><span>&nbsp;IBusinessObject〈Long〉<long>{&nbsp;&nbsp;</long></span></span></li>
    <li class=""><span>&nbsp;<span class="keyword">private</span><span>&nbsp;Long&nbsp;primaryKey;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPrimaryKey(Long&nbsp;id){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primaryKey=id;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;<span class="keyword">public</span><span>&nbsp;Long&nbsp;getPrimaryKey(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;primaryKey&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
在通常的实例化过程中，是不会存在问题的。当时的问题是，我定义了另外一个类，用于引用Code<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestBean&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Code&nbsp;code;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCode(){...}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Code&nbsp;getCode(){...}&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
当在spring环境中时，使用spring的bind类处理的时候，发现，我的code.primaryKey的类型居然为Serializable,而不是我想要的Long<br />
当时以为其他地方搞错了，写了个简单的测试代码<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>TestBean&nbsp;b=</span><span class="keyword">new</span><span>&nbsp;TextBean();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>BeanWrapperImpl&nbsp;wrapper=<span class="keyword">new</span><span>&nbsp;BeanWrapperImpl(b);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>b.setPropertyValue(<span class="string">&quot;code.primaryKey&quot;</span><span>,</span><span class="string">&quot;1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>assertTrue(b.getCode().getPrimaryKey()&nbsp;<span class="keyword">instanceof</span><span>&nbsp;Long);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
居然是失败的。<br />
只有在<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>b.setPropertyValue(</span><span class="string">&quot;code.primaryKey&quot;</span><span>,</span><span class="keyword">new</span><span>&nbsp;Long(</span><span class="number">1</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>assertTrue(b.getCode().getPrimaryKey()&nbsp;<span class="keyword">instanceof</span><span>&nbsp;Long);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
才成功。<br />
仔细跟踪，发现原来，泛型的时候，产生的编译类中，有两个同名的方法<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPrimaryKey(Long&nbsp;id){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primaryKey=id;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;<span class="keyword">public</span><span>&nbsp;Long&nbsp;getPrimaryKey(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;primaryKey&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>和&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPrimaryKey(Serializable&nbsp;id){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primaryKey=id;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">public</span><span>&nbsp;Serializable&nbsp;getPrimaryKey(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;primaryKey&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
而java.beans规范对于这种情况是没有办法分清楚，所以也就导致了结果和预期的不同。<br />
如果是在程序中，这点算不了问题。可是我需要在web的页面上进行值的绑定，而输入的东西，只能为字符串。所以不可能出来Long类型。<br />
目前，采用了一种比较傻的办法，在TestBean中增加了一个临时变量x，通过x向code传值<br />
如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setWsCode(String&nbsp;wsCode)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.wsCode&nbsp;=&nbsp;wsCode;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(StringUtils.isNumeric(wsCode))&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.code.setPrimaryKey(NumberUtils.toLong(wsCode));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
不知道还有没有其他好的解决方案。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/71710#comments" style="color:red;">已有 <strong>8</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Apr 2007 08:23:06 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/71710</link>
        <guid>http://zyl.javaeye.com/blog/71710</guid>
      </item>
      <item>
        <title>在eclipse中使用jetty</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/70266" style="color:red;">http://zyl.javaeye.com/blog/70266</a>&nbsp;
          发表时间: 2007年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不会发图片，还是参见我在blogjava的文章：<br />
<a href="http://www.blogjava.net/zyl/archive/2007/04/12/jetty2.html">http://www.blogjava.net/zyl/archive/2007/04/12/jetty2.html</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/70266#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Apr 2007 13:51:14 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/70266</link>
        <guid>http://zyl.javaeye.com/blog/70266</guid>
      </item>
      <item>
        <title>使用jetty配置 开发web应用</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/69106" style="color:red;">http://zyl.javaeye.com/blog/69106</a>&nbsp;
          发表时间: 2007年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 一直以来使用jetty作为我的web开发配置服务器，开始的时候和所有的初学者一样使用tomcat作为开发服务器，可用着用着，感觉tomcat越来 越繁琐以及庞大。后来，用了jboss，知道jboss使用jetty作为其web应用服务器，所以就开始试着使用jetty。从那开始后，jetty就 成为我的开发配置服务器了，从最初的4.0，到现在的6.0一直在使用着。<br />
<br />
&nbsp;&nbsp; 喜欢jetty的原因，在于其的方便，简单的配置文件，简单的启动脚本，而且在elipse或者其他ide中，进行调试，运行都很方便。<br />
<br />
&nbsp;&nbsp; 不想多说什么，让事实来说话吧。在开始之前，先下载jetty。目前最新的版本为6.1:<br />
&nbsp;&nbsp; <a href="http://docs.codehaus.org/display/JETTY/Downloading+and+Installing#download" href_cetemp="http://docs.codehaus.org/display/JETTY/Downloading+and+Installing#download">http://docs.codehaus.org/display/JETTY/Downloading+and+Installing#download</a><br />
<br />
&nbsp;&nbsp; 以前的版本文件是比较小的，现在的版本增加了很多东东，主要是很多例子应用，以及源码，经过删减只有，整个应用还是比较小的，大概也就10m多了。如果只 是需要运行web应用，并且只是需要jsp 2.1规范的话，只有7m多了。以前4.0的时候只有2m多，现在也已经增加了那么多了，时代在进步，没有办法。<br />
<br />
&nbsp;&nbsp; jetty主要的jar为jetty-6.1.1.jar，servlet-api-2.5-6.1.1.jar，jetty-util- 6.1.1.jar。启动的jar 为start.jar。还有jsp规范的jar。jsp2.1,好像已经减了不少的jar了，只有4个文件core-3.1.1.jar，ant- 1.6.5.jar，jsp-2.1.jar，jsp-api-2.1.jar。core是使用eclipse的jdt，进行jsp编译。<br />
<br />
&nbsp;&nbsp; jetty的主要配置文件为etc/jetty.xml，当然你可以自己指定别的文件。在start.jar中有个start.config文件是默认的环境配置，以及指定默认的配置文件。可以手工替换。<br />
<br />
&nbsp;&nbsp; 启动jetty很简单，在命令行下面java -jar start.jar<br />
&nbsp;&nbsp; 如果需要指定start.config，使用java -DSTART=start.config -jar start.jart<br />
&nbsp;&nbsp; 配置web 应用也非常的简单：<br />
&nbsp;&nbsp; 更改jetty.xml就行了，增加web应用的方式包括，直接放置应用在webapps下面，或者配置以下的context<br />
<br />
&nbsp;&nbsp;
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="color: rgb(0, 0, 255);">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">New</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;Mywork&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.mortbay.jetty.webapp.WebAppContext&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">Ref</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;contexts&quot;</span><span class="tag">/&gt;</span><span>Arg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span>D:\\project\\work\\m2project\\esoft\\esoft-mywork-jsf\\src\\main\\webappArg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span>/myworkArg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;defaultsDescriptor&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">SystemProperty</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jetty.home&quot;</span><span>&nbsp;</span><span class="attribute">default</span><span>=</span><span class="attribute-value">&quot;.&quot;</span><span class="tag">/&gt;</span><span>/etc/webdefault.xmlSet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;virtualHosts&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Array</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.String&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Item</span><span class="tag">&gt;</span><span>localhostItem</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Array</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">New</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"></span></span></span></span></span></span></span></span></span></div>
<br />
<br />
要想改变原先的webapps主应用，改变下面的配置<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="color: rgb(0, 0, 255);">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Call</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.mortbay.jetty.webapp.WebAppContext&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;addWebApplications&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">Ref</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;contexts&quot;</span><span class="tag">/&gt;</span><span>Arg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">SystemProperty</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jetty.home&quot;</span><span>&nbsp;</span><span class="attribute">default</span><span>=</span><span class="attribute-value">&quot;.&quot;</span><span class="tag">/&gt;</span><span>/webappsArg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">SystemProperty</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jetty.home&quot;</span><span>&nbsp;</span><span class="attribute">default</span><span>=</span><span class="attribute-value">&quot;.&quot;</span><span class="tag">/&gt;</span><span>/etc/webdefault.xmlArg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;boolean&quot;</span><span class="tag">&gt;</span><span>TrueArg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;boolean&quot;</span><span class="tag">&gt;</span><span>FalseArg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;Call<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"></span></span></span></span></span></span></span></div>
<br />
<br />
默认的web.xml配置文件为webdefault.xml<br />
如果想配置相应的web参数，可以更改其应用。<br />
<br />
默认的端口为8080,如果想修改，更改：jetty.port属性<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="color: rgb(0, 0, 0);"><br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Call</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;addConnector&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Arg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">New</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.mortbay.jetty.nio.SelectChannelConnector&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;port&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">SystemProperty</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jetty.port&quot;</span><span>&nbsp;</span><span class="attribute">default</span><span>=</span><span class="attribute-value">&quot;8080&quot;</span><span class="tag">/&gt;</span><span>Set</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;maxIdleTime&quot;</span><span class="tag">&gt;</span><span>30000Set</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;Acceptors&quot;</span><span class="tag">&gt;</span><span>2Set</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">Set</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;confidentialPort&quot;</span><span class="tag">&gt;</span><span>8443Set</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;Arg<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Call<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"><span style="color: rgb(0, 0, 255);"></span></span></span></span></span></span></span></span></div>
<br />
<br />
<br />
简单的配置，简单的启动，下一篇，我会介绍，如何在eclipse中使用jetty.<br />
<br />
&nbsp;
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/69106#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Apr 2007 07:56:22 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/69106</link>
        <guid>http://zyl.javaeye.com/blog/69106</guid>
      </item>
      <item>
        <title>jsf之接触</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/68860" style="color:red;">http://zyl.javaeye.com/blog/68860</a>&nbsp;
          发表时间: 2007年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: 14px; line-height: 30px;">&nbsp;&nbsp;&nbsp; web 开发很多年了，从单纯的jsp 到struts，再到webwork，接着就是spring 的mvc。感觉jsp 的封装性，实在不怎么样。于是乎想到了组件化，以前的时候用过echo，现在是echo2,不可否认,echo的设计结构比较的不错，完全的面向对象化开 发，也没有了那些令人讨厌的jsp。不过实在受不了的就是echo的速度，echo2据说已经大幅改进，而且完全的实现了ajax。不过echo2毕竟受 关注度不是很广，还是决定放弃使用。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 于是就开始接触jsf，经过一段时间的接触，基本上了解了其中的结构，总的感觉来说，有点失望。不过作为jsr标准，还是可以期待使用，毕竟支持度比较 广。为什么struts能够这么长期的生存下去，因为用的人太多了，而且其学习的成本也相应的比较低。不过要想完全搞懂jsf，还是需要花费一些时间的。 &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; jsf目前的实现，官方的包括sun自身实现，目前的版本为1.2，据说是和jsp2.1共同推出的，做了很多的改进，最主要的方面就是el的变化，原先 的ValueBinding和MethodBinding都已经弃用。而且el已经作为jsr的标准了。用sun的实现，目前来说，还没有遇到什么不合适 的地方，至少在最新的tomcat和jetty上，我都跑通了。<br />
&nbsp;&nbsp;&nbsp; myfaces，是apach的实现，作为强有力的民间组织，apach的东东一向值得关注，最近也正在抓紧察看其api。smile一个不错的开源实现，主要的好处在于，可以用他直接舍弃jsp。直接用java去展示应用。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; jsp一向是我心中的鸡肋，很想舍去，又不想舍去。jsp 的好处在于可以快速的开发，可以马上所见即所得。当然其灾难在于后期的维护，当然如果都使用标记库封装，这种成本会变小。然而标记库，也不是万能的，有些 东西还是很难封装。使用组件化的开发，可以让一些过程变得透明化，如果说web开发，直接离开了jsp，估计还是不行的。至少美工不懂java，只懂得 html和css。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 一直以来希望能有一个框架，能够简化web的开发，能够像桌面开发来的那么畅快。&nbsp;&nbsp; 也许，java不能带来这种期待了，只能寄托于其他领域了。或许ror可以，或许.net可以。不过我还是习惯于java，习惯于标记库，习惯于jsp。</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/68860#comments" style="color:red;">已有 <strong>32</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 07 Apr 2007 08:46:24 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/68860</link>
        <guid>http://zyl.javaeye.com/blog/68860</guid>
      </item>
      <item>
        <title>关于ehcache 配置</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/68369" style="color:red;">http://zyl.javaeye.com/blog/68369</a>&nbsp;
          发表时间: 2007年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          欠了很久的文章，本来都不想发了，可还是发吧<br />
<br />
ehcache的默认配置文件名为ehcache.xml，也可以自己指定。配置文件比较的简单，基本上也就是常用的几个元素。<br />
<br />
<span style="font-weight: bold;">配置元素说明：<br />
<br />
</span>diskStore：配置DiskStore，当需要使用磁盘保存的时候，需要对象实现序列化接口<br />
<br />
&nbsp;&nbsp;&nbsp; 属性：path 配置文件存储位置，如user.home，user.dir，java.io.tmpdir<br />
<br />
cacheManagerEventListenerFactory ：指定CacheManagerEventListenerFactory，用于创建CacheManagerPeerProvider<br />
<br />
用于提醒当CacheManager中的缓存增加或者删除时。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 属性:class:完整的工厂类名称 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties:逗号分割的属性<br />
<br />
事件包括 增加cache和删除cache<br />
<br />
cacheManagerPeerProviderFactory:指定CacheManagerPeerProviderFactory，用于创建 CacheManagerPeerProvider，用于在cluster中查找CacheManagers，主要用于机群环境<br />
<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class:完整的工厂类名称<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; properties:逗号分割的属性<br />
<br />
默认的配置：<br />
&nbsp;<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">cacheManagerPeerProviderFactory</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&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;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&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;<span class="attribute">properties</span><span>=&quot;</span><span class="attribute">peerDiscovery</span><span>=</span><span class="attribute-value">automatic</span><span>,&nbsp;</span><span class="attribute">multicastGroupAddress</span><span>=</span><span class="attribute-value">230</span><span>.0.0.1,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&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;<span class="attribute">multicastGroupPort</span><span>=</span><span class="attribute-value">4446</span><span>,&nbsp;</span><span class="attribute">timeToLive</span><span>=</span><span class="attribute-value">32</span><span>&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">cacheManagerPeerProviderFactory</span><span>&nbsp;</span><span class="attribute">class</span><span>=&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&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;<span class="attribute-value">&quot;net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&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;<span class="attribute">properties</span><span>=&quot;</span><span class="attribute">peerDiscovery</span><span>=</span><span class="attribute-value">manual</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&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;<span class="attribute">rmiUrls</span><span>=//server1:40000/sampleCache1|//server2:40000/sampleCache1&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&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;//server1:40000/sampleCache2|//server2:40000/sampleCache2&quot;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
cacheManagerPeerListenerFactory：指定CacheManagerPeerListenerFactory，用于创建CacheManagerPeerListener，监听cluster中的复制信息<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class:完整的工厂类名称<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; properties:逗号分割的属性<br />
<br />
默认配置<br />
&nbsp;<br />
&nbsp;&nbsp;
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">cacheManagerPeerListenerFactory</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">properties</span><span>=&quot;</span><span class="attribute">hostName</span><span>=</span><span class="attribute-value">fully_qualified_hostname_or_ip</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">port</span><span>=</span><span class="attribute-value">40001</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">socketTimeoutMillis</span><span>=</span><span class="attribute-value">120000</span><span>&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
defaultCache: 默认缓存配置<br />
<br />
&nbsp;&nbsp;&nbsp; 必须属性：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; name:设置缓存的名称，用于标志缓存,惟一<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; maxElementsInMemory:在内存中最大的对象数量<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; maxElementsOnDisk：在DiskStore中的最大对象数量，如为0，则没有限制<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; eternal：设置元素是否永久的，如果为永久，则timeout忽略<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; overflowToDisk：是否当memory中的数量达到限制后，保存到Disk<br />
<br />
&nbsp;&nbsp;&nbsp; 可选的属性：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; timeToIdleSeconds：设置元素过期前的空闲时间<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; timeToLiveSeconds：设置元素过期前的活动时间<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; diskPersistent：是否disk store在虚拟机启动时持久化。默认为false<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; diskExpiryThreadIntervalSeconds:运行disk终结线程的时间，默认为120秒<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memoryStoreEvictionPolicy：策略关于Eviction<br />
<br />
缓存子元素：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; cacheEventListenerFactory：注册相应的的缓存监听类，用于处理缓存事件，如put,remove,update,和expire<br />
&nbsp;&nbsp;&nbsp; bootstrapCacheLoaderFactory:指定相应的BootstrapCacheLoader，用于在初始化缓存，以及自动设置。<br />
如下的例子：<br />
&nbsp;<br />
&nbsp;
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">cacheEventListenerFactory</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;net.sf.ehcache.distribution.RMICacheReplicatorFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">properties</span><span>=&quot;</span><span class="attribute">replicateAsynchronously</span><span>=</span><span class="attribute-value">true</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicatePuts</span><span>=</span><span class="attribute-value">true</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicateUpdates</span><span>=</span><span class="attribute-value">true</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicateUpdatesViaCopy</span><span>=</span><span class="attribute-value">true</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicateRemovals</span><span>=</span><span class="attribute-value">true</span><span>&nbsp;&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bootstrapCacheLoaderFactory</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">properties</span><span>=</span><span class="attribute-value">&quot;bootstrapAsynchronously=true,&nbsp;maximumChunkSizeBytes=5000000&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;<span class="tag">&lt;</span><span class="tag-name">defaultCache</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">maxElementsInMemory</span><span>=</span><span class="attribute-value">&quot;10000&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">eternal</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">timeToIdleSeconds</span><span>=</span><span class="attribute-value">&quot;120&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">timeToLiveSeconds</span><span>=</span><span class="attribute-value">&quot;120&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">overflowToDisk</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">maxElementsOnDisk</span><span>=</span><span class="attribute-value">&quot;10000000&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">diskPersistent</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">diskExpiryThreadIntervalSeconds</span><span>=</span><span class="attribute-value">&quot;120&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">memoryStoreEvictionPolicy</span><span>=</span><span class="attribute-value">&quot;LRU&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
cache配置同defaultCache<br />
&nbsp;<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">cache</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sampleDistributedCache1&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">maxElementsInMemory</span><span>=</span><span class="attribute-value">&quot;10&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">eternal</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">timeToIdleSeconds</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">timeToLiveSeconds</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">overflowToDisk</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">cacheEventListenerFactory</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;net.sf.ehcache.distribution.RMICacheReplicatorFactory&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bootstrapCacheLoaderFactory</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">cache</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
基本上都比较简单，当然也可以直接使用程序实现相应的功能
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/68369#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Apr 2007 18:39:22 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/68369</link>
        <guid>http://zyl.javaeye.com/blog/68369</guid>
      </item>
      <item>
        <title>使用ehcache</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/56558" style="color:red;">http://zyl.javaeye.com/blog/56558</a>&nbsp;
          发表时间: 2007年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br />
&nbsp;&nbsp;&nbsp; 一直以来懒得配置缓存，基本的缓存也就是orm层，基本上都交给hibernate去配置了。这段时间，感觉页面速度太慢了，还是需要使用缓存。现在的缓存工具也挺多的，较不错的属ehcache和oscache了。决定分别研究一下。<br />
&nbsp;&nbsp;&nbsp; 先来说说ehcache，目前的版本为1.2,已经支持集群了。对于ehcache的使用，感觉很容易上手，基本上都是配置。以前在hibernate的时候配置过，所以也不是很陌生。API也挺简单，如下的api：<br />
&nbsp;&nbsp;&nbsp; CacheManager主要的缓存管理类，一般一个应用为一个实例，如下<br />
&nbsp;&nbsp;&nbsp; CacheManager.create();也可以使用new CacheManager的方式创建<br />
&nbsp;&nbsp;&nbsp;&nbsp; 默认的配置文件为ehcache.xml文件，也可以使用不同的配置：<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>CacheManager&nbsp;manager&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;CacheManager(</span><span class="string">&quot;src/config/other.xml&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
&nbsp;&nbsp;&nbsp;  <br />
<br />
<strong>缓存的创建，采用自动的方式</strong><br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>CacheManager&nbsp;singletonManager&nbsp;=&nbsp;CacheManager.create();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>singletonManager.addCache(<span class="string">&quot;testCache&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Cache&nbsp;test&nbsp;=&nbsp;singletonManager.getCache(<span class="string">&quot;testCache&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<strong><br />
或者直接创建Cache</strong><br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>CacheManager&nbsp;singletonManager&nbsp;=&nbsp;CacheManager.create();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Cache&nbsp;memoryOnlyCache&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Cache(</span><span class="string">&quot;testCache&quot;</span><span>,&nbsp;</span><span class="number">5000</span><span>,&nbsp;</span><span class="keyword">false</span><span>,&nbsp;</span><span class="keyword">false</span><span>,&nbsp;</span><span class="number">5</span><span>,&nbsp;</span><span class="number">2</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>manager.addCache(memoryOnlyCache);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Cache&nbsp;test&nbsp;=&nbsp;singletonManager.getCache(<span class="string">&quot;testCache&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<strong>删除cache</strong><br />
&nbsp;<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>CacheManager&nbsp;singletonManager&nbsp;=&nbsp;CacheManager.create();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>singletonManager.removeCache(<span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
&nbsp;  <br />
<br />
<strong>在使用ehcache后，需要关闭</strong><br />
&nbsp;<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>CacheManager.getInstance().shutdown()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>caches&nbsp;的使用&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Cache&nbsp;cache&nbsp;=&nbsp;manager.getCache(<span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<strong><br />
执行crud操作</strong><br />
&nbsp;<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>Cache&nbsp;cache&nbsp;=&nbsp;manager.getCache(</span><span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Element&nbsp;element&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Element(</span><span class="string">&quot;key1&quot;</span><span>,&nbsp;</span><span class="string">&quot;value1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>cache.put(element);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>update&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Cache&nbsp;cache&nbsp;=&nbsp;manager.getCache(<span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>cache.put(<span class="keyword">new</span><span>&nbsp;Element(</span><span class="string">&quot;key1&quot;</span><span>,&nbsp;</span><span class="string">&quot;value1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//This&nbsp;updates&nbsp;the&nbsp;entry&nbsp;for&nbsp;&quot;key1&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>cache.put(<span class="keyword">new</span><span>&nbsp;Element(</span><span class="string">&quot;key1&quot;</span><span>,&nbsp;</span><span class="string">&quot;value2&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>get&nbsp;Serializable&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>Cache&nbsp;cache&nbsp;=&nbsp;manager.getCache(<span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>Element&nbsp;element&nbsp;=&nbsp;cache.get(<span class="string">&quot;key1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Serializable&nbsp;value&nbsp;=&nbsp;element.getValue();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>get&nbsp;non&nbsp;serializable&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>Cache&nbsp;cache&nbsp;=&nbsp;manager.getCache(<span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>Element&nbsp;element&nbsp;=&nbsp;cache.get(<span class="string">&quot;key1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Object&nbsp;value&nbsp;=&nbsp;element.getObjectValue();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>remove&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>Cache&nbsp;cache&nbsp;=&nbsp;manager.getCache(<span class="string">&quot;sampleCache1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>Element&nbsp;element&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Element(</span><span class="string">&quot;key1&quot;</span><span>,&nbsp;</span><span class="string">&quot;value1&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>cache.remove(<span class="string">&quot;key1&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
不过缓存还是基本上以配置方式为主，下一篇文章将会说明ehcache如何配置<br />
&nbsp;&nbsp; &nbsp;<br />
<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;<br />
          <br/><br/>
          <span style="color:red;">
            <a href="http://zyl.javaeye.com/blog/56558#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 Feb 2007 20:13:34 +0800</pubDate>
        <link>http://zyl.javaeye.com/blog/56558</link>
        <guid>http://zyl.javaeye.com/blog/56558</guid>
      </item>
      <item>
        <title>体验jibx的灵活和快速</title>
        <author>zyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyl.javaeye.com">zyl</a>&nbsp;
          链接：<a href="http://zyl.javaeye.com/blog/55991" style="color:red;">http://zyl.javaeye.com/blog/55991</a>&nbsp;
          发表时间: 2007年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br />
&nbsp;&nbsp;&nbsp; jibx又一个不错的xml绑定工具，随着这段时间的使用，感觉越来越随心应手了。和jaxb一样，都是属于xml绑定工具。不同于jaxb，jibx使用java字节码enhance技术，而jaxb更多在于源代码生成技术。jibx的工作主要在于前期，也就是进行字节码绑定，这一部分基本上都是在编译器完成的。在运行期，不需要任何的配置，由于字节码已经嵌入java类中。而jaxb更多在于运行期绑定，通过元数据或者xsd文件进行解析绑定。相对于jaxb来说，jibx更加的快速以及灵活。不过，前期的编译工作还是需要花费一点时间熟悉。下面通过一个简单的例子来说明，例子是其官方自带的。<br />
&nbsp;&nbsp;&nbsp; 首先从网上下载jibx包 http://jibx.sourceforge.net/ 为其主要的官网。<br />
&nbsp;&nbsp;&nbsp; 假设有两个类Person和Customer<br />
&nbsp;&nbsp;&nbsp; 使用最简单的方式声明：<br />
&nbsp;&nbsp;
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Customer&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Person&nbsp;person;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;street;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;city;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;state;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Integer&nbsp;zip;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;phone;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Person&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;customerNumber;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;firstName;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;lastName;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
xml 数据结构如下：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">customer</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">person</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">cust-num</span><span class="tag">&gt;</span><span>123456789</span><span class="tag">&lt;/</span><span class="tag-name">cust-num</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">first-name</span><span class="tag">&gt;</span><span>John</span><span class="tag">&lt;/</span><span class="tag-name">first-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">last-name</span><span class="tag">&gt;</span><span>Smith</span><span class="tag">&lt;/</span><span class="tag-name">last-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">person</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">street</span><span class="tag">&gt;</span><span>12345&nbsp;Happy&nbsp;Lane</span><span class="tag">&lt;/</span><span class="tag-name">street</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">city</span><span class="tag">&gt;</span><span>Plunk</span><span class="tag">&lt;/</span><span class="tag-name">city</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">state</span><span class="tag">&gt;</span><span>WA</span><span class="tag">&lt;/</span><span class="tag-name">state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">zip</span><span class="tag">&gt;</span><span>98059</span><span class="tag">&lt;/</span><span class="tag-name">zip</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">phone</span><span class="tag">&gt;</span><span>888.555.1234</span><span class="tag">&lt;/</span><span class="tag-name">phone</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">customer</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
&nbsp;<br />
为了匹配相应的数据，jibx需要相应的映射文档，用于匹配java类和xml数据，如下：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">binding</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;customer&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.jibx.starter.Customer&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">structure</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;person&quot;</span><span>&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">&quot;person&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;cust-num&quot;</span><span>&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">&quot;customerNumber&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;first-name&quot;</span><span>&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">&quot;firstName&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;last-name&quot;</span><span>&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">&quot;lastName&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">structure</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&