<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Tapestry</title>
    <description>欢迎大家来讨论和学习tapestry，这里有tapestry的最佳应用和tapestry5的展望。</description>
    <link>http://tapestrying.group.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>vAgent(宾馆、旅游线路订购网)二---开发工具选型</title>
        <author>koda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://koda.javaeye.com">koda</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/211246" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/211246</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium"><strong>CakePHP + JQuery/Prototype + MySQL + Apache + Linux </strong></span><br />是该项目的技术平台。所有开发工具必须基于此考虑。<br /><br />1. PowerDesigner12.5 数据库建模工具<br />   既然选择了Ror风格的CakePHP,数据库设计作为模型的开始就是很自然,PowerDesigner用过了都说好。<br /><img src="http://koda.javaeye.com/upload/picture/pic/17291/85fa15c2-2eed-3daf-8dc4-95f743f5ea62.png" /><br />2. Subvesion: 源码控制工具<br /><img src="http://koda.javaeye.com/upload/picture/pic/17277/d685606d-d0de-329d-bffd-f79fa3b219f4.png" /><br />   心甘情愿、别无选择的选择。<br />3. Tortoise: 轻量的SVN客户端工具<br /><img src="http://koda.javaeye.com/upload/picture/pic/17281/282176c2-5dfc-3c5d-85bc-ef172a01e55a.png" /><br />4. Mantis: 简单轻量的Bugtracker<br /><img src="http://koda.javaeye.com/upload/picture/pic/17273/2b59fc86-9080-33b3-8256-61032f0b1786.gif" /><br />5. Notepad++/EditPlus 源码编辑器.没有使用IDE，像ZendStudio,PhpEdit,似乎不那么重要。<br /><img src="http://koda.javaeye.com/upload/picture/pic/17275/fa03ef02-e434-3c33-ab35-da937d8291a2.png" /><br />http://koda.javaeye.com/upload/picture/pic/17275/fa03ef02-e434-3c33-ab35-da937d8291a2.png<br />6. Putty: 最简陋的和linux服务器交互的工具<br />7. Dokuwiki: 没有比他更让我喜欢的Wiki工具了，项目的所有信息我都公布在这里<br /><img src="http://koda.javaeye.com/upload/picture/pic/17287/2de6e33d-f6ca-347d-9667-0cf14205dd9b.png" /><br />8. EMS SQLManager: 最棒的MySQL管理工具。当然，后来，我还是更多地在CONSOLE下鼓捣MySQL<br /><img src="http://koda.javaeye.com/upload/picture/pic/17295/cc1a2cc6-3394-3a59-bf40-2def40f7480b.gif" />
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/211246#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jul 2008 20:46:18 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/211246</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/211246</guid>
      </item>
      <item>
        <title>关于prototype与jquery 的一起协作问题</title>
        <author>jackdraw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackdraw.javaeye.com">jackdraw</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/207314" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/207314</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在项目中引用第三方的webEdit,由于此组件用到了prototype，　而我们对于ajax的处理是用jquery　Lib ，主要是基于jquery 优美的框架哲学,但在使用的过程进导致webedit不能使用，由于prototype与jquery都有$　，应该是由此引起，因为以此找到一个篇关于此的解决方案</p>
<p>记录如下</p>
<h2>PrototypeAnd<a href="http://www.lvjiyong.com/tag/jquery">jquery</a></h2>
<div class="wikipage">
<div id="searchable">
<p>&nbsp;</p>
<div id="wiki_nav">
<h4>Back</h4>
<ul>
<li><a href="http://jquery.com/docs/Overview/">Overview</a> </li>
</ul>
</div>
<p><a href="http://www.lvjiyong.com/tag/jquery">jquery</a> gets a lot of its inspiration from the power behind the <a href="http://prototype.conio.net/" class="ext-link">Prototype</a> library. This is immediately noticeable with <a href="http://www.lvjiyong.com/tag/jquery">jquery</a>'s use of the $() function, inspired by the Prototype function of the same name. However, there are some things that should be known about the Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> interact, and how the $() behaves differently. </p>
<h3 id="UsingPrototypeandjQueryTogether">Using Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> Together</h3>
只要先引入prototype再引入<a href="http://www.lvjiyong.com/tag/jquery">jquery</a>,个人感觉就是作者自己说的,因为是Prototype给他灵感,所以重成了Prototype的部分内容,因此先<a href="http://www.lvjiyong.com/tag/jquery">jquery</a>必将出现我们所不知道的错误.
<p>To include both Javascript libraries, and have them work in unison, you will need to first include Prototype, then <a href="http://www.lvjiyong.com/tag/jquery">jquery</a>. For example: </p>
<pre class="wiki">  &lt;script src="<a href="http://www.lvjiyong.com/tag/prototype.js">prototype.js</a>"&gt;&lt;/script&gt;
  &lt;script src="http://<a href="http://www.lvjiyong.com/tag/jquery">jquery</a>.com/src/latest/"&gt;&lt;/script&gt;
</pre>
<p>Loading <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> first, then Prototype, will cause your code to break - as a reminder, <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> throws an exception saying: "You are overwriting <a href="http://www.lvjiyong.com/tag/jquery">jquery</a>, please include <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> last." (If you see this error, that's what it means) </p>
<h3 id="Differencesin">Differences in $()</h3>
<p>A side-by-side comparison of how the $() function works *ONLY WHEN PROTOTYPE IS USED* would be best to explain the differences. If you're not using Prototype, please refer to the <a href="http://jquery.com/docs/">documentation</a>, instead. </p>
<pre class="wiki">  $("pre")
</pre>
<p><strong>Prototype:</strong> Looks for the element with an ID of pre, if found, returns it, otherwise returns null. </p>
<p><strong><a href="http://www.lvjiyong.com/tag/jquery">jquery</a>:</strong> Looks for all elements with the <a href="http://ewebapp.cnblogs.com/category/35112.html">Tag</a> name of pre. </p>
<ul>
<li>If none are found: It then looks for an element with an ID of pre, if one is found - it returns that element, if not, it returns a <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> object, with an empty set of matched elements. </li>
<li>If elements are found: <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> returns a <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> object, containing the all matched pre elements. </li>
</ul>
<pre class="wiki">  $(DOMElement)
</pre>
<p><strong>Prototype:</strong> Returns the DOMElement. </p>
<p><strong><a href="http://www.lvjiyong.com/tag/jquery">jquery</a>:</strong> Attaches all of the <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> object methods to the DOMElement, then returns it. The result should still be usable by Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a>. <strong>Note:</strong> See the bottom of the page for more information on this. </p>
<h3 id="Whattodoabout">What to do about $()?</h3>
<p>Because the behavior of Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> is different, when it comes to the $() function, it is recommended that you do one of two things: </p>
<h4 id="UnambiguousSelectors">Un-ambiguous Selectors</h4>
<p>Always be explicit when you search by a single ID. For example, use this: </p>
<pre class="wiki">  $("#pre")
</pre>
<p>and not this, which is ambiguous: </p>
<pre class="wiki">  $("pre")
</pre>
<p>Doing that will solve any problems straight away. </p>
<h4 id="PrototypeShorthand">Prototype Short-hand</h4>
<p>If you want to continuing using the Prototype short-hand, you must keep one rule in mind: Never name any of your IDs the same as a DOM Element type, otherwise you will have strange results. For example: </p>
<pre class="wiki">  $("pre")
</pre>
<p>would work, if there were no pre elements in the page, but once one was added, your code would break. A better example is: </p>
<pre class="wiki">  $("body")
</pre>
<p>which will always break (since the body element is required). </p>
<p><strong>In a nutshell:</strong> Either use smart un-ambiguous !IDs, or don't name your !IDs the same as element names. </p>
<h3 id="WrappingofDOMElements">Wrapping of DOM Elements</h3>
<p>In order to support both Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> users at the same time, returned DOM elements have additional <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> functions attached to them. It should be noted, however, that just because the original DOM Element is being returned, its original functions and properties should not be accessed directly, for example: </p>
<p>When using both Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> <tt>$("wrap")</tt> will return a modified DOM Element, so if you were inclined to do: </p>
<pre class="wiki">  $("wrap").style.display = 'none';
</pre>
<p>That would work, but only when using Prototype. If you then, later, stopped using Prototype, that code would break. To be safe, you should only use <a href="http://www.lvjiyong.com/tag/jquery">jquery</a>-sanctioned functions and terminology, for example: </p>
<pre class="wiki">  $("#wrap").hide();
</pre>
<p>would be the proper way of doing the above - it will always work, even if you are (or aren't) using Prototype. </p>
<h3 id="UsingPrototypeandjQueryTogetherothersolution">Using Prototype and <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> Together (other solution)</h3>
<p>If you need use <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> and also Prototype + Scriptaculous + ... , you need rename <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> $ function. For example: </p>
<pre class="wiki"> &lt;script src="http://<a href="http://www.lvjiyong.com/tag/jquery">jquery</a>.com/src/latest/"&gt;&lt;/script&gt;
 &lt;script type="text/javascript"&gt;
    JQ = $;  //rename $ function
 &lt;/script&gt;
 &lt;script src="<a href="http://www.lvjiyong.com/tag/prototype.js">prototype.js</a>"&gt;&lt;/script&gt;
</pre>
<p>Then you can access to <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> function with JQ and for access to Prototype $ function use the normal name. For example: </p>
<pre class="wiki"> &lt;script type="text/javascript"&gt;
  JQ(document).ready(function(){
   JQ("#test_<a href="http://www.lvjiyong.com/tag/jquery">jquery</a>").html("this is <a href="http://www.lvjiyong.com/tag/jquery">jquery</a>");
   $("test_prototype").innerHTML="this is Prototype";
  });
 &lt;/script&gt;
</pre>
<p>NOTE: Be carefull with <a href="http://www.lvjiyong.com/tag/jquery">jquery</a> plugins, you will need rename all $ references to JQ or other name. </p>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/207314#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jun 2008 09:03:46 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/207314</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/207314</guid>
      </item>
      <item>
        <title>T5+spring2.0+hibernate3.2+xfire使用类库列表</title>
        <author>guanyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lguan.javaeye.com">guanyq</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/204944" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/204944</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在eclipse3.2中新建maven项目（在eclipse添加maven插件才能创建maven项目），项目依赖maven库，maven的搭建前面有讲解</p>
<p>建好项目后，打开pom.xml</p>
<p>将如下内容拷贝进去替换原来的文件内容就可以支持T5+spring2.0+hibernate3.2，同时支持xfire做webservice开发</p>
<p>保存文件后，有些类库可能需要获取远程的maven资源库上的类，eclipse会自动更新下载到本地maven库中</p>
<p>其中的项目名称根据自己的实际项目做改动</p>
<p>&nbsp;</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;sys&lt;/groupId&gt;
  &lt;artifactId&gt;sys&lt;/artifactId&gt;
  &lt;packaging&gt;war&lt;/packaging&gt;
  &lt;version&gt;1.0.0&lt;/version&gt;
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;
      &lt;artifactId&gt;tapestry-core&lt;/artifactId&gt;
      &lt;version&gt;5.0.6&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;
      &lt;artifactId&gt;tapestry-hibernate&lt;/artifactId&gt;
      &lt;version&gt;5.0.6&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;
      &lt;artifactId&gt;tapestry-test&lt;/artifactId&gt;
      &lt;version&gt;5.0.6&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.easymock&lt;/groupId&gt;
      &lt;artifactId&gt;easymock&lt;/artifactId&gt;
      &lt;version&gt;2.3&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.easymock&lt;/groupId&gt;
      &lt;artifactId&gt;easymockclassextension&lt;/artifactId&gt;
      &lt;version&gt;2.2.2&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;hsqldb&lt;/groupId&gt;
      &lt;artifactId&gt;hsqldb&lt;/artifactId&gt;
      &lt;version&gt;1.8.0.7&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;geronimo-spec&lt;/groupId&gt;
      &lt;artifactId&gt;geronimo-spec-jta&lt;/artifactId&gt;
      &lt;version&gt;1.0-M1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.persistence&lt;/groupId&gt;
      &lt;artifactId&gt;persistence-api&lt;/artifactId&gt;
      &lt;version&gt;1.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;c3p0&lt;/groupId&gt;
      &lt;artifactId&gt;c3p0&lt;/artifactId&gt;
      &lt;version&gt;0.9.1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;
      &lt;artifactId&gt;tapestry-spring&lt;/artifactId&gt;
      &lt;version&gt;5.0.6&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;commons-logging&lt;/groupId&gt;
      &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;
      &lt;version&gt;1.1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.springframework&lt;/groupId&gt;
      &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;avalon&lt;/groupId&gt;
      &lt;artifactId&gt;avalon-framework&lt;/artifactId&gt;
      &lt;version&gt;4.1.4&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.springframework&lt;/groupId&gt;
      &lt;artifactId&gt;spring-beans&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.springframework&lt;/groupId&gt;
      &lt;artifactId&gt;spring-context&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.springframework&lt;/groupId&gt;
      &lt;artifactId&gt;spring-aop&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.springframework&lt;/groupId&gt;
      &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
      &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;
      &lt;version&gt;2.4&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
      &lt;artifactId&gt;hibernate-annotations&lt;/artifactId&gt;
      &lt;version&gt;3.2.1.ga&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
      &lt;artifactId&gt;hibernate&lt;/artifactId&gt;
      &lt;version&gt;3.2.1.ga&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.springframework&lt;/groupId&gt;
      &lt;artifactId&gt;spring-hibernate3&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.transaction&lt;/groupId&gt;
      &lt;artifactId&gt;jta&lt;/artifactId&gt;
      &lt;version&gt;1.0.1B&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;aspectj&lt;/groupId&gt;
      &lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;
      &lt;version&gt;1.5.3&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;mysql&lt;/groupId&gt;
      &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
      &lt;version&gt;5.0.4&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;commons-dbcp&lt;/groupId&gt;
      &lt;artifactId&gt;commons-dbcp&lt;/artifactId&gt;
      &lt;version&gt;1.2.2&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;commons-lang&lt;/groupId&gt;
      &lt;artifactId&gt;commons-lang&lt;/artifactId&gt;
      &lt;version&gt;2.3&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;
      &lt;artifactId&gt;tapestry-upload&lt;/artifactId&gt;
      &lt;version&gt;5.0.6&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;commons-beanutils&lt;/groupId&gt;
      &lt;artifactId&gt;commons-beanutils&lt;/artifactId&gt;
      &lt;version&gt;1.7.0&lt;/version&gt;
    &lt;/dependency&gt;
	&lt;dependency&gt;
      &lt;groupId&gt;javax.activation&lt;/groupId&gt;
      &lt;artifactId&gt;activation&lt;/artifactId&gt;
      &lt;version&gt;1.1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.mail&lt;/groupId&gt;
      &lt;artifactId&gt;mail&lt;/artifactId&gt;
      &lt;version&gt;1.4&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.codehaus.xfire&lt;/groupId&gt;
      &lt;artifactId&gt;xfire-all&lt;/artifactId&gt;
      &lt;version&gt;1.2.6&lt;/version&gt;
    &lt;/dependency&gt;	

  &lt;/dependencies&gt;
&lt;/project&gt;

</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/204944#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 23:48:21 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/204944</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/204944</guid>
      </item>
      <item>
        <title>T5中使用FckEditor组件</title>
        <author>guanyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lguan.javaeye.com">guanyq</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/204940" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/204940</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1，下载FckEditor，解压，将FckEditor目录拷贝到项目的resource下（相应的精简请参考网上FckEdit配置说明），如：</p>
<p>src\main\resources\com\app\sys\components\fckeditor\FCKeditor_2.4.3</p>
<p>2，编写FckEditorModule和FckEditor类</p>
<p>代码如下：</p>
<p>FckEditor类：</p>
<pre name="code" class="java">package com.app.sys.components.fckeditor;

import org.apache.tapestry.Asset;
import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.PageRenderSupport;
import org.apache.tapestry.annotations.Environmental;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.annotations.Path;
import org.apache.tapestry.corelib.base.AbstractTextField;
import org.apache.tapestry.ioc.annotations.Inject;
import org.apache.tapestry.ioc.services.SymbolSource;
import org.apache.tapestry.services.ClasspathAssetAliasManager;

/**
 * 
 * @author guanyq
 *
 */
public class FckEditor extends AbstractTextField {

	/**
	 * The height of the editor
	 */
	@Parameter(defaultPrefix = "literal", value = "300px")
	private String height;

	/**
	 * The width of the editor
	 */
	@Parameter(defaultPrefix = "literal", value = "100%")
	private String width;

	/**
	 * The toolbar set to be used with this editor. Toolbar sets can be
	 * configured in a {@link #customConfiguration custom configuration}.
	 */
	@Parameter(defaultPrefix = "literal")
	private String toolbarSet;

	/**
	 * A custom configuration for this editor, see the fckeditor manual for
	 * details on custom configurations.
	 */
	@Parameter
	private Asset customConfiguration;

	@Inject
	private ClasspathAssetAliasManager cpam;

	@Inject
	private SymbolSource symbolSource;

	public String getScript(String value) {
		value = value.replace('\r', '\\'); // this is needed for javascript to
		// be able to extend a string across
		// multiple lines
		value = value.replace("'", "'"); // this is needed because the
		// string delimiter is ' for the
		// script below

		return String.format("var oFCKeditor = new FCKeditor( '%s' );\n", getClientId()) + String.format("oFCKeditor.BasePath = '%s';\n", cpam.toClientURL(symbolSource.expandSymbols("${com.app.sys.components.fckeditorscript.path}")) + "/")
				+ // todo could this be done in another way?
				(customConfiguration == null ? "" : String.format("oFCKeditor.Config[\"CustomConfigurationsPath\"] = '%s';\n", customConfiguration)) + (toolbarSet == null ? "" : String.format("oFCKeditor.ToolbarSet = '%s'\n", toolbarSet)) + String.format("oFCKeditor.Height = '%s';\n", height) + String.format("oFCKeditor.Width = '%s';\n", width)
				+ String.format("oFCKeditor.Value = \'%s\';\n", value) + "oFCKeditor.Create() ;\n";
	}

	@Environmental
	private PageRenderSupport _pageRenderSupport;

	@Inject
	@Path("${com.app.sys.components.fckeditorscript}/fckeditor.js")
	private Asset fckeditor;

	void beginRender(MarkupWriter writer) {
		_pageRenderSupport.addScriptLink(fckeditor);
	}

	@Override
	protected final void writeFieldTag(MarkupWriter writer, String value) {
		writer.element("script", "type", "text/javascript");
		writer.writeRaw("&lt;!--\n" + getScript(value) + "//--&gt;\n");
	}

	final void afterRender(MarkupWriter writer) {
		writer.end(); // script
	}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>FckEditorModule类：</p>
<pre name="code" class="java">package com.app.sys.components.fckeditor;

import org.apache.tapestry.ioc.Configuration;
import org.apache.tapestry.ioc.MappedConfiguration;
import org.apache.tapestry.ioc.annotations.Symbol;
import org.apache.tapestry.services.LibraryMapping;

/**
 * FckEditor组件使用的Module
 * @author guanyq
 *
 */
public class FckEditorModule {

	public static void contributeFactoryDefaults(
			MappedConfiguration&lt;String, String&gt; configuration) {
		configuration
				.add("com.app.sys.components.fckeditorscript",
						"classpath:${com.app.sys.components.fckeditorscript.path}");
		configuration
				.add("com.app.sys.components.fckeditorscript.path",
						"com/app/sys/components/fckeditor/FCKeditor_2.4.3");
	}

	public static void contributeClasspathAssetAliasManager(
			MappedConfiguration&lt;String, String&gt; configuration,
			@Symbol("com.app.sys.components.fckeditorscript.path")
			String fckEditorScriptPath) {
		configuration.add("FCKeditor/", fckEditorScriptPath + "/");
	}

	public static void contributeComponentClassResolver(
			Configuration&lt;LibraryMapping&gt; configuration) {
		configuration.add(new LibraryMapping("fckeditor",
				"com.app.sys.components.fckeditorscript"));
	}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>3，在SysModule中加载组件：</p>
<pre name="code" class="java">package com.app.sys.services;

import java.io.IOException;
import java.io.PrintWriter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.Link;
import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.internal.services.LinkFactory;
import org.apache.tapestry.internal.services.PageMarkupRenderer;
import org.apache.tapestry.internal.services.PageResponseRenderer;
import org.apache.tapestry.internal.services.RequestPageCache;
import org.apache.tapestry.internal.structure.Page;
import org.apache.tapestry.ioc.MappedConfiguration;
import org.apache.tapestry.ioc.OrderedConfiguration;
import org.apache.tapestry.ioc.ServiceBinder;
import org.apache.tapestry.ioc.annotations.InjectService;
import org.apache.tapestry.ioc.annotations.SubModule;
import org.apache.tapestry.ioc.annotations.Symbol;
import org.apache.tapestry.services.ActionResponseGenerator;
import org.apache.tapestry.services.ApplicationInitializer;
import org.apache.tapestry.services.ApplicationInitializerFilter;
import org.apache.tapestry.services.BindingFactory;
import org.apache.tapestry.services.BindingSource;
import org.apache.tapestry.services.ComponentClassResolver;
import org.apache.tapestry.services.Context;
import org.apache.tapestry.services.Dispatcher;
import org.apache.tapestry.services.MarkupWriterFactory;
import org.apache.tapestry.services.PageRenderRequestHandler;
import org.apache.tapestry.services.Request;
import org.apache.tapestry.services.RequestExceptionHandler;
import org.apache.tapestry.services.RequestFilter;
import org.apache.tapestry.services.RequestGlobals;
import org.apache.tapestry.services.RequestHandler;
import org.apache.tapestry.services.Response;

import com.app.sys.common.exception.RedirectException;
import com.app.sys.components.fckeditor.FckEditorModule;

@SubModule( { FckEditorModule.class })
public class CsmModule {
	static Log log = LogFactory.getLog(CsmModule.class);

	/**
	 * 系统启动时、绑定service
	 * 
	 * @param binder
	 */
	public static void bind(ServiceBinder binder) {


	}

	/**
	 * 初始化上下文
	 * 
	 * @param configuration
	 */
	public void contributeApplicationInitializer(OrderedConfiguration&lt;ApplicationInitializerFilter&gt; configuration) {
		ApplicationInitializerFilter clearCaches = new ApplicationInitializerFilter() {

			public void initializeApplication(Context context, ApplicationInitializer initializer) {
				initializer.initializeApplication(context);

			}

		};
		configuration.add("initialDataBase", clearCaches);
	}

	/**
	 * PageResponseRenderer UTF-8编码
	 * 
	 * @param markupRenderer
	 * @param markupWriterFactory
	 * @param delegate
	 * @return
	 */
	public static PageResponseRenderer decoratePageResponseRenderer(@InjectService("PageMarkupRenderer")
	final PageMarkupRenderer markupRenderer, @InjectService("MarkupWriterFactory")
	final MarkupWriterFactory markupWriterFactory, final Object delegate) {
		return new PageResponseRenderer() {
			public void renderPageResponse(Page page, Response response) throws IOException {
				MarkupWriter writer = markupWriterFactory.newMarkupWriter();
				markupRenderer.renderPageMarkup(page, writer);
				PrintWriter pw = response.getPrintWriter("text/html; charset=UTF-8");
				writer.toMarkup(pw);
				pw.flush();
			}
		};
	}

	/**
	 * RequestFilter UTF-8编码
	 * 
	 * @param requestGlobals
	 * @return
	 */
	public RequestFilter buildUtf8Filter(@InjectService("RequestGlobals")
	final RequestGlobals requestGlobals) {
		return new RequestFilter() {
			public boolean service(Request request, Response response, RequestHandler handler) throws IOException {
				requestGlobals.getHTTPServletRequest().setCharacterEncoding("UTF-8");
				return handler.service(request, response);
			}
		};
	}

	/**
	 * contributeRequestHandler Utf8Filter
	 * 
	 * @param configuration
	 * @param timingFilter
	 * @param encodingFilter
	 */

	public void contributeRequestHandler(OrderedConfiguration&lt;RequestFilter&gt; configuration, @InjectService("Utf8Filter")
	final RequestFilter encodingFilter) {
		configuration.add("Utf8Filter", encodingFilter);
		// configuration.add("TimingFilter", timingFilter);
	}

	/**
	 * 扩展binding source,实现一个list的绑定.
	 * 
	 * @param configuration
	 * @param bindingSource
	 */
	public static void contributeBindingSource(MappedConfiguration&lt;String, BindingFactory&gt; configuration, BindingSource bindingSource) {
		configuration.add("list", new ListBindingFactory(bindingSource));
	}

	public void contributeMasterDispatcher(OrderedConfiguration&lt;Dispatcher&gt; configuration, PageRenderRequestHandler pageRenderRequestHandler, ComponentClassResolver componentClassResolver,
			@Symbol("tapestry.start-page-name")
			String startPageName, @InjectService("PageResponseRenderer")
			PageResponseRenderer pageResponseRenderer) {
		class RootPathDispatcherFix implements Dispatcher {
			private final ComponentClassResolver _componentClassResolver;

			private final PageRenderRequestHandler _handler;

			@SuppressWarnings("unused")
			private final PageResponseRenderer _renderer;

			private final String _startPageName;

			private final String[] _emptyContext = new String[0];

			public RootPathDispatcherFix(final ComponentClassResolver componentClassResolver, final PageRenderRequestHandler handler, final PageResponseRenderer renderer, final String startPageName) {
				_componentClassResolver = componentClassResolver;
				_handler = handler;
				_renderer = renderer;
				_startPageName = startPageName;
			}

			public boolean dispatch(Request request, final Response response) throws IOException {
				// Only match the root path
				if (!request.getPath().equals("/"))
					return false;
				if (_componentClassResolver.isPageName(_startPageName)) {
					ActionResponseGenerator responseGenerator = _handler.handle(_startPageName, _emptyContext);

					if (responseGenerator != null)
						responseGenerator.sendClientResponse(response);
					return true;
				}
				return false;
			}
		}

		// Looks for the root path and renders the start page
		configuration.add("RootPathFix", new RootPathDispatcherFix(componentClassResolver, pageRenderRequestHandler, pageResponseRenderer, startPageName), "before:RootPath");
	}

	// handle RedirectException
	/**
	 * 异常处理
	 */
	public static RequestExceptionHandler decorateRequestExceptionHandler(final Object delegate, final Response response, final RequestPageCache requestPageCache, final LinkFactory linkFactory,
			final ComponentClassResolver resolver) {
		return new RequestExceptionHandler() {
			public void handleRequestException(Throwable exception) throws IOException {
				// check if wrapped
				Throwable cause = exception;
				if (exception.getCause() instanceof RedirectException) {
					cause = exception.getCause();
				}

				// check for redirect
				if (cause instanceof RedirectException) {
					// check for class and string
					RedirectException redirect = (RedirectException) cause;
					Link pageLink = redirect.getPageLink();
					if (pageLink == null) {
						// handle Class (see ClassResultProcessor)
						String pageName = redirect.getMessage();
						Class&lt;?&gt; pageClass = redirect.getPageClass();
						if (pageClass != null) {
							pageName = resolver.resolvePageClassNameToPageName(pageClass.getName());
						}

						// handle String (see StringResultProcessor)
						Page page = requestPageCache.get(pageName);
						pageLink = linkFactory.createPageLink(page, false);
					}

					// handle Link redirect
					if (pageLink != null) {
						response.sendRedirect(pageLink.toRedirectURI());
						return;
					}
				}

				// no redirect so pass on the exception
				((RequestExceptionHandler) delegate).handleRequestException(exception);
			}
		};
	}

}
</pre>
<p>4，编写FCKConfig.js（拷贝修改）&nbsp;</p>
<p>\src\main\resources\js\fckeditor\FCKConfig.js</p>
<p>内容：</p>
<pre name="code" class="js">FCKConfig.ToolbarSets["CommunityToolbarSet"] = 
[
 ['Preview','-','Templates'],
 ['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],
 ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
 '/',
 ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
 ['OrderedList','UnorderedList','-','Outdent','Indent'],
 ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
 ['Link','Unlink','Anchor'],
 ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
 '/',
 ['Style','FontFormat','FontName','FontSize'],
 ['TextColor','BGColor'],
 ['FitWindow','-','About'] 
];

var FCKeditorAPI;
function InitializeAPI(){
    var A = window.parent;
    if (!(FCKeditorAPI = A.FCKeditorAPI)) {
        var B = 'var FCKeditorAPI = {Version : "2.4.3",VersionBuild : "15657",__Instances : new Object(),GetInstance : function( name ){return this.__Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.__Instances ){var oEditor = FCKeditorAPI.__Instances[ name ] ;if ( oEditor.GetParentForm &amp;&amp; oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue	: {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length &gt; 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';
        if (A.execScript) 
            A.execScript(B, 'JavaScript');
        else {
            if (FCKBrowserInfo.IsGecko10) {
                eval.call(A, B);
            }
            else 
                if (FCKBrowserInfo.IsSafari) {
                    var C = A.document;
                    var D = C.createElement('script');
                    D.appendChild(C.createTextNode(B));
                    C.documentElement.appendChild(D);
                }
                else 
                    A.eval(B);
        };
        FCKeditorAPI = A.FCKeditorAPI;
    };
    FCKeditorAPI.__Instances[FCK.Name] = FCK;
};
function _AttachFormSubmitToAPI(){
    var A = FCK.GetParentForm();
    if (A) {
        FCKTools.AddEventListener(A, 'submit', FCK.UpdateLinkedField);
        if (!A._FCKOriginalSubmit &amp;&amp; (typeof(A.submit) == 'function' || (!A.submit.tagName &amp;&amp; !A.submit.length))) {
            A._FCKOriginalSubmit = A.submit;
            A.submit = FCKeditorAPI._FormSubmit;
        }
    }
};
function FCKeditorAPI_Cleanup(){
    delete FCKeditorAPI.__Instances[FCK.Name];
};
FCKTools.AddEventListener(window, 'unload', FCKeditorAPI_Cleanup);
</pre>
<p>&nbsp;</p>
<p>4，使用：</p>
<p>页面类中代码如下：</p>
<p>&nbsp;@Inject<br />&nbsp;@Path("classpath:/js/fckeditor/FCKConfig.js")<br />&nbsp;private Asset fckConfig;</p>
<p>&nbsp;/**<br />&nbsp; * @return Returns the fckConfig.<br />&nbsp; */<br />&nbsp;public Asset getFckConfig() {<br />&nbsp;&nbsp;return fckConfig;<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>tml文件代码如下：</p>
<p>&lt;span t:type="fckeditor/" t:id="content" height="310px" width="100%" customConfiguration="fckConfig" toolbarSet="AppToolbarSet"/&gt;</p>
<p>&nbsp;</p>
<p>页面类中通过content获取对应内容</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/204940#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 23:25:34 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/204940</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/204940</guid>
      </item>
      <item>
        <title>T5中使用自定义SelectMultiple组件</title>
        <author>guanyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lguan.javaeye.com">guanyq</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/204825" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/204825</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>刚把东西都整理好了，已经贴进来了，不小心又给弄没了，气死我了，这次只把主要部分写出来，过程就不做过多描述，看代码是最直接的事情：</p>
<p>1，SelectMultiple类：</p>
<pre name="code" class="java">import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.OptionModel;
import org.apache.tapestry.SelectModel;
import org.apache.tapestry.SelectModelVisitor;
import org.apache.tapestry.annotations.BeforeRenderTemplate;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.corelib.base.AbstractField;
import org.apache.tapestry.ioc.annotations.Inject;
import org.apache.tapestry.services.FormSupport;
import org.apache.tapestry.services.Request;

import xxx.models.SelectMultipleModelRenderer;

/**
 * Multiple Select组件
 * 
 * @author guanyq
 * 
 */
public final class SelectMultiple extends AbstractField {
	private class Renderer extends SelectMultipleModelRenderer {

		public Renderer(MarkupWriter writer) {
			super(writer);
		}

		@Override
		protected boolean isOptionSelected(OptionModel optionModel) {
			Object value = optionModel.getValue();
			return (_values == null) ? false : hasValue(value);
		}
	}

	private boolean hasValue(Object obj) {
		boolean bo = false;
		for (int i = 0; i &lt; _values.length; i++) {
			if (_values[i].equals(obj)) {
				bo = true;
				break;
			}
		}
		return bo;
	}

	// 请求request
	@Inject
	private Request _request;

	// model
	@Parameter(required = true)
	private SelectModel _model;

	// 提交页面时，提交的值
	@Parameter
	private Object[] _values;

	// 选择框行数
	@Parameter
	private String _size;

	// 选择框样式
	@Parameter
	private String _style;

	@Override
	@SuppressWarnings("unchecked")
	protected void processSubmission(FormSupport formSupport, String elementName) {
		_values = _request.getParameters(elementName);
	}

	void afterRender(MarkupWriter writer) {
		writer.end();
	}

	void beginRender(MarkupWriter writer) {
		if (_size != null &amp;&amp; _style != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple", "size", _size, "style", _style);
		else if (_size != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple", "size", _size);
		else if (_style != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple", "style", _style);
		else if (_style != null)
			writer.element("select", "name", getElementName(), "id", getClientId(), "multiple", "multiple");
	}

	@BeforeRenderTemplate
	void options(MarkupWriter writer) {
		SelectModelVisitor renderer = new Renderer(writer);

		_model.visit(renderer);
	}

	void setModel(SelectModel model) {
		_model = model;
	}

	void setValues(Object[] values) {
		_values = values;
	}

}
</pre>
<p>&nbsp;这个类切记要放在项目的components包下，否则页面使用时找不到该组件</p>
<p>&nbsp;</p>
<p>2，SelectMultipleModelRenderer类：</p>
<pre name="code" class="java">import java.util.Map;

import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.OptionGroupModel;
import org.apache.tapestry.OptionModel;
import org.apache.tapestry.SelectModelVisitor;

/**
 * 页面元素输出类
 * 
 * @author guanyq
 * 
 */
public class SelectMultipleModelRenderer implements SelectModelVisitor {
	private final MarkupWriter _writer;

	public SelectMultipleModelRenderer(final MarkupWriter writer) {
		_writer = writer;
	}

	public void beginOptionGroup(OptionGroupModel groupModel) {
		_writer.element("optgroup", "label", groupModel.getLabel());

		writeDisabled(groupModel.isDisabled());
		writeAttributes(groupModel.getAttributes());
	}

	public void endOptionGroup(OptionGroupModel groupModel) {
		_writer.end();
	}

	@SuppressWarnings("unchecked")
	public void option(OptionModel optionModel) {
		// 取得optionModel中存放的对象值（option的value）
		Object optionValue = optionModel.getValue();
		// 取得optionModel中存放的对象key（option的text）
		String optionLabel = optionModel.getLabel();

		_writer.element("option", "value", optionValue.toString());

		if (isOptionSelected(optionModel))
			_writer.attributes("selected", "selected");

		writeDisabled(optionModel.isDisabled());
		writeAttributes(optionModel.getAttributes());

		_writer.write(optionLabel);

		_writer.end();
	}

	private void writeDisabled(boolean disabled) {
		if (disabled)
			_writer.attributes("disabled", "disabled");
	}

	private void writeAttributes(Map&lt;String, String&gt; attributes) {
		if (attributes == null)
			return;

		for (Map.Entry&lt;String, String&gt; e : attributes.entrySet())
			_writer.attributes(e.getKey(), e.getValue());
	}

	protected boolean isOptionSelected(OptionModel optionModel) {
		return false;
	}

}</pre>
<p>&nbsp;</p>
<p>3，GenericSelectionModel类：</p>
<pre name="code" class="java">
import java.util.ArrayList;
import java.util.List;

import org.apache.tapestry.OptionGroupModel;
import org.apache.tapestry.OptionModel;
import org.apache.tapestry.internal.OptionModelImpl;
import org.apache.tapestry.ioc.services.PropertyAccess;
import org.apache.tapestry.util.AbstractSelectModel;

/**
 * 
 * @author guanyq
 * 
 * @param &lt;T&gt;
 */
public class GenericSelectionModel&lt;T&gt; extends AbstractSelectModel {

	// option text
	private String labelField;

	// option value
	private String keyField;

	// 组装option的对象list
	private List&lt;T&gt; list;

	// 获取对象属性对象
	private final PropertyAccess adapter;

	public GenericSelectionModel(List&lt;T&gt; list, String labelField, String keyField, PropertyAccess adapter) {
		this.labelField = labelField;
		this.keyField = keyField;
		this.list = list;
		this.adapter = adapter;
	}

	public List&lt;OptionGroupModel&gt; getOptionGroups() {
		return null;
	}

	public List&lt;OptionModel&gt; getOptions() {
		if (list == null) {
			return null;
		}
		List&lt;OptionModel&gt; optionModelList = new ArrayList&lt;OptionModel&gt;();
		for (T obj : list) {
			if (labelField == null || labelField.equals("") || keyField == null || keyField.equals("")) {
				optionModelList.add(new OptionModelImpl(obj + "", false, obj, new String[0]));
			} else {
				optionModelList.add(new OptionModelImpl(adapter.get(obj, labelField) + "", false, adapter.get(obj, keyField) + "", new String[0]));
			}
		}
		return optionModelList;
	}
}</pre>
<p>&nbsp;&nbsp;2和3两个类可以随便放在你想放的位置，只要程序能找到</p>
<p>页面类使用方法：</p>
<pre name="code" class="java">//原数据列表	

@SuppressWarnings("unchecked")
	public GenericSelectionModel getActSelect() {
		return new GenericSelectionModel&lt;Act&gt;((List) col, "alias", "ActId", adapter);	}

//空数据列表（选中后的保存列表）

	@SuppressWarnings("unchecked")
	public GenericSelectionModel getNullSelect() {
		return new GenericSelectionModel&lt;Act&gt;(null, "", "", null);
	}
</pre>
<p>&nbsp;注意页面类要引入&nbsp;</p>
<p>@Inject<br />&nbsp;private PropertyAccess adapter;</p>
<p>&nbsp;</p>
<p>其中col中存放的的是bean列表，如Act列表值，alias是需要在select中显示的text，ActId是select中的value（这2个值都是通过adapter读取bean获得对应值）</p>
<p>&nbsp;</p>
<p>tml文件是否方法：</p>
<pre name="code" class="html">&lt;!---原数据列表-&gt;
&lt;t:selectmultiple t:id="select1" model="ActSelect" size="4" style="literal:width:120px"/&gt;

&lt;!---空数据列表-&gt;
&lt;t:selectmultiple values="ActIds" t:id="select2" model="NullSelect" size="4" style="literal:width:120px"&gt;</pre>
<p>&nbsp;其中ActIds在页面类中定义一个list接受提交值即可</p>
<p>&nbsp;</p>
<p>顺便贴出js代码：</p>
<pre name="code" class="js">/**
 * 多选下拉框，添加选项
 */
function addmen(){
    var d = document.getElementById('select1');
    var s = document.getElementById('select2');
    for (var i = 0; i &lt; d.options.length; i++) {
        if (d.options[i].selected) {
            var obj = new Option(d.options[i].text, d.options[i].value);
            s.options.add(obj);
            d.removeChild(d.options[i]);
        }
    }
    return false;
}

/**
 * 全部添加
 */
function allmen(){
    var d = document.getElementById('select1');
    var s = document.getElementById('select2');
    for (var i = 0; i &lt; d.options.length; i++) {
        s.options.add(new Option(d.options[i].text, d.options[i].value));
    }
    for (var i = d.options.length - 1; i &gt;= 0; i--) {
        d.removeChild(d.options[i]);
    }
}

/**
 * 取消选中项
 */
function returnmen(){
    var d = document.getElementById('select1');
    var r = document.getElementById('select2');
    for (i = 0; i &lt; r.options.length; i++) {
        if (true == r.options[i].selected) {
            var obj = new Option(r.options[i].text, r.options[i].value);
            r.removeChild(r.options[i]);
            d.options.add(obj);
        }
    }
    return false;
}</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/204825#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 21:18:30 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/204825</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/204825</guid>
      </item>
      <item>
        <title>T5中使用DatePicker</title>
        <author>guanyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lguan.javaeye.com">guanyq</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/204813" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/204813</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>由于T5自带的时间控件感觉比较难看，特换成DatePicker</p>
<p>方法如下：</p>
<p>1，下载DatePicker包，DatePicker目录下有：lang目录，skin目录，calendar.js，config.js，My97DatePicker.htm，WdatePicker.js几个文件</p>
<p>2，将DatePicker整个目录拷贝到项目的js目录下</p>
<p>3，页面中引入DatePicker，代码如下：</p>
<p>&lt;script language="javascript" type="text/javascript" src='${contextPath}/js/DatePicker/WdatePicker.js'/&gt;</p>
<p>4，输入框处使用如下：</p>
<p>&lt;input t:type="TextField" t:id="overDate" size="15" onclick="new WdatePicker(this,'%Y-%M-%D',false)" class="Wdate" MINDATE="#Year#-#Month#-{#Day#+1}"/&gt;</p>
<p>&nbsp;</p>
<p>关于DatePicker的详细使用与配置说明，请参考DatePicker使用说明</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/204813#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 20:53:22 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/204813</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/204813</guid>
      </item>
      <item>
        <title>T5+spring2.0+hibernate3.2使用OpenSessionInViewFilter</title>
        <author>guanyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lguan.javaeye.com">guanyq</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/204801" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/204801</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>按照网上讲的方法，在web.xml文件中加入filter，在页面访问延时加载的数据时，报session关闭的错误，仔细检查代码未发现问题 <br />后又仔细检查了web.xml文件，尝试调整了filter的顺序，居然成功了 <br />现将各部分代码贴出来 </p>
<p>例子有三个类，分别是：Man,Address,Phone</p>
<p>分别存放人的信息，人的地址，人的电话号码</p>
<p>详细请看代码<br />web.xml文件内容：</p>
<p>&nbsp;</p>
<pre name="code" class="xml">&lt;!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;
&lt;web-app&gt;
	&lt;display-name&gt;cs Tapestry Application&lt;/display-name&gt;
	
	&lt;context-param&gt;
		&lt;param-name&gt;tapestry.app-package&lt;/param-name&gt;
		&lt;param-value&gt;com.me.sys&lt;/param-value&gt;
	&lt;/context-param&gt;
	&lt;!--
	&lt;context-param&gt;
		&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
		&lt;param-value&gt;/WEB-INF/applicationContext.xml &lt;/param-value&gt;
	&lt;/context-param&gt;	
	--&gt;
	&lt;filter&gt;
		&lt;filter-name&gt;setcharacterencodingfilter&lt;/filter-name&gt;
		&lt;filter-class&gt;
			org.springframework.web.filter.CharacterEncodingFilter
		&lt;/filter-class&gt;
		&lt;init-param&gt;
			&lt;param-name&gt;encoding&lt;/param-name&gt;
			&lt;param-value&gt;UTF-8&lt;/param-value&gt;
		&lt;/init-param&gt;
		&lt;init-param&gt;
			&lt;param-name&gt;forceEncoding&lt;/param-name&gt;
			&lt;param-value&gt;true&lt;/param-value&gt;
		&lt;/init-param&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;setcharacterencodingfilter&lt;/filter-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;
	
	<span style="color: #ff0000;">&lt;!--OpenSessionInViewFilter的filter一定要放在TapestrySpringFilter的前面，否则请求会被Tapestry截获，就会出先session关闭的问题--&gt;</span>
    &lt;filter&gt;
    	&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;
		&lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;
		&lt;init-param&gt;
			&lt;param-name&gt;singleSession&lt;/param-name&gt;
			&lt;param-value&gt;true&lt;/param-value&gt;
		&lt;/init-param&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;	
	
	
	&lt;filter&gt;
		&lt;filter-name&gt;sys&lt;/filter-name&gt;
		&lt;filter-class&gt;org.apache.tapestry.spring.TapestrySpringFilter&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;sys&lt;/filter-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;
	

 	
	
	&lt;listener&gt;
		&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
	&lt;/listener&gt;
	
	.....
	
&lt;/web-app&gt;</pre>
<p>&nbsp;</p>
<p>Man类代码：</p>
<pre name="code" class="java">import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Proxy;

@Entity
public class Man implements Serializable {
	private static final long serialVersionUID = 1L;

	private int id;

	private String name;

	private Address address;

	private List&lt;Phone&gt; phones = new ArrayList&lt;Phone&gt;();

	public Man() {

	}

	public Man(String name, Address address, List&lt;Phone&gt; phones) {
		this.name = name;
		this.address = address;
		this.phones = phones;
	}

	@OneToOne(fetch = FetchType.LAZY)@JoinColumn(name = "addressId", nullable = true)
	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "man", fetch = FetchType.LAZY)
	public List&lt;Phone&gt; getPhones() {
		return phones;
	}

	public void setPhones(List&lt;Phone&gt; phones) {
		this.phones = phones;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
</pre>
<p>&nbsp;Address类代码：</p>
<pre name="code" class="java">import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
public class Address implements Serializable {
	private static final long serialVersionUID = 1L;

	private int id;

	private String address;

	public Address() {
	}

	public Address(String address) {
		this.address = address;
	}

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}</pre>
<p>&nbsp;</p>
<p>Phone类代码：</p>
<pre name="code" class="java">import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Proxy;

@Entity
public class Phone implements Serializable {
	private static final long serialVersionUID = 1L;

	private int id;

	private String code;

	private Man man;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "manId", nullable = false)
	public Man getMan() {
		return man;
	}

	public void setMan(Man man) {
		this.man = man;
	}

	public Phone() {

	}

	public Phone(String code) {
		this.code = code;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}
</pre>
<p>&nbsp;</p>
<p>service部分代码就不贴了，下面贴下TestMan1.tml代码：</p>
<pre name="code" class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"&gt;
    &lt;form t:type="form"&gt;
        &lt;t:loop source="Mans" value="man"&gt;
            ${man.name}
            &lt;t:loop source="Phones" value="phone"&gt;
                ${phone.code}
            &lt;/t:loop&gt;
            &lt;br/&gt;
        &lt;/t:loop&gt;
    &lt;/form&gt;
&lt;/html&gt;</pre>
<p>&nbsp;</p>
<p>TestMan1.java代码：</p>
<pre name="code" class="java">public class TestMan1{
	private static final Log log = LogFactory.getLog(TestMan1.class);

	public static final long serialVersionUID = 1L;


	private Man man;

	private Phone phone;

	public Collection&lt;Man&gt; getMans() {
		return(Collection) getTestService().getMans();
	}

	public Collection&lt;Phone&gt; getPhones() {
		return man.getPhones();
	}

	public Man getMan() {
		return man;
	}

	public void setMan(Man man) {
		this.man = man;
	}

	public Phone getPhone() {
		return phone;
	}

	public void setPhone(Phone phone) {
		this.phone = phone;
	}
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/204801#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 20:07:22 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/204801</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/204801</guid>
      </item>
      <item>
        <title>利用DWR处理回调函数返回的list集合，并填充select</title>
        <author>zhaoyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhaoyl.javaeye.com">zhaoyl</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/200103" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/200103</a>&nbsp;
          发表时间: 2008年06月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><br /><strong>/**</strong></p>
<p><strong>**QQ:252574345</strong></p>
<p><strong>**MSN:lele_love_lomboz@hotmail.com</strong></p>
<p><strong>*/</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>本文并未提供完整源代码，请见谅</p>
<p><br /><strong>1、配置dwr.xml</strong><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "<a href="http://www.getahead.ltd.uk/dwr/dwr10.dtd">http://www.getahead.ltd.uk/dwr/dwr10.dtd</a>"&gt;<br />&lt;dwr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;allow&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;create creator="new" javascript="status"&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;param name="class" value="StatusBusiness"/&gt; &nbsp;&nbsp;&nbsp;//为DWR实现类<br />&nbsp;&nbsp;&lt;/create&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;convert converter="bean" match=User"&gt; //PO类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/convert&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp; &lt;/allow&gt;<br />&lt;/dwr&gt;</p>
<p><br /><strong>2、DWR类:StatusBusiness类</strong><br />&nbsp; /**<br />&nbsp;* 返回select框数据集合<br />&nbsp;* @param id<br />&nbsp;* @param action<br />&nbsp;* @return<br />&nbsp;*/<br />public List getSelectList(String id,String action){<br />&nbsp;<br />&nbsp;<br />//为文章结构清晰，以下代码省略</p>
<p>//此list为PO类user的集合<br />&nbsp;return list;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />}</p>
<p><br /><strong>3、PO类</strong><br />public class User extends BasePO<br />{</p>
<p><br />private String id;<br />private String name;<br />//getter and setter</p>
<p><br />}</p>
<p><br /><strong>4、AJAX:dwr处理</strong><br />...页面中<br />&lt;script&gt;<br />function initUserGroup(id,selectobj){</p>
<p><br />&nbsp;&nbsp; var edatasetid="12wsw83ks";<br />&nbsp;&nbsp; var eaction="action=getUserlist&amp;id="+id;<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; status.getSelectList(edatasetid,eaction,getListEditx);<br />&nbsp;&nbsp; function getListEditx(data)<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; if(null!=data&amp;&amp;data.size&gt;0)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp; <br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; //清除原select,否则重复对select赋值<br />&nbsp;&nbsp; optionsClear(selectobj);</span><br />&nbsp;&nbsp; for(var i=0;i&lt;data.length;i++)<br />&nbsp;&nbsp; {<br /><span style="color: #ff0000;">&nbsp;&nbsp; //将回调函数返回的list对象边历,循环取出PO类对象user的id和name属性,放在页面上对应select里</span><br />&nbsp;&nbsp; selectobj.options[selectobj.options.length] = new Option(data[i].id,data[i].name);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; }</p>
<p><br />}<br />&lt;script&gt;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/200103#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jun 2008 14:57:14 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/200103</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/200103</guid>
      </item>
      <item>
        <title>tapestry登陆验证问题</title>
        <author>lean1252</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://asflex.javaeye.com">lean1252</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/199912" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/199912</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>大家好，我现在有一个关于tapestry验证的问题，我的一个需求是当用户登陆时，如果验证失败，将返回登陆页，如果成功则新开一个窗口，显示登陆成功信息。</p>
<p>首先我把自己的想法给介绍一下</p>
<p>1 用户登陆失败，我让target="_self",同时停留在登陆页，并显示校验信息。</p>
<p>2 验证成功，新打开一个页，此时的target="_blank",同样返回登陆页&mdash;&mdash;&mdash;&gt;登陆页根据返回的一个标识确定是否可以 跳转，如果跳转，表单将自动提交（此时是用js去获得前台的标识的）。跳转时，重新执行了一次登陆监听方法</p>
<p>&nbsp;</p>
<p>但是好像似乎不管用，你们觉得我的思路是不是有问题，忘赐教。：）</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/199912#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/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>Tue, 03 Jun 2008 23:00:38 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/199912</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/199912</guid>
      </item>
      <item>
        <title>在netbeans中建立完整的Tapestry5开发环境</title>
        <author>tapestry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tapestry.javaeye.com">tapestry</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/193497" style="color:red;">http://tapestrying.group.javaeye.com/group/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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/maven_thumb.png" border="0" height="417" alt="maven" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/webapplications_thumb.png" border="0" height="417" alt="webapplications" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/newproject_thumb.png" border="0" height="438" alt="newproject" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/quickstart_thumb.png" border="0" height="480" alt="quickstart" style="border: 0px none;" width="605" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/parameters_thumb.png" border="0" height="362" alt="parameters" style="border: 0px none;" width="600" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maven插件会下载依赖库并根据定制的参数新建项目，项目建好后，如图所示文件结构。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/file.png"><img src="http://www.tapestry5.com/images/netbeansTapestry5_13712/file_thumb.png" border="0" height="376" alt="file" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/jettyrun_thumb.png" border="0" height="421" alt="jettyrun" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/run_thumb.png" border="0" height="444" alt="run" style="border: 0px none;" width="600" />
</a>
 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单击我们部署的项目mavenproject1，可以看到项目成功运行,如图所示。</p>
<p><a href="http://www.tapestry5.com/images/netbeansTapestry5_13712/mavenproject1.png"><img src="http://www.tapestry5.com/images/netbeansTapestry5_13712/mavenproject1_thumb.png" border="0" height="444" alt="mavenproject1" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/build_thumb.png" border="0" height="453" alt="build" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/toolbar_thumb.png" border="0" height="387" alt="toolbar" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/tml_thumb.png" border="0" height="414" alt="tml" style="border: 0px none;" width="600" />
</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 src="http://www.tapestry5.com/images/netbeansTapestry5_13712/html_thumb.png" border="0" height="387" alt="html" style="border: 0px none;" width="600" />
</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://tapestrying.group.javaeye.com/group/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 00:09:24 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/193497</link>
        <guid>http://tapestrying.group.javaeye.com/group/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://tapestrying.group.javaeye.com/group/blog/193114" style="color:red;">http://tapestrying.group.javaeye.com/group/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 title="Double click to show line number." class="hl-main ln-hide" 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 title="Double click to show line number." class="hl-main ln-hide" 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://tapestrying.group.javaeye.com/group/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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 14 May 2008 22:52:31 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/193114</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/193114</guid>
      </item>
      <item>
        <title>数组快速查找算法</title>
        <author>zhxp791008</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhxp791008.javaeye.com">zhxp791008</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/192839" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/192839</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          给你一个固定的数组  比如  1,200,231,200,12,200,1<br />你把2个1和3个200选出来 .<br />大家讨论下.
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/192839#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 09:54:52 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/192839</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/192839</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://tapestrying.group.javaeye.com/group/blog/192400" style="color:red;">http://tapestrying.group.javaeye.com/group/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://tapestrying.group.javaeye.com/group/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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 22:30:16 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/192400</link>
        <guid>http://tapestrying.group.javaeye.com/group/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://tapestrying.group.javaeye.com/group/blog/191803" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/191803</a>&nbsp;
          发表时间: 2008年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p dir="ltr" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
   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://tapestrying.group.javaeye.com/group/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 May 2008 22:39:59 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/191803</link>
        <guid>http://tapestrying.group.javaeye.com/group/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://tapestrying.group.javaeye.com/group/blog/191500" style="color:red;">http://tapestrying.group.javaeye.com/group/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://tapestrying.group.javaeye.com/group/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 17:12:58 +0800</pubDate>
        <link>http://tapestrying.group.javaeye.com/group/blog/191500</link>
        <guid>http://tapestrying.group.javaeye.com/group/blog/191500</guid>
      </item>
      <item>
        <title>Rose4J 模板引擎 2.0 开发完成，性能最大提升30倍</title>
        <author>lthu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lthu.javaeye.com">lthu</a>&nbsp;
          链接：<a href="http://tapestrying.group.javaeye.com/group/blog/162102" style="color:red;">http://tapestrying.group.javaeye.com/group/blog/162102</a>&nbsp;
          发表时间: 2008年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最新内容请参考<a href="http://www.rose4j.cn/">www.rose4j.cn</a></p>
<p>经过几天的整理修正，现在Rose4J的WEB开发引擎2.0终于可以跟大家见面了，前台页面与后台java程序能完全分开，使用两端的工作都变得简单清晰，入门难度几乎为零，附件中是所需要的jar包，请下载试用。 <br /><br />下面我们来看看RoseForJ的模板的使用方法： <br /><br />一、WEB模板代码; <br /><br />HTML 代码 <br /><br />见附件（这里显示不了html代码，郁闷中） <br />从上面模板可以看出RoseForJ只有两个TAG（temp、include）和3个属性（for、id，remove），它也是一个标记语言，写法如下 ${变量表达式} 。 <br /><br />其中3个属性可用于html任何标签（如用于tr ，td等），for表示一个循环，for="${data:dataSet}" ,此时dataSet是一个集合对象或数组，data表示集合对象或数组对象中每一个成员。&nbsp;<br />&nbsp;</p>
<pre name="code" class="html">&lt;ul&gt;
	&lt;li j:for="${data:dataSet}"&gt;
		&lt;span j:id='${data.getName()}' id="showname"&gt;这里显示name&lt;/span&gt;
		&lt;span j:for="${xxx:xxSet}"&gt;
			
			&lt;span j:id='${data.getId()}' id="showid"&gt;这里显示nameID&lt;/span&gt;
			&lt;j:temp j:id='${xxx.getName()}'&gt;这里显示name&lt;/j:temp&gt;
			&lt;img src="http://localhost/roseforj/listImg.do?id=${xxx.getId()}&amp;name=testname" width="200" height="200"/&gt;
			xxx.id=${xxx.getId()} 
		&lt;/span&gt;
	&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>&nbsp; 用法如上，如还有不懂的地方可以参考之前说明，2.0在性能上和非常大的提升，比纯jsp还要快。<br /></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tapestrying.group.javaeye.com/group/blog/162102#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及