<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Tapestry</title>
    <description>致力于Tapestry的最佳应用
欢迎大家加入Tapestry圈子
http://tapestrying.javaeye.com</description>
    <link>http://tapestry.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>在netbeans中建立完整的Tapestry5开发环境</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/193497" style="color:red;">http://tapestry.javaeye.com/blog/193497</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天看到篇<a href="http://www.troymaxventures.com/2008/05/tapestry5-netbeans-quickstart.html">文章</a>
介绍了如何在netbeans中使用maven调用tapestry5-quickstart模块来开发tapestry5，这里再总结下，并介绍些技巧。
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先当然是要安装好netbeans了，我一般下载<a href="http://dlc.sun.com.edgesuite.net/netbeans/6.1/final/zip/">zip版</a>
的javase packs，版本为6.1，插件都是自己按照需要来安装，我们要用到maven，就要先下载maven的netbeans插件，如图搜索maven，选择maven插件，单击install，接受协议，就可以下载安装了。</p>
<p> 安装maven插件</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/maven.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/maven_thumb.png" border="0" alt="maven" width="600" height="417" />
</a>
</p>
<p> 我们要开发的是web程序，需要netbeans支持web程序的开发，这就需要安装web applications插件了，如图搜索web applications，选择web applications插件，单击install，接受协议，就可以下载安装了。</p>
<p>&nbsp;&nbsp; 安装web applications插件</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/webapplications.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/webapplications_thumb.png" border="0" alt="webapplications" width="600" height="417" />
</a>
 </p>
<p> 两个插件安装好了后，就可以新建tapestry5-quickstart项目了，单击菜单File-&gt;New
Project，如图选择Maven-&gt;Maven
Project。(中文系统默认maven插件为中文环境，开发时不喜欢中文环境，在netbeans.conf配置文件中添加了&ndash;locale
en改成英文环境了，这里以英文环境为准。)</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/newproject.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/newproject_thumb.png" border="0" alt="newproject" width="600" height="438" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择Maven Project后，单击下一步，展开Archetypes from remote Maven repositories,如图所示，选择Tapestry5 quickstart archetype。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/quickstart.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/quickstart_thumb.png" border="0" alt="quickstart" width="605" height="480" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择Tapestry5 quickstart archetype后，单击下一步，如图填一些定制的参数后，单击完成。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/parameters.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/parameters_thumb.png" border="0" alt="parameters" width="600" height="362" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maven插件会下载依赖库并根据定制的参数新建项目，项目建好后，如图所示文件结构。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/file.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/file_thumb.png" border="0" alt="file" width="600" height="376" />
</a>
 </p>
<p> 运行项目需要web
server，这里我选择了maven中的jetty插件，想让项目运行时运行jetty，这就需要修改运行项目时执行的maven命令，选择项目后，右
键选择properties，选择Actions,在actions列表中选择run project，如图所示，修改Excute
Goals为jetty:run。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/jettyrun.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/jettyrun_thumb.png" border="0" alt="jettyrun" width="600" height="421" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样我们运行项目就可以直接将项目部署到jetty并启动jetty了，单击工具栏上的Run Main Project(快捷键F6)，第一次运行maven会下载需要的插件，下载完会启动jetty，这时访问<a href="http://localhost:8080/">http://localhost:8080</a>
，可以看到如图所示页面。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/run.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/run_thumb.png" border="0" alt="run" width="600" height="444" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单击我们部署的项目mavenproject1，可以看到项目成功运行,如图所示。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/mavenproject1.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/mavenproject1_thumb.png" border="0" alt="mavenproject1" width="600" height="444" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;
这时编辑页面模板并保存，刷新页面会立即看到结果，我们知道Tapestry5支持类的自动重加载的，在修改页面类文件后保存，刷新页面并没有看到修改后
的结果，其实这里需要编译类文件，同样我可以通过定制Build Project的maven命令来编译项目，如图所示，修改build
project中Excute Goals为compiler:compile。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/build.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/build_thumb.png" border="0" alt="build" width="600" height="453" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这样我们编辑完类文件保存后，就可以通过单击工具栏上的Build Main Project(快捷键F11)来编译项目了，这时刷新页面就可以看到修改后的结果。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/toolbar.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/toolbar_thumb.png" border="0" alt="toolbar" width="600" height="387" />
</a>
</p>
<p>&nbsp;&nbsp;&nbsp;
到这里已经可以开发Tapestry5项目了，可是打开tml文件，什么语法加亮都没有，这就要修改netbeans配置，来让netbeans支持
tml文件，选择菜单Tools-&gt;Options，在打开的窗口左下角单击Advance Options按钮，打开IDE
Configuration-&gt;System-&gt;Object Types,选择HTML Objects,在选项Extension
and MIME
Types中，单击右边按钮，打开配置对话框，在Item输入框中输入tml，单击Add，加入到下边的列表后，单击ok保存设置，如图所示。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/tml.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/tml_thumb.png" border="0" alt="tml" width="600" height="414" />
</a>
 </p>
<p> 这时就可以看到Index.tml已经被系统识别为HTML Objects了，打开文件可以像编辑html一样编辑tml文件了，netbeans支持html的语法加亮和基本的元素选择，如图所示。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/html.png"><img style="border: 0px none;" src="http://www.tapestry5.com/images/netbeansTapestry5_13712/html_thumb.png" border="0" alt="html" width="600" height="387" />
</a>
 </p>
<p> 这样就可以在netbeans中建立起完整的Tapetry5开发环境了， netbean中的插件现在已经很好很全了，对javascript和css也支持的很好，虽然比不上DW，但已经很不错了，希望netbeans越来越好。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转载请注明出处Tapestry5.com</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/193497#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 00:09:24 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/193497</link>
        <guid>http://tapestry.javaeye.com/blog/193497</guid>
      </item>
          <item>
        <title>Tapestry5-如何在根目录下加载组件模板</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/193114" style="color:red;">http://tapestry.javaeye.com/blog/193114</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T5默认的组件模板是从WEB-INF目录加载的，实际开发中，希望组件模板可以放在根目录，例如组件类目录package.components.layout.DefaultLayout,对应的模板为layout/DefaultLayout.tml。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T5的模板加载是通过PageTemplateLocator加载的，我们可以通过覆盖这个Service的实现来达到我们的目的，首先是实现类：</p>
<div class="hl-surround"><ol class="hl-main ln-hide" title="Double click to show line number." ondblclick="linenumber(this)">
<li class="hl-firstline"><span style="color: green;">import</span>
<span style="color: gray;"> </span>
<span class="hl-types">static</span>
<span style="color: gray;"> </span>
<span style="color: blue;">java</span>
<span style="color: gray;">.</span>
<span style="color: blue;">lang</span>
<span style="color: gray;">.</span>
<span style="color: blue;">String</span>
<span style="color: gray;">.</span>
<span style="color: blue;">format</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: green;">import</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">java</span>
<span style="color: gray;">.</span>
<span style="color: blue;">util</span>
<span style="color: gray;">.</span>
<span style="color: blue;">Locale</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: green;">import</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">org</span>
<span style="color: gray;">.</span>
<span style="color: blue;">apache</span>
<span style="color: gray;">.</span>
<span style="color: blue;">tapestry</span>
<span style="color: gray;">.</span>
<span style="color: blue;">internal</span>
<span style="color: gray;">.</span>
<span style="color: blue;">InternalConstants</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: green;">import</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">org</span>
<span style="color: gray;">.</span>
<span style="color: blue;">apache</span>
<span style="color: gray;">.</span>
<span style="color: blue;">tapestry</span>
<span style="color: gray;">.</span>
<span style="color: blue;">internal</span>
<span style="color: gray;">.</span>
<span style="color: blue;">services</span>
<span style="color: gray;">.</span>
<span style="color: blue;">PageTemplateLocator</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: green;">import</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">org</span>
<span style="color: gray;">.</span>
<span style="color: blue;">apache</span>
<span style="color: gray;">.</span>
<span style="color: blue;">tapestry</span>
<span style="color: gray;">.</span>
<span style="color: blue;">ioc</span>
<span style="color: gray;">.</span>
<span style="color: blue;">Resource</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: green;">import</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">org</span>
<span style="color: gray;">.</span>
<span style="color: blue;">apache</span>
<span style="color: gray;">.</span>
<span style="color: blue;">tapestry</span>
<span style="color: gray;">.</span>
<span style="color: blue;">model</span>
<span style="color: gray;">.</span>
<span style="color: blue;">ComponentModel</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: green;">public</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: green;">class</span>
<span style="color: gray;"> </span>
<span style="color: blue;">ContextRootTemplateLocator</span>
<span style="color: gray;"> </span>
<span style="color: green;">implements</span>
<span style="color: gray;"> </span>
<span style="color: blue;">PageTemplateLocator</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">private</span>
<span style="color: gray;">&nbsp;</span>
<span class="hl-types">final</span>
<span style="color: gray;"> </span>
<span style="color: blue;">Resource</span>
<span style="color: gray;"> </span>
<span style="color: blue;">contextRoot</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">private</span>
<span style="color: gray;">&nbsp;</span>
<span class="hl-types">final</span>
<span style="color: gray;"> </span>
<span style="color: blue;">String</span>
<span style="color: gray;"> </span>
<span style="color: blue;">compomentPackage</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">private</span>
<span style="color: gray;">&nbsp;</span>
<span class="hl-types">final</span>
<span style="color: gray;"> </span>
<span style="color: blue;">String</span>
<span style="color: gray;"> </span>
<span style="color: blue;">pagePackage</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">public</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">ContextRootTemplateLocator</span>
<span style="color: olive;">(</span>
<span style="color: blue;">Resource</span>
<span style="color: gray;"> </span>
<span style="color: blue;">contextRoot</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">String</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">appRootPackage</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">this</span>
<span style="color: gray;">.</span>
<span style="color: blue;">contextRoot</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">contextRoot</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">this</span>
<span style="color: gray;">.</span>
<span style="color: blue;">compomentPackage</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">appRootPackage</span>
<span style="color: gray;"> + </span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: red;">.</span>
<span style="color: #8b0000;">&quot;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + </span>
<span style="color: blue;">InternalConstants</span>
<span style="color: gray;">.</span>
<span style="color: blue;">COMPONENTS_SUBPACKAGE</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">this</span>
<span style="color: gray;">.</span>
<span style="color: blue;">pagePackage</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">appRootPackage</span>
<span style="color: gray;"> + </span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: red;">.</span>
<span style="color: #8b0000;">&quot;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + </span>
<span style="color: blue;">InternalConstants</span>
<span style="color: gray;">.</span>
<span style="color: blue;">PAGES_SUBPACKAGE</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">public</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">Resource</span>
<span style="color: gray;"> </span>
<span style="color: blue;">findPageTemplateResource</span>
<span style="color: olive;">(</span>
<span style="color: blue;">ComponentModel</span>
<span style="color: gray;"> </span>
<span style="color: blue;">model</span>
<span style="color: gray;">, </span>
<span style="color: blue;">Locale</span>
<span style="color: gray;"> </span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">String</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">className</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">model</span>
<span style="color: gray;">.</span>
<span style="color: blue;">getComponentClassName</span>
<span style="color: olive;">()</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">if</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: olive;">(</span>
<span style="color: blue;">className</span>
<span style="color: gray;">.</span>
<span style="color: blue;">contains</span>
<span style="color: olive;">(</span>
<span style="color: blue;">pagePackage</span>
<span style="color: olive;">))</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">findPageTemplateResourceDelegate</span>
<span style="color: olive;">(</span>
<span style="color: blue;">className</span>
<span style="color: gray;">, </span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">if</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: olive;">(</span>
<span style="color: blue;">className</span>
<span style="color: gray;">.</span>
<span style="color: blue;">contains</span>
<span style="color: olive;">(</span>
<span style="color: blue;">compomentPackage</span>
<span style="color: olive;">))</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">findComponentTemplateResourceDelegate</span>
<span style="color: olive;">(</span>
<span style="color: blue;">className</span>
<span style="color: gray;">, </span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: green;">null</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">private</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">Resource</span>
<span style="color: gray;"> </span>
<span style="color: blue;">findPageTemplateResourceDelegate</span>
<span style="color: olive;">(</span>
<span style="color: blue;">String</span>
<span style="color: gray;"> </span>
<span style="color: blue;">className</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">Locale</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">String</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">logicalName</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">className</span>
<span style="color: gray;">.</span>
<span style="color: blue;">substring</span>
<span style="color: olive;">(</span>
<span style="color: blue;">pagePackage</span>
<span style="color: gray;">.</span>
<span style="color: blue;">length</span>
<span style="color: olive;">()</span>
<span style="color: gray;"> + </span>
<span style="color: maroon;">1</span>
<span style="color: olive;">)</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .</span>
<span style="color: blue;">replace</span>
<span style="color: olive;">(</span>
<span style="color: #8b0000;">'</span>
<span style="color: red;">.</span>
<span style="color: #8b0000;">'</span>
<span style="color: gray;">, </span>
<span style="color: #8b0000;">'</span>
<span style="color: red;">/</span>
<span style="color: #8b0000;">'</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">locateFile</span>
<span style="color: olive;">(</span>
<span style="color: blue;">logicalName</span>
<span style="color: gray;">, </span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">private</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">Resource</span>
<span style="color: gray;"> </span>
<span style="color: blue;">findComponentTemplateResourceDelegate</span>
<span style="color: olive;">(</span>
<span style="color: blue;">String</span>
<span style="color: gray;"> </span>
<span style="color: blue;">className</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">Locale</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">String</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">logicalName</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">className</span>
<span style="color: gray;">.</span>
<span style="color: blue;">substring</span>
<span style="color: olive;">(</span>
<span style="color: blue;">compomentPackage</span>
<span style="color: gray;">.</span>
<span style="color: blue;">length</span>
<span style="color: olive;">()</span>
<span style="color: gray;"> + </span>
<span style="color: maroon;">1</span>
<span style="color: olive;">)</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .</span>
<span style="color: blue;">replace</span>
<span style="color: olive;">(</span>
<span style="color: #8b0000;">'</span>
<span style="color: red;">.</span>
<span style="color: #8b0000;">'</span>
<span style="color: gray;">, </span>
<span style="color: #8b0000;">'</span>
<span style="color: red;">/</span>
<span style="color: #8b0000;">'</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">locateFile</span>
<span style="color: olive;">(</span>
<span style="color: blue;">logicalName</span>
<span style="color: gray;">, </span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">private</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">Resource</span>
<span style="color: gray;"> </span>
<span style="color: blue;">locateFile</span>
<span style="color: olive;">(</span>
<span style="color: blue;">String</span>
<span style="color: gray;"> </span>
<span style="color: blue;">logicalName</span>
<span style="color: gray;">, </span>
<span style="color: blue;">Locale</span>
<span style="color: gray;"> </span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">String</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">path</span>
<span style="color: gray;"> = </span>
<span style="color: blue;">format</span>
<span style="color: olive;">(</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: red;">%s.%s</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: gray;">, </span>
<span style="color: blue;">logicalName</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">InternalConstants</span>
<span style="color: gray;">.</span>
<span style="color: blue;">TEMPLATE_EXTENSION</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">contextRoot</span>
<span style="color: gray;">.</span>
<span style="color: blue;">forFile</span>
<span style="color: olive;">(</span>
<span style="color: blue;">path</span>
<span style="color: olive;">)</span>
<span style="color: gray;">.</span>
<span style="color: blue;">forLocale</span>
<span style="color: olive;">(</span>
<span style="color: blue;">locale</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: olive;">}</span>
</li>
</ol>
</div>
<p>在module中设置覆盖掉默认的PageTemplateLocator实现</p>
<div class="hl-surround"><ol class="hl-main ln-hide" title="Double click to show line number." ondblclick="linenumber(this)">
<li class="hl-firstline"><span style="color: green;">public</span>
<span style="color: gray;"> </span>
<span style="color: blue;">PageTemplateLocator</span>
<span style="color: gray;"> </span>
<span style="color: blue;">buildContextRootTemplateLocator</span>
<span style="color: olive;">(</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @</span>
<span style="color: blue;">InjectService</span>
<span style="color: olive;">(</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: red;">ContextAssetFactory</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: olive;">)</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">AssetFactory</span>
<span style="color: gray;"> </span>
<span style="color: blue;">contextAssetFactory</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @</span>
<span style="color: blue;">Inject</span>
<span style="color: gray;"> @</span>
<span style="color: blue;">Symbol</span>
<span style="color: olive;">(</span>
<span style="color: blue;">InternalConstants</span>
<span style="color: gray;">.</span>
<span style="color: blue;">TAPESTRY_APP_PACKAGE_PARAM</span>
<span style="color: olive;">)</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">String</span>
<span style="color: gray;"> </span>
<span style="color: blue;">appRootPackage</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: green;">return</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: green;">new</span>
<span style="color: gray;"> </span>
<span style="color: blue;">ContextRootTemplateLocator</span>
<span style="color: olive;">(</span>
<span style="color: blue;">contextAssetFactory</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .</span>
<span style="color: blue;">getRootResource</span>
<span style="color: olive;">()</span>
<span style="color: gray;">, </span>
<span style="color: blue;">appRootPackage</span>
<span style="color: olive;">)</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
<li><span style="color: gray;">&nbsp;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; @</span>
<span style="color: blue;">SuppressWarnings</span>
<span style="color: olive;">(</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: red;">unchecked</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: olive;">)</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: green;">public</span>
<span style="color: gray;">&nbsp;</span>
<span class="hl-types">static</span>
<span style="color: gray;"> </span>
<span class="hl-types">void</span>
<span style="color: gray;"> </span>
<span style="color: blue;">contributeAlias</span>
<span style="color: olive;">(</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">Configuration</span>
<span style="color: gray;">&lt;</span>
<span style="color: blue;">AliasContribution</span>
<span style="color: gray;">&gt; </span>
<span style="color: blue;">configuration</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @</span>
<span style="color: blue;">InjectService</span>
<span style="color: olive;">(</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: red;">ContextRootTemplateLocator</span>
<span style="color: #8b0000;">&quot;</span>
<span style="color: olive;">)</span>
<span style="color: gray;">&nbsp;</span>
<span style="color: blue;">PageTemplateLocator</span>
<span style="color: gray;"> </span>
<span style="color: blue;">contextRootTemplateLocator</span>
<span style="color: olive;">)</span>
<span style="color: gray;"> </span>
<span style="color: olive;">{</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">configuration</span>
<span style="color: gray;">.</span>
<span style="color: blue;">add</span>
<span style="color: olive;">(</span>
<span style="color: blue;">AliasContribution</span>
<span style="color: gray;">.</span>
<span style="color: blue;">create</span>
<span style="color: olive;">(</span>
<span style="color: blue;">PageTemplateLocator</span>
<span style="color: gray;">.</span>
<span style="color: green;">class</span>
<span style="color: gray;">,</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
<span style="color: blue;">contextRootTemplateLocator</span>
<span style="color: olive;">))</span>
<span style="color: gray;">;</span>
</li>
<li><span style="color: gray;">&nbsp; &nbsp; </span>
<span style="color: olive;">}</span>
</li>
</ol>
</div>
<p>这样就可以在根目录下加载组件类的模板了。</p>
<p>转载请注明出处tapestry5.com。</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/193114#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 22:52:31 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/193114</link>
        <guid>http://tapestry.javaeye.com/blog/193114</guid>
      </item>
          <item>
        <title>Tapestry5每日播报(20080512)</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/192400" style="color:red;">http://tapestry.javaeye.com/blog/192400</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.介绍Tapestry5的新文章发布<a href="http://www.infoq.com/articles/tapestry5-intro"><span style="color: #285ab5;">Tapestry for Nonbelievers</span>
</a>
，写的很好，推荐大家阅读。</p>
<p>2.邮件列表<a href="http://www.nabble.com/T5.0.11:-onActivate()-called-twice,-more-questions-td17184571s302.html"><span style="color: #285ab5;">T5.0.11: onActivate() called twice, more 
questions</span>
</a>
，问题跟Tapesetry5的路径问题有关，这个也是一直困扰我的地方，例如生成的url为</p>
<p><span style="color: #285ab5;">http://localhost:8607/myApp/start/testmessage</span>
,图像路径为myApp/images/image.jpg,如果使用相对路径&lt;img 
src=&quot;images/image.jpg&quot;/&gt;,生成的图片url则为</p>
<p><span style="color: #285ab5;">http://localhost:8607/myApp/start/images/image.jpg</span>
<a href="http://localhost:8607/myApp/start/images/image.jpg,%E6%94%B9%E4%B8%BA">
</a>
 
改为&lt;img src=&quot;/images/image.jpg&quot;/&gt;则可正常显示，也就是说开发的应用只能放在根目录，无法部署到目录中，</p>
<p>不知道有没有什么两全的方式解决。</p>
<p>3.邮件列表<a href="http://www.nabble.com/T5:-select-within-table-grid-td17145791s302.html">T5: 
Calling method with parameter in 
prop</a>
，在T4升级到T5的过程中，碰到了prop中无法执行函数的问题，T5Components中有个<a href="http://87.193.218.134:8080/t5components/t5c-commons/howto_ognlbinding.html">ognl 
binding</a>
，可以重新使用ognl取值。</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/192400#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 12 May 2008 22:30:16 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/192400</link>
        <guid>http://tapestry.javaeye.com/blog/192400</guid>
      </item>
          <item>
        <title>Tapestry5开发系列:如何在Eclipse中运行jetty</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/191803" style="color:red;">http://tapestry.javaeye.com/blog/191803</a>&nbsp;
          发表时间: 2008年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="margin: 0cm 0cm 0pt; text-indent: 21pt;" dir="ltr">
   Jetty是个类似tomcat的web server，体积小、启动快、可内嵌，开发中使用起来很方便，eclipse的插件中支持jetty的有个<a href="http://jettylauncher.sourceforge.net/">jettylauncher</a>
，可jettylauncher只支持eclipse2.x/jetty5.x(有人hack了代码，可以支持高版本的eclipse，但还是支持不了jetty6.x)。现在支持jetty6的有个<a href="http://code.google.com/p/run-jetty-run/">runjettyrun</a>
插件，支持最新版本的eclipse和jetty，而且其本身就自带jetty6，不需要单独下载和配置jetty了，runjettyrun插件的安装和使用请参考<a href="http://code.google.com/p/run-jetty-run/wiki/GettingStarted">这里</a>
。
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
   我在使用Runjettyrun运行tapestry5开发的程序时，碰到了些问题，具体的问题和解决方法如下。
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
   问题1、默认runjettyrun的配置运行时，控制台没任何提示，其本身也没有运行起来。
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
   解决方法：在配置中，选择classpath标签，在user entries中删除掉项目本身，如图所示：<a href="http://www.tapestry5.com/images/runjettyrun.jpg"><img src="http://www.tapestry5.com/images/runjettyrun.jpg" alt="" width="580" />
</a>
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
   问题2、问题1解决后，再次运行会提示找不到类javax.servlet.http.HttpServletRequest，这个简单添加个servlet.jar就可以了。
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
好了，jetty可以运行了，还有个配置时开发中一定要加的，tapestry5有个production-mode，默认的为true，可以在作为产品
发布时，提供精简的错误信息，在开发时，异常信息当然是越精确越好，而且精确的异常信息也是tapestry的强项，可以很准确的告诉您错误出在哪里，所
以在开发时这个选项要关掉，选中运行配置中的arguments标签，在vm<br />
   arguments中添加-Dtapestry.production-mode=false，如下图所示：<a href="http://www.tapestry5.com/images/runjettyrunarguments.jpg"><img src="http://www.tapestry5.com/images/runjettyrunarguments.jpg" alt="" width="580" />
</a>
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
   这样就可以打开详细的错误信息报告了，Tapestry5有更改页面和组件类不需要重启服务器的特性，运行jetty后，就像用script语言开发一样，尽情享受开发的乐趣吧。
</p>
<p>转载请注明出处www.tapestry5.com,拜托将图片配置好，谢谢。</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/191803#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 May 2008 22:39:59 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/191803</link>
        <guid>http://tapestry.javaeye.com/blog/191803</guid>
      </item>
          <item>
        <title>Tapestry5每日播报(20080509)</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/191500" style="color:red;">http://tapestry.javaeye.com/blog/191500</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry5每日播报(20080509)<br /><br />1.变量命名中的下划线正在被移除，具体原因看下作者<a href="http://www.nabble.com/why-leading-underscores-removed---td17110425s302.html" target="_blank">解释</a>。<br /><br />PS:终于去掉下划线了，其实各有利弊，我是不用的，那个wrap作者在<a href="http://www.jroller.com/$entry.website.user.userName/entry/things_i_dont_like_about" target="_blank">为什么不喜欢Tapestry5</a>的文章里也提到了这点。<br /><br />2.邮件列表里有人问道<a href="http://www.nabble.com/Tapestry-5-Release-Date-%28not-beta%29-td17118982s302.html" target="_blank">Tapestry5什么时候能够release</a>，作者回答说估计下个周可以。<br /><br />3.作者在<a href="http://tapestryjava.blogspot.com/2008/05/improvements-to-tapestry-5-tutorial.html" target="_blank">blog</a>中提到更新了Tapestry5的官方教程，<a href="http://tapestry.formos.com/nightly/tapestry5/tutorial1/" target="_blank">查看新教程</a>。<br /><br /><br /><br />每日播报的信息来自于邮件列表，信息同时发布于<a href="http://www.tapestry5.com" target="_blank">Tapestry5.com</a>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/191500#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 17:12:58 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/191500</link>
        <guid>http://tapestry.javaeye.com/blog/191500</guid>
      </item>
          <item>
        <title>Tapesetry5随笔</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/158848" style="color:red;">http://tapestry.javaeye.com/blog/158848</a>&nbsp;
          发表时间: 2008年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul><li>Form组件直接可以接受参数</li>tml:&lt;form t:type="Form" t:id="loginForm" t:context="name"><br />java:void onSuccessFromClubPlayerForm(String idPlayer){}<li>@Retain其实相当于页面中的application范围的值，可在取值时初始化，初始化好后保存</li>于页面实例中，请求结束后不清除，常用于SelectModel之类。<br />       @Retain<br />	private List&lt;String> names;<br /><br />	public List&lt;String> getNames() {<br />		if (names== null) {<br />			names = Arrays.asList("one","two","three");<br />		}<br />		return names;<br />	}<br /></ul>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/158848#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jan 2008 21:51:07 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/158848</link>
        <guid>http://tapestry.javaeye.com/blog/158848</guid>
      </item>
          <item>
        <title>使dreamweaver支持tml扩展名</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/141874" style="color:red;">http://tapestry.javaeye.com/blog/141874</a>&nbsp;
          发表时间: 2007年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry从5.0.6开始使用tml作为模板文件的扩展名，dreamveaver无法识别tml文件，在网上找了些资料，参考了<a href="http://blog.chinaunix.net/u/13637/showart.php?id=394894" target="_blank">http://blog.chinaunix.net/u/13637/showart.php?id=394894</a>这篇文章，终于可以像修改html文件一样修改tml文件了，现修改整理如下：<br />1、使Dreamweaver能识别*.tmp文件，并当做html页面来处理，需要修改两个文件，<br />   (1)Extensions.txt------位于你的用户目录下，位于dreamveaver安装目录下的configuration文件夹下。<br />   (2)MMDocumentTypes.xml----位于dreamveaver安装目录下的configuration\DocumentTypes文件夹下<br />2、用编辑器打开Extens.txt,使用替换功能，把XHTML替换成XHTM，TMP。替换应该只有两处，一处是所有文档里面；另一处是第二行，:HTML 文档中。需要注意的是，文档类型要用大写，如TMP，而不是tmp。保存退出。<br />修改后的文件前两行如下<br />HTM,HTML,SHTM,SHTML,HTA,HTC,XHTML<span style="color: red">,TML</span>,STM,SSI,JS,AS,ASC,ASR,XML,XSL,XSD,DTD,XSLT,RSS,RDF,LBI,DWT,ASP,ASA,ASPX,ASCX,ASMX,CONFIG,CS,CSS,CFM,CFML,CFC,TLD,TXT,PHP,PHP3,PHP4,PHP5,JSP,WML,TPL,LASSO,JSF,VB,VBS,VTM,VTML,INC,JAVA,EDML,MASTER:所有文档<br />HTM,HTML,HTA,HTC,XHTML<span style="color: red">,TML</span>:HTML 文档<br />3、用编辑器打开MMDocumentTypes.xml，找到下面部分，并添加tml，修改后如下：<br />&lt;documenttype id="HTML" internaltype="HTML" winfileextension="html,htm,shtml,shtm,stm,tpl,lasso,xhtml<span style="color: red">,tml</span>" macfileextension="html,htm,shtml,shtm,tpl,lasso,xhtml,ssi<span style="color: red">,tml</span>" file="Default.html" writebyteordermark="false"><br />保存退出。winfileextension指的是在windows系统中的扩展，macfileextension是mac os系统中的扩展<br />4、如果你想使DW成为*.tml的默认编辑器，就可以把*.tml文件和DW默认关联起来，方法就是打开编辑->首选参数->文件类型\编辑器，找到*.tml扩展名，如果没有就新建一个，然后“更改”，找到DW，就把两者关联起来了，<br />    经过这样设置，DW就可以识别*.tml文件，并当作*.html来处理。
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/141874#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 19 Nov 2007 21:56:16 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/141874</link>
        <guid>http://tapestry.javaeye.com/blog/141874</guid>
      </item>
          <item>
        <title>Tapestry4.1.x中内置的ajax(不用写任何的javascript)</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/106066" style="color:red;">http://tapestry.javaeye.com/blog/106066</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry4.1.x中内置dojo实现ajax功能，不用写任何的javascript就可以实现，<br />具体步骤如下。<br />1、用Shell组件包含进dojo，Shell组件会自动配置dojo包。<br /><pre name="code" class="java">&lt;html jwcid="@Shell" title="Basic Ajax Page">
&lt;body jwcid="@Body">

    &lt;p>Basic javascript inclusion sample.&lt;/p>

&lt;/body>
&lt;/html></pre><br />2、使用updateComponents参数<br />这个参数已经在很多组件里实现，加上这个参数就可以实现ajax了，例如组件<br />DirectLink, LinkSubmit, Form, ImageSubmit and Submit，你只要告诉它要<br />更新哪些部分或者组件就可以了，jwcid="time@Insert"这种取id为time，你也<br />可以将你需要更新的部分使用Any组件包含起来，例如<br /><pre name="code" class="java">&lt;div jwcid="ajax@Any">update me&lt;/div></pre>，同样这时的Id为ajax，而且你可以<br />更新多个，例如updateComponents="time,ajax"。<br /><pre name="code" class="java">&lt;html jwcid="@Shell" title="Basic Ajax Page">
&lt;body jwcid="@Body">

&lt;p>Basic javascript inclusion sample.&lt;/p>

&lt;p>&lt;a jwcid="@DirectLink" listener="listener:onRefreshTime" updateComponents="time">Refresh time&lt;/a>.&lt;/p>

&lt;div jwcid="time@Insert" value="ognl:time" renderTag="true" />

&lt;/body>
&lt;/html></pre><br />3、普通的Tapestry Page类<br /><pre name="code" class="java">public abstract BasicAjax extends BasePage {

    public abstract void setTime(Date time);

    public void onRefreshTime()
    {
        setTime(new java.util.Date());
    }
}</pre><br /><br />没了，已经可以运行了。<br /><br />修订：修改了listener函数名称，谢谢8楼。
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/106066#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 27 Jul 2007 11:20:52 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/106066</link>
        <guid>http://tapestry.javaeye.com/blog/106066</guid>
      </item>
          <item>
        <title>Tapestry4常用的注入对象</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/101332" style="color:red;">http://tapestry.javaeye.com/blog/101332</a>&nbsp;
          发表时间: 2007年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          注入方式：<br />@InjectObject("service:tapestry.globals.HttpServletResponse")<br />public abstract HttpServletResponse getServletResponse();<br /><br />service一览：<br />tapestry.globals.HttpServletRequest<br />tapestry.globals.HttpServletResponse<br />tapestry.globals.ServletContext<br />tapestry.globals.ApplicationGlobals<br />tapestry.globals.IRequestCycle<br />tapestry.globals.RequestGlobals<br />tapestry.globals.SetupServletApplicationGlobals<br />tapestry.globals.WebContext<br />tapestry.globals.WebRequest<br />tapestry.globals.WebResponse
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/101332#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jul 2007 21:50:51 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/101332</link>
        <guid>http://tapestry.javaeye.com/blog/101332</guid>
      </item>
          <item>
        <title>新版Tapestry4.1.2在性能上的提升</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/94748" style="color:red;">http://tapestry.javaeye.com/blog/94748</a>&nbsp;
          发表时间: 2007年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、<strong>ognl2.7带来的性能上的提升</strong><br />这个版本应该早就该释出的，一直在等ognl2.7版本的稳定，不过这也是值得的，ognl2.7带来性能上的提升是可观的。在Tapestry4.1.2投票的时候就测试出跟Tapestry-prop不兼容，但ognl采用了跟prop一样的javassist增强来实现，应该说ognl在性能上跟prop差不了多少了（没实际测试，只是从理论上来说），而且ognl提供了更多的功能，Tapestry4.1.x版本的prop可以放弃了（T5中已经默认为prop了，那个prop跟T4的不一样，题外话），关于prop跟ognl老版本的性能测试可以参考这里(<a href="http://tapestryjava.blogspot.com/2006/11/improve-tapestry-performance-with.html" target="_blank">http://tapestryjava.blogspot.com/2006/11/improve-tapestry-performance-with.html</a>)，tapestry-prop主页也有对比(<a href="http://howardlewisship.com/tapestry-javaforge/tapestry-prop/" target="_blank">http://howardlewisship.com/tapestry-javaforge/tapestry-prop/</a>)，新版本ognl跟旧版本的性能对比参考这里：(<a href="http://blog.opencomponentry.com/2007/01/14/new-ognl-release-on-the-horizon-its-faster/)" target="_blank">http://blog.opencomponentry.com/2007/01/14/new-ognl-release-on-the-horizon-its-faster/)</a>。<br />二、<strong>使用softReference的PagePool</strong><br />Tapestry4.x版本中有一个PagePool的bug（<a href="https://issues.apache.org/jira/browse/TAPESTRY-1151" target="_blank">https://issues.apache.org/jira/browse/TAPESTRY-1151</a>），就是PagePool的实现没有移除Idle的Page实例，虽然很方便通过重新实现PagePool并覆盖官方实现来修正（<a href="http://tapestry.javaeye.com/blog/35221" target="_blank">http://tapestry.javaeye.com/blog/35221</a>），但毕竟是bug，4.1.2已经采用了使用softReferences的Commons Pool，并且可以配置(<a href="http://tapestry.apache.org/tapestry4.1/developmentguide/performancetuning.html" target="_blank">http://tapestry.apache.org/tapestry4.1/developmentguide/performancetuning.html</a>)。<br />三、<strong>Asset caching</strong><br />在Tapestry中图片、javascript文件、css文件都叫做Asset，这些都可以被浏览器cache了，并且使用gzip压缩<br />（<a href="http://blog.opencomponentry.com/2006/12/03/gzip-where-have-you-been-all-my-life/" target="_blank">http://blog.opencomponentry.com/2006/12/03/gzip-where-have-you-been-all-my-life/</a>），加快了传输速度。<br />四、<strong>使用layered build system提升dojo的加载速度</strong><br />Tapstry4.1中集成了dojo来实现ajax功能，4.1.2中集成了dojo0.4.3的最新版本，使用new layered build system增加了整个页面的加载速度。<br /><br />    其它还有许多的内存消耗等方面的改进，总起来说Tapestry4.1.2在性能上已经有了很大的提升。
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/94748#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Jun 2007 16:13:44 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/94748</link>
        <guid>http://tapestry.javaeye.com/blog/94748</guid>
      </item>
          <item>
        <title>深入理解Tapestry的Rewind</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/41724" style="color:red;">http://tapestry.javaeye.com/blog/41724</a>&nbsp;
          发表时间: 2006年12月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry的rewind一直是学习和使用Tapestry的难点，rewind是用来处理表单提交的，表单默认使用的是DirectService来提交。在详细介绍之前，先说明下此文中需要用到的一些概念，首先是表单组件，我这里指的是指继承自AbstractFormComponent类的组件，例如：TextField、TextArea、Checkbox等，而不是具体的Form组件，表单组件使用时必须在Form组件中，这些组件在rewind时调用继承自AbstractFormComponent的rewindFormComponent来读取数据，并将数据赋值给容器或者页面。<br />我们来看一下最简单的TextField组件，组件定义如下<br /><pre name="code" class="java">&lt;input  jwcid="price@TextField" type="text" value="ognl:picture.price"  translator="translator:number,pattern=##.##"  validators="validators:min=0" displayName="价格" class="input_text"/></pre><br />再看一下TextField中的rewindFormComponent组件方法<br /><pre name="code" class="java">protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle) {
       //从请求中得到参数值
		String value = cycle.getParameter(getName());

		try {
             //用translator来转换值
			Object object = getTranslatedFieldSupport().parse(this, value);
//用validators来验证值
			getValidatableFieldSupport().validate(this, writer, cycle, object);
            //赋值给容器或者页面
			setValue(object);
		} catch (ValidatorException e) {
			getForm().getDelegate().record(e);
		}
	}</pre><br />可以看到在rewindFormComponent中，主要是从请求中取得用户输入的值，然后进行处理，最后赋值给容器或者页面，上面的例子中会调用页面类的getPicture().setPrice(“用户输入的值”)来进行赋值。这样整个表单的提交就可以理解为所有的表单组件读取用户输入的值并赋值给页面的过程。<br />整个表单提交的详细处理过程如下：<br /><ul>    * initialize():页面初始化<br />    * pageBeginRender() ("rewind"):getRequestCycle().isRewinding()为true    <br />   * rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取值赋值<br />    * Deferred listeners (for Submit components):调用Submit组件的listener<br />    * Form's listener：调用Form组件的listener<br />    * pageEndRender() ("rewind"): getRequestCycle().isRewinding()为true<br />    * pageBeginRender() (normal): getRequestCycle().isRewinding()为false<br />    * pageEndRender() (normal): getRequestCycle().isRewinding()为false</ul>我们可以看到pageBeginRender和pageEndRender被调用了两次，两次中的区别为RequestCycle().isRewinding，因为我们在使用时经常利用pageBeginRender的初始化值，所以这里有很多使用上的误区，如果在pageBeginRender中从数据库读取数据来初始化跟表单提交无关的变量的话，就可能被调用两次，这个是应该避免的。什么叫跟表单提交无关的变量呢，就是表单组件中跟赋值无关的，例如上边提到的value="ognl:picture.price",这时picture就是与表单提交相关的变量，如果你没有初始化，那么在赋值时调用getPicture().setPrice()就会出现空指针异常，因为这是的picture为null。我们举个例子来看一下表单无关的变量，假如这个picture页面会显示一个创建picture的表单和所有picture的列表，那这个picture的列表就是与表单提交无关的变量，如果你在pageBeginRender中初始化的话，就需要区分是否rewind，否则表单提交时就会被初始化两次，让我们看一下代码：<br /><pre name="code" class="java">public abstract void setPictures(List&lt;Picture> pictures);
public abstract void setPictureInList();//用于For中的value
public abstract void setPicture(Picture picture);//用于表单创建
public abstract Picture getPicture();
public void pageBeginRender(PageEvent event) {
if(getPicture()==null){
setPicture(new Picture());
}
setPictures(getPictureService().findAll());
}</pre>判断picture是否为null并赋值在页面显示和rewind中都是需要的，因为页面显示时，需要调用getPicture().getPrice(),页面rewind时，需要调用getPicture().setPrice(),这两个阶段中的picture都不能为null。但setPictures会在表单提交时被调用两次，在rewind阶段初始化它是没有用处的，所以这时就要对是否rewind进行判断。修改后的代码如下：<br /><pre name="code" class="java">public void pageBeginRender(PageEvent event) {
if(getPicture()==null){
setPicture(new Picture());
}
if (!event.getRequestCycle().isRewinding()) {
setPictures(getPictureService().findAll());
}
}</pre>这样就可以避免在rewind时对pictures进行不必要的赋值。这里还要提到的一点是页面显示和提交后的页面很可能不是同一个页面类的实例，大家都知道页面类的实例是从实例池取到的，用户打开页面显示表单完后的页面类实例和用户提交表单时的用来rewind的页面类实例不一定是同一个，即使是一个实例，也是被重新初始化过的，不要想当然的认为显示表单后再提交那个实例应该保存原来显示的东西，这个应该理清楚。
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/41724#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 30 Dec 2006 16:07:24 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/41724</link>
        <guid>http://tapestry.javaeye.com/blog/41724</guid>
      </item>
          <item>
        <title>The way of checking the type of an object</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/41143" style="color:red;">http://tapestry.javaeye.com/blog/41143</a>&nbsp;
          发表时间: 2006年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><strong>Apress ProJavaScriptTechniques</strong></font> <br />
<br />
The first way of checking the type of an object is by using the obvious-sounding typeof operator.<br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;Check&nbsp;to&nbsp;see&nbsp;if&nbsp;our&nbsp;number&nbsp;is&nbsp;actually&nbsp;a&nbsp;string</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="keyword">typeof</span><span>&nbsp;num&nbsp;==&nbsp;</span><span class="string">&quot;string&quot;</span><span>&nbsp;)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;If&nbsp;it&nbsp;is,&nbsp;then&nbsp;parse&nbsp;a&nbsp;number&nbsp;out&nbsp;of&nbsp;it</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>num&nbsp;=&nbsp;parseInt(&nbsp;num&nbsp;);&nbsp;&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Check&nbsp;to&nbsp;see&nbsp;if&nbsp;our&nbsp;array&nbsp;is&nbsp;actually&nbsp;a&nbsp;string</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="keyword">typeof</span><span>&nbsp;arr&nbsp;==&nbsp;</span><span class="string">&quot;string&quot;</span><span>&nbsp;)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;If&nbsp;that's&nbsp;the&nbsp;case,&nbsp;make&nbsp;an&nbsp;array,&nbsp;splitting&nbsp;on&nbsp;commas</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>arr&nbsp;=&nbsp;arr.split(<span class="string">&quot;,&quot;</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
The second way of checking the type of an object is by referencing a property of all JavaScript objects called constructor.<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;Check&nbsp;to&nbsp;see&nbsp;if&nbsp;our&nbsp;number&nbsp;is&nbsp;actually&nbsp;a&nbsp;string</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(&nbsp;num.constructor&nbsp;==&nbsp;String&nbsp;)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;If&nbsp;it&nbsp;is,&nbsp;then&nbsp;parse&nbsp;a&nbsp;number&nbsp;out&nbsp;of&nbsp;it</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>num&nbsp;=&nbsp;parseInt(&nbsp;num&nbsp;);&nbsp;&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Check&nbsp;to&nbsp;see&nbsp;if&nbsp;our&nbsp;string&nbsp;is&nbsp;actually&nbsp;an&nbsp;array</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(&nbsp;str.constructor&nbsp;==&nbsp;Array&nbsp;)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;If&nbsp;that's&nbsp;the&nbsp;case,&nbsp;make&nbsp;a&nbsp;string&nbsp;by&nbsp;joining&nbsp;the&nbsp;array&nbsp;using&nbsp;commas</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>str&nbsp;=&nbsp;str.join(',');&nbsp;&nbsp;</span> </li>
</ol>
</div>
Table 2-1 shows the results of type-checking different object types using the two different methods that I&rsquo;ve described.<br />
<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr style="HEIGHT: 15.1pt">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.1pt" valign="top" width="93">
            <p class="MsoNormal"><strong><span lang="EN-US">Variable<o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.1pt" valign="top" width="142">
            <p class="MsoNormal"><strong><span lang="EN-US">typeof Variable<o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.1pt" valign="top" width="192">
            <p class="MsoNormal"><strong><span lang="EN-US">Variable.constructor<o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal" style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-SIZE: 8.5pt; FONT-FAMILY: Utopia-Regular">{ an: &ldquo;object&rdquo; }</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Utopia-Regular"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">object<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span>Object<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal" style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-SIZE: 8.5pt; FONT-FAMILY: Utopia-Regular">[ &ldquo;an&rdquo;, &ldquo;array&rdquo; ]</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Utopia-Regular"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">array<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US">Array<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal"><span lang="EN-US">function(){}<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">function<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US">Function<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal"><span lang="EN-US">&ldquo;a string&rdquo;<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">string<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US">String<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal"><span lang="EN-US">55<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">number<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US">Number<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal"><span lang="EN-US">true<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">boolean<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US">Boolean<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 69.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="93">
            <p class="MsoNormal"><span lang="EN-US">new User()<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 106.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="142">
            <p class="MsoNormal"><span lang="EN-US">object<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="192">
            <p class="MsoNormal"><span lang="EN-US">User<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
Strict typechecking can help in instances where you want to make sure that exactly the right number of arguments of exactly the right type are being passed into your functions.
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;Strictly&nbsp;check&nbsp;a&nbsp;list&nbsp;of&nbsp;variable&nbsp;types&nbsp;against&nbsp;a&nbsp;list&nbsp;of&nbsp;arguments</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;strict(&nbsp;types,&nbsp;args&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;number&nbsp;of&nbsp;types&nbsp;and&nbsp;args&nbsp;matches</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(&nbsp;types.length&nbsp;!=&nbsp;args.length&nbsp;)&nbsp;{</span><span class="comment">//&nbsp;If&nbsp;they&nbsp;do&nbsp;not,&nbsp;throw&nbsp;a&nbsp;useful&nbsp;exception</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">throw</span><span>&nbsp;</span><span class="string">&quot;Invalid&nbsp;number&nbsp;of&nbsp;arguments.&nbsp;Expected&nbsp;&quot;</span><span>&nbsp;+&nbsp;types.length&nbsp;+&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="string">&quot;,&nbsp;received&nbsp;&quot;</span><span>&nbsp;+&nbsp;args.length&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;instead.&quot;</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
    <li class=""><span><span class="comment">//&nbsp;Go&nbsp;through&nbsp;each&nbsp;of&nbsp;the&nbsp;arguments&nbsp;and&nbsp;check&nbsp;their&nbsp;types</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;(&nbsp;</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i++&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="comment">//</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;(&nbsp;args[i].constructor&nbsp;!=&nbsp;types[i]&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">throw</span><span>&nbsp;</span><span class="string">&quot;Invalid&nbsp;argument&nbsp;type.&nbsp;Expected&nbsp;&quot;</span><span>&nbsp;+&nbsp;types[i].name&nbsp;+&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="string">&quot;,&nbsp;received&nbsp;&quot;</span><span>&nbsp;+&nbsp;args[i].constructor.name&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;instead.&quot;</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;A&nbsp;simple&nbsp;function&nbsp;for&nbsp;printing&nbsp;out&nbsp;a&nbsp;list&nbsp;of&nbsp;users</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;userList(&nbsp;prefix,&nbsp;num,&nbsp;users&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;prefix&nbsp;is&nbsp;a&nbsp;string,&nbsp;num&nbsp;is&nbsp;a&nbsp;number,</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="comment">//&nbsp;and&nbsp;users&nbsp;is&nbsp;an&nbsp;array</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>strict(&nbsp;[&nbsp;String,&nbsp;Number,&nbsp;Array&nbsp;],&nbsp;arguments&nbsp;);&nbsp;&nbsp;</span> </li>
    <li class=""><span><span class="comment">//&nbsp;Iterate&nbsp;up&nbsp;to&nbsp;'num'&nbsp;users</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;(&nbsp;</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;num;&nbsp;i++&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="comment">//&nbsp;Displaying&nbsp;a&nbsp;message&nbsp;about&nbsp;each&nbsp;user</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>print(&nbsp;prefix&nbsp;+&nbsp;<span class="string">&quot;:&nbsp;&quot;</span><span>&nbsp;+&nbsp;users[i]&nbsp;);&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/41143#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Dec 2006 11:06:00 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/41143</link>
        <guid>http://tapestry.javaeye.com/blog/41143</guid>
      </item>
          <item>
        <title>javascipt scope</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/41136" style="color:red;">http://tapestry.javaeye.com/blog/41136</a>&nbsp;
          发表时间: 2006年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>From <font face="Arial"><strong>Apress ProJavaScriptTechniques<br />
</strong></font><br />
In JavaScript, scope is kept within functions, but not within blocks (such as while, if, and for statements).<br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;Set&nbsp;a&nbsp;global&nbsp;variable,&nbsp;foo,&nbsp;equal&nbsp;to&nbsp;test</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;foo&nbsp;=&nbsp;</span><span class="string">&quot;test&quot;</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Within&nbsp;an&nbsp;if&nbsp;block</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="keyword">true</span><span>&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Set&nbsp;foo&nbsp;equal&nbsp;to&nbsp;'new&nbsp;test'</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="comment">//&nbsp;NOTE:&nbsp;This&nbsp;is&nbsp;still&nbsp;within&nbsp;the&nbsp;global&nbsp;scope!</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;foo&nbsp;=&nbsp;</span><span class="string">&quot;new&nbsp;test&quot;</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;As&nbsp;we&nbsp;can&nbsp;see&nbsp;here,&nbsp;as&nbsp;foo&nbsp;is&nbsp;now&nbsp;equal&nbsp;to&nbsp;'new&nbsp;test'</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>alert(&nbsp;foo&nbsp;==&nbsp;<span class="string">&quot;new&nbsp;test&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;Create&nbsp;a&nbsp;function&nbsp;that&nbsp;will&nbsp;modify&nbsp;the&nbsp;variable&nbsp;foo</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;test()&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;foo&nbsp;=&nbsp;</span><span class="string">&quot;old&nbsp;test&quot;</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">//&nbsp;However,&nbsp;when&nbsp;called,&nbsp;'foo'&nbsp;remains&nbsp;within&nbsp;the&nbsp;scope</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="comment">//&nbsp;of&nbsp;the&nbsp;function</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>test();&nbsp;&nbsp;</span> </li>
    <li class=""><span><span class="comment">//&nbsp;Which&nbsp;is&nbsp;confirmed,&nbsp;as&nbsp;foo&nbsp;is&nbsp;still&nbsp;equal&nbsp;to&nbsp;'new&nbsp;test'</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>alert(&nbsp;foo&nbsp;==&nbsp;<span class="string">&quot;new&nbsp;test&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><font face="Arial">An interesting aspect of browser-based JavaScript is that all globally scoped variables are actually just properties<br />
of the window object.</font></p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;A&nbsp;globally-scoped&nbsp;variable,&nbsp;containing&nbsp;the&nbsp;string&nbsp;'test' </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">var</span><span>&nbsp;test&nbsp;=&nbsp;</span><span class="string">&quot;test&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;You'll&nbsp;notice&nbsp;that&nbsp;our&nbsp;'global'&nbsp;variable&nbsp;and&nbsp;the&nbsp;test </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;property&nbsp;of&nbsp;the&nbsp;the&nbsp;window&nbsp;object&nbsp;are&nbsp;identical </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>alert(&nbsp;window.test&nbsp;==&nbsp;test&nbsp;);&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><font face="Arial">In Listing 2-12 a value is assigned to a variable (foo) within the scope of the test() function. However, nowhere in Listing 2-12 is the scope of the variable actually declared (using var foo). When the foo variable isn&rsquo;t explicitly defined, it will become defined globally, even though it is only used within the context of the function scope.</font></p>
<p>Listing 2-12 <br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;A&nbsp;function&nbsp;in&nbsp;which&nbsp;the&nbsp;value&nbsp;of&nbsp;foo&nbsp;is&nbsp;set </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">function</span><span>&nbsp;test()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>foo&nbsp;=&nbsp;</span><span class="string">&quot;test&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;Call&nbsp;the&nbsp;function&nbsp;to&nbsp;set&nbsp;the&nbsp;value&nbsp;of&nbsp;foo </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>test(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;We&nbsp;see&nbsp;that&nbsp;foo&nbsp;is&nbsp;now&nbsp;globally&nbsp;scoped </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>alert(&nbsp;window.foo&nbsp;==&nbsp;</span><span class="string">&quot;test&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://tapestry.javaeye.com/blog/41136#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Dec 2006 11:01:00 +0800</pubDate>
        <link>http://tapestry.javaeye.com/blog/41136</link>
        <guid>http://tapestry.javaeye.com/blog/41136</guid>
      </item>
          <item>
        <title>在Tapestry中通用的property selection model</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
                    链接：<a href="http://tapestry.javaeye.com/blog/37739" style="color:red;">http://tapestry.javaeye.com/blog/37739</a>&nbsp;
          发表时间: 2006年12月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>Tapestry</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">中构建选择列表需要使用</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">IPropertySelectionModel</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">，</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">Model</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">可以映射选择列表中的</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">Label</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">和</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">Option</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">，</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">Tapestry</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">中已经提供一个常用的</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">StringSelectonModel,</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">具体组件使用如下：</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia">Html</span><span style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: 宋体">代码</span><span lang="EN-US" style="FONT-SIZE: 11.5pt; COLOR: black; FONT-FAMILY: Georgia"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"></span>
<p>&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">代码</span></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DetailsPage&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BasePage&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;IPropertySelectionModel&nbsp;GENDER_MODEL&nbsp;=&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;StringPropertySelectionModel(</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{&nbsp;</span><span class="string">&quot;Unspecified&quot;</span><span>,&nbsp;</span><span class="string">&quot;Female&quot;</span><span>,&nbsp;</span><span class="string">&quot;Male&quot;</span><span>&nbsp;});&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;String&nbsp;getGender();&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;formSubmit(IRequestCycle&nbsp;cycle)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Process&nbsp;form&nbsp;submission</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;genderSelection&nbsp;=&nbsp;getGender();&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">开发中比较常见的选择列表就是类别的选择，，一般是新建一个类别的</span><span lang="EN-US">SelectionModel</span><span style="FONT-FAMILY: 宋体">，例如如下代码</span></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TypeSelectionModel&nbsp;</span><span class="keyword">implements</span><span>&nbsp;IPropertySelectionModel,&nbsp;Serializable&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;List&nbsp;TypeList;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;ItemSelectionModel(List&nbsp;typeList)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.&nbsp;typeList&nbsp;=&nbsp;typeList;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getOptionCount()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;typeList.size();&nbsp;}&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Object&nbsp;getOption(</span><span class="keyword">int</span><span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;((Type)typeList.get(index)).getId();&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;getLabel(</span><span class="keyword">int</span><span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;((Type)&nbsp;typeList.get(index)).getName();&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;getValue(</span><span class="keyword">int</span><span>&nbsp;index)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;Integer.toString(index);&nbsp;}&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Object&nbsp;translateValue(String&nbsp;value)&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;getOption(Integer.parseInt(value));&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">这只是传统方法，开发中的类别如果多了，每一个都要新建一个</span><span lang="EN-US">SelectionModel</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">下面是在</span><span lang="EN-US"><a href="http://files.doublenegative.com.au/jumpstart/">Tapestry JumpStart</a></span><span style="FONT-FAMILY: 宋体">里看到的通用的</span><span lang="EN-US">SelectionModel</span><span style="FONT-FAMILY: 宋体">，感觉比较不错，现介绍给大家，具体代码如下：</span></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.javaeye.tapestrying.selectionModel;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.InvocationTargetException;&nbsp;&nbsp;</span>&nbsp;</span> </li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.Method;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.ArrayList;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.List;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.tapestry.form.IPropertySelectionModel;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="comment"><span>&nbsp;&nbsp; </span>&nbsp;<br />
    </span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ObjectPropertySelectionModel&nbsp;</span><span class="keyword">implements</span><span>&nbsp;IPropertySelectionModel&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;List&nbsp;_list;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Method&nbsp;_methodToGetLabel&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Method&nbsp;_methodToGetOption&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;_allowNoSelection&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;_noSelectionMessage&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;_offset&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span>&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;ObjectPropertySelectionModel()&nbsp;{&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_list&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ArrayList();&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;UnsupportedOperationException(</span><span class="string">&quot;Do&nbsp;not&nbsp;use&nbsp;the&nbsp;default&nbsp;constructor.&quot;</span><span>);&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;list</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;list&nbsp;of&nbsp;objects&nbsp;to&nbsp;represent&nbsp;in&nbsp;a&nbsp;PropertySelection</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.&nbsp;WARNING:&nbsp;The&nbsp;objects&nbsp;in&nbsp;the&nbsp;list&nbsp;MUST&nbsp;implement</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals(Object&nbsp;obj)&nbsp;and&nbsp;hashCode(),&nbsp;and&nbsp;if&nbsp;they&nbsp;are&nbsp;EJB3</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entities&nbsp;those&nbsp;methods&nbsp;MUST&nbsp;return&nbsp;the&nbsp;same&nbsp;thing&nbsp;for</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;different&nbsp;instances&nbsp;of&nbsp;the&nbsp;same&nbsp;detached&nbsp;entity&nbsp;(eg.&nbsp;by</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matching&nbsp;on&nbsp;Id&nbsp;only).</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;clazz</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;class&nbsp;of&nbsp;objects&nbsp;in&nbsp;the&nbsp;list.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;nameOfMethodToGetLabel</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;method&nbsp;that&nbsp;PropertySelection&nbsp;must&nbsp;invoke&nbsp;on</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;each&nbsp;object&nbsp;in&nbsp;the&nbsp;list&nbsp;to&nbsp;get&nbsp;its&nbsp;label&nbsp;to&nbsp;display&nbsp;in&nbsp;the</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;on&nbsp;the&nbsp;page.&nbsp;For&nbsp;example,&nbsp;the&nbsp;method&nbsp;name&nbsp;might&nbsp;be</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;getShortName&quot;.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;nameOfMethodToGetOption</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;method&nbsp;that&nbsp;PropertySelection&nbsp;must&nbsp;invoke&nbsp;on</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;object&nbsp;when&nbsp;it&nbsp;has&nbsp;been&nbsp;selected.&nbsp;The&nbsp;result&nbsp;is&nbsp;put&nbsp;into</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;property&nbsp;named&nbsp;in&nbsp;the&nbsp;&quot;value&quot;&nbsp;parameter&nbsp;of&nbsp;the</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertySelection.&nbsp;For&nbsp;example,&nbsp;the&nbsp;method&nbsp;name&nbsp;might&nbsp;be</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;getKey&quot;.&nbsp;If&nbsp;you&nbsp;want&nbsp;the&nbsp;result&nbsp;to&nbsp;be&nbsp;the&nbsp;the&nbsp;whole&nbsp;object</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;set&nbsp;this&nbsp;argument&nbsp;to&nbsp;null.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;ObjectPropertySelectionModel(List<span class="keyword">extends</span><span>&nbsp;Object&gt;&nbsp;list,&nbsp;Class&nbsp;clazz,&nbsp;String&nbsp;nameOfMethodToGetLabel,&nbsp;&nbsp;</span></span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</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;String&nbsp;nameOfMethodToGetOption)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>(list,&nbsp;clazz,&nbsp;nameOfMethodToGetLabel,&nbsp;nameOfMethodToGetOption,&nbsp;</span><span class="keyword">false</span><span>,&nbsp;</span><span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;list</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;list&nbsp;of&nbsp;objects&nbsp;to&nbsp;represent&nbsp;in&nbsp;a&nbsp;PropertySelection</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.&nbsp;WARNING:&nbsp;The&nbsp;objects&nbsp;in&nbsp;the&nbsp;list&nbsp;MUST&nbsp;implement</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals(Object&nbsp;obj)&nbsp;and&nbsp;hashCode(),&nbsp;and&nbsp;if&nbsp;they&nbsp;are&nbsp;EJB3</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entities&nbsp;those&nbsp;methods&nbsp;MUST&nbsp;return&nbsp;the&nbsp;same&nbsp;thing&nbsp;for</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;different&nbsp;instances&nbsp;of&nbsp;the&nbsp;same&nbsp;detached&nbsp;entity&nbsp;(eg.&nbsp;by</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matching&nbsp;on&nbsp;Id&nbsp;only).</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;clazz</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;class&nbsp;of&nbsp;objects&nbsp;in&nbsp;the&nbsp;list.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;nameOfMethodToGetLabel</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;method&nbsp;that&nbsp;PropertySelection&nbsp;must&nbsp;invoke&nbsp;on</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;each&nbsp;object&nbsp;in&nbsp;the&nbsp;list&nbsp;to&nbsp;get&nbsp;its&nbsp;label&nbsp;to&nbsp;display&nbsp;in&nbsp;the</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;on&nbsp;the&nbsp;page.&nbsp;For&nbsp;example,&nbsp;the&nbsp;method&nbsp;name&nbsp;might&nbsp;be</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;getShortName&quot;.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;nameOfMethodToGetOption</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;method&nbsp;that&nbsp;PropertySelection&nbsp;must&nbsp;invoke&nbsp;on</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;object&nbsp;when&nbsp;it&nbsp;has&nbsp;been&nbsp;selected.&nbsp;The&nbsp;result&nbsp;is&nbsp;put&nbsp;into</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;property&nbsp;named&nbsp;in&nbsp;the&nbsp;&quot;value&quot;&nbsp;parameter&nbsp;of&nbsp;the</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertySelection.&nbsp;For&nbsp;example,&nbsp;the&nbsp;method&nbsp;name&nbsp;might&nbsp;be</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;getKey&quot;.&nbsp;If&nbsp;you&nbsp;want&nbsp;the&nbsp;result&nbsp;to&nbsp;be&nbsp;the&nbsp;the&nbsp;whole&nbsp;object</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;set&nbsp;this&nbsp;argument&nbsp;to&nbsp;null.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;allowNoSelection</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;true&nbsp;then&nbsp;adds&nbsp;an&nbsp;element&nbsp;to&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;list.&nbsp;Its</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;is&nbsp;null.</span>&nbsp;</span> </li>
    <li class=""><span><span class="comment"></span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs