<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>我的代码在太阳底下懒洋洋</title>
    <description>www.myjavaserver.com/~allenny/index.jsp</description>
    <link>http://allenny.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>体验Ubuntu做服务器</title>
        <author>allenny</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://allenny.javaeye.com">allenny</a>&nbsp;
          链接：<a href="http://allenny.javaeye.com/blog/153394" style="color:red;">http://allenny.javaeye.com/blog/153394</a>&nbsp;
          发表时间: 2008年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p><p>&nbsp;</p><p>有好几台机器，希望可以将其中一台机器作为服务器，为其他机器提供路由，共享等服务，为了稳定和安全，选择linux作为服务器系统，Ubuntu是非常易用的一个Linux的发行版，我就采用它来做。 </p><p>&nbsp;</p><p>硬件</p><p>&nbsp;</p><p>首先当然是要有一台可以安装Ubuntu的机器（一般不是忒新的机器都可以安装），并且有两个网卡，作为两个网段的网关。</p><p>&nbsp;</p><p>&nbsp;安装配置</p><p>直接安装Ubuntu7.04，安装很顺利，很快安装完了。然后配置网络，将网卡eth0配置为192.168.1.234，因为原来的网段就是192.168.1.0/24，另一块网卡eth1配置为网段192.168.2.0/24的网关192.168.2.1，这样所有其他机器都是局域网192.168.2.0/24内的客户机了。 </p><p>&nbsp;</p><p>用route -n命令可以看到路由表的信息：</p><p>内核 IP 路由表<br />目标&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网关&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子网掩码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标志&nbsp; 跃点&nbsp;&nbsp; 引用&nbsp; 使用 接口<br />192.168.2.0&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255.255.255.0&nbsp;&nbsp; U&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 eth2<br />192.168.1.0&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255.255.255.0&nbsp;&nbsp; U&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 eth0<br />169.254.0.0&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255.255.0.0&nbsp;&nbsp;&nbsp;&nbsp; U&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 eth0<br />0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 192.168.1.1&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UG&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 eth0<br />&nbsp;</p><p>一个是192.168.1.0/24的网关，一个是192.168.2.0/24的网关，还有一个是回路，最后一个是默认路由。</p><p>&nbsp;</p><p>然后是IP转发，很多资料说使用下面的命令打开I转发：</p><p>sudo echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward</p><p>但不知道为什么在Ubuntu下总是说没有操作的权限，只好另寻他路：</p><p>修改/etc/sysctl.conf，在文件的末尾加上：</p><p>net.ipv4.ip_forward=1</p><p>顺便也加上了： </p><p>net.ipv4.tcp_syncookies=1<br />net.ipv4.icmp_echo_ignore_broadcasts=1<br />&nbsp;这个配置会在系统启动的时候设置系统参数，这样IP转发就完成了。</p><p>&nbsp;</p><p>安装防火墙管理工具FireStarter，但是启动时发生以下错误：</p><p><span class="postbody">the device eth0 is not ready</span> </p><p>提示启动失败。使用以下命令即可： </p><p>&nbsp;udo sed -i~ &quot;s/\/sbin\/ifconfig/env LANG=en_US \/sbin\/ifconfig/g&quot; /etc/firestarter/firestarter.sh&nbsp;  
</p>
          <br/>
          <span style="color:red;">
            <a href="http://allenny.javaeye.com/blog/153394#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jan 2008 21:34:37 +0800</pubDate>
        <link>http://allenny.javaeye.com/blog/153394</link>
        <guid>http://allenny.javaeye.com/blog/153394</guid>
      </item>
      <item>
        <title>Tapestry 4 实现自定义组件-CheckboxList</title>
        <author>allenny</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://allenny.javaeye.com">allenny</a>&nbsp;
          链接：<a href="http://allenny.javaeye.com/blog/137095" style="color:red;">http://allenny.javaeye.com/blog/137095</a>&nbsp;
          发表时间: 2007年10月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [本文中的程序在JDK 6, Tapestry 4.1中测试通过]<br />
<br />
用Tapestry自定义组件和创建一个page一样简单，同样要创建三个文件，html模板，配置文件，java类文件，只不过配置文件后缀不是page了，而是jwc。<br />
<br />
<br />
<strong>定义组件的html模板</strong><br />
<br />
组件html模板和page的模板基本差不多，只不过组件模板可以是html的片段，也可以是完整的html文件。我们要实现的CheckboxList只需要一个html片段作为模板：<br />
<br />
<br />
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">table</span><span> </span><span class="attribute">border</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span> </span><span class="attribute">cellpadding</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span> </span><span class="attribute">cellspacing</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">tr</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;allItems&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class="alt"><span>        <span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class=""><span>            <span class="tag">&lt;</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;checkbox&quot;</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;curItem&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span>            <span class="tag">&lt;</span><span class="tag-name">span</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;curItemLabel&quot;</span><span class="tag">&gt;</span><span>Checkbox 1</span><span class="tag"><!--</span--><span class="tag-name">span</span><span class="tag">&gt;</span><span>  </span></span></span></li>
    <li class=""><span>        <span class="tag"><!--</span--><span class="tag-name">td</span><span class="tag">&gt;</span><span>  </span></span></span></li>
    <li class="alt"><span>    <span class="tag"><!--</span--><span class="tag-name">tr</span><span class="tag">&gt;</span><span>  </span></span></span></li>
    <li class=""><span><span class="tag"><!--</span--><span class="tag-name">table</span><span class="tag">&gt;</span><span>  </span></span></span></li>
</ol>
</div>
<br />
将一个表格作为模板，每一个checkbox和一个标签作为一行。<br />
<br />
在<strong>CheckboxList.java</strong>处理类中，添加两个组件的参数：<br />
<br />
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="annotation">@Parameter</span><span>(name = </span><span class="string">&quot;allItems&quot;</span><span>, required = </span><span class="keyword">true</span><span>)  </span></span></li>
    <li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">abstract</span><span> List
    <basepojo> getAllItems();  </basepojo>
    </span></span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="annotation">@Parameter</span><span>(name = </span><span class="string">&quot;selectedItems&quot;</span><span>, required = </span><span class="keyword">false</span><span>)  </span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">abstract</span><span> List
    <basepojo> getSelectedItems();  </basepojo>
    </span></span></li>
</ol>
</div>
<br />
这两个参数接受用户指定的<u>所有checkbox项的集合</u>和<u>组件显示的时候选中项的集合</u>，前者是required，后者是可选的（不指定的话就是不选中任何的checkbox）<br />
<br />
<br />
在<strong>CheckList.jwc</strong>文件中，循环指定给组件参数的allItems：<br />
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;curItem&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;itemIndex&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
</ol>
</div>
<br />
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">component</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;allItems&quot;</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;For&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;source&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;allItems&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;value&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;curItem&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;index&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;itemIndex&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;element&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;literal:tr&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class=""><span><span class="tag"><!--</span--><span class="tag-name">component</span><span class="tag">&gt;</span><span>  </span></span></span></li>
</ol>
</div>
<br />
将curItem和itemIndex输出给CheckboxList模板上的Checkbox组件和Insert组件，分别显示一个Checkbox和一个标签：<br />
<br />
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">component</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;curItem&quot;</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;Checkbox&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;ognl:name&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;value&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;mapping[itemIndex]&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">component</span><span class="tag">&gt;</span><span>  </span></span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">component</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;curItemLabel&quot;</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;Insert&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;value&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;curItem&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">component</span><span class="tag">&gt;</span><span>  </span></span></span></li>
</ol>
</div>
<br />
<br />
注意Checkbox中的value=&quot;mapping[temIndex]&quot;，这个mapping是一个boolean的数组，和allItems中的项一一对应，里面标识了所有的checkbox项的选中情况，某项选中则对应的mapping[i]为true，否则为false。这个mapping 需要我们根据组件使用者给定的两个参数来生成。renderComponent方法是BaseComponent的用于渲染整个组件的方法，我们需要override该方法并在这里生成或者说初始化mapping：<br />
<br />
<div class="code_title">CheckboxList.java<br />
</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span>[] mapping = </span><span class="keyword">null</span><span>;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="annotation">@Override</span><span>  </span></span></li>
    <li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> renderComponent(IMarkupWriter writer, IRequestCycle cycle) {  </span></span></li>
    <li class="alt"><span>        mapping = <span class="keyword">new</span><span> </span><span class="keyword">boolean</span><span>[</span><span class="keyword">this</span><span>.getAllItems().size()];  </span></span></li>
    <li class=""><span>        <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i&lt;</span><span class="keyword">this</span><span>.getAllItems().size();i++){  </span></span></li>
    <li class="alt"><span>            <span class="keyword">if</span><span>(getSelectedItems()==</span><span class="keyword">null</span><span>)</span><span class="keyword">continue</span><span>;  </span></span></li>
    <li class=""><span>            mapping[i] = getSelectedItems().contains(<span class="keyword">this</span><span>.getAllItems().get(i));  </span></span></li>
    <li class="alt"><span>        }  </span></li>
    <li class=""><span>        <span class="keyword">super</span><span>.renderComponent(writer, cycle);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
</ol>
</div>
<br />
然后，你就可以在你的页面中使用CheckboxList组件来显示内容了。<br />
<br />
<div class="code_title">在你的页面中使用CheckboxList组件<br />
</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>    </span><span class="tag">&lt;</span><span class="tag-name">component</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;userSelectionList&quot;</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;CheckboxList&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class=""><span>    <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;literal:userSelectionList&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span>        <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;allItems&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;ognl:allUsers&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class=""><span>        <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;selectedItems&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;ognl:selectdUsers&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">component</span><span class="tag">&gt;</span><span>  </span></span></span></li>
</ol>
</div>
<br />
至此，我们的CheckboxList组件已经可以页面上显示所有的Checkbox项，并正确选中用户指定的Checkbox项了。<br />
但是还没有完，在我们修改这些Checkbox的选中状态后，如何将改动反映给处理类，使之可以将改动保存到DB中呢？<br />
可以看到，虽然我们将选定项集合从参数selectedItems传递到了我们自定义的CheckboxList组件中，但是真正和Checkbox组件绑定的是mapping，所以当你改变某个Checkbox的选中状态后相应的mapping的值会改变，而不会改变参数selectedItems的内容。因此，我们需要自己编码来把他实现了。在前面的CheckboxList.java中的renderComponent后面方法中加入以下语句：<br />
<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">if</span><span>(cycle.isRewinding()){  </span></span></li>
    <li class=""><span>    List
    <basepojo> reselectedList = <span class="keyword">new</span><span> ArrayList
    <basepojo>();  </basepojo>
    </span></basepojo>
    </span></li>
    <li class="alt"><span>    <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i&lt;</span><span class="keyword">this</span><span>.getAllItems().size();i++){  </span></span></li>
    <li class=""><span>        <span class="keyword">if</span><span>(mapping[i] == </span><span class="keyword">false</span><span>)</span><span class="keyword">continue</span><span>;  </span></span></li>
    <li class="alt"><span>        reselectedList.add(<span class="keyword">this</span><span>.getAllItems().get(i));  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>    <span class="keyword">this</span><span>.setSelectedItems(reselectedList);  </span></span></li>
    <li class=""><span>}  </span></li>
</ol>
</div>
调用cycle.isRewinding()方法告诉我们是否是用户提交表单。<br />
完整的renderComponent方法就是：<br />
<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="annotation">@Override</span><span>  </span></span></li>
    <li class=""><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> renderComponent(IMarkupWriter writer, IRequestCycle cycle) {  </span></span></li>
    <li class="alt"><span>    mapping = <span class="keyword">new</span><span> </span><span class="keyword">boolean</span><span>[</span><span class="keyword">this</span><span>.getAllItems().size()];  </span></span></li>
    <li class=""><span>    <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i&lt;</span><span class="keyword">this</span><span>.getAllItems().size();i++){  </span></span></li>
    <li class="alt"><span>        <span class="keyword">if</span><span>(getSelectedItems()==</span><span class="keyword">null</span><span>)</span><span class="keyword">continue</span><span>;  </span></span></li>
    <li class=""><span>        mapping[i] = getSelectedItems().contains(<span class="keyword">this</span><span>.getAllItems().get(i));  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>    <span class="keyword">super</span><span>.renderComponent(writer, cycle);  </span></span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">if</span><span>(cycle.isRewinding()){  </span></span></li>
    <li class="alt"><span>        List
    <basepojo> reselectedList = <span class="keyword">new</span><span> ArrayList
    <basepojo>();  </basepojo>
    </span></basepojo>
    </span></li>
    <li class=""><span>        <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i&lt;</span><span class="keyword">this</span><span>.getAllItems().size();i++){  </span></span></li>
    <li class="alt"><span>            <span class="keyword">if</span><span>(mapping[i] == </span><span class="keyword">false</span><span>)</span><span class="keyword">continue</span><span>;  </span></span></li>
    <li class=""><span>            reselectedList.add(<span class="keyword">this</span><span>.getAllItems().get(i));  </span></span></li>
    <li class="alt"><span>        }  </span></li>
    <li class=""><span>        <span class="keyword">this</span><span>.setSelectedItems(reselectedList);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>}  </span></li>
</ol>
</div>
<br />
<br />
这样，我们CheckboxList就可以和用户指定的选定项的集合完全的绑定起来，就是说既可以取值也可以设值了，一个具有完整功能的自定义组件也就实现啦！
          <br/>
          <span style="color:red;">
            <a href="http://allenny.javaeye.com/blog/137095#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 31 Oct 2007 20:00:42 +0800</pubDate>
        <link>http://allenny.javaeye.com/blog/137095</link>
        <guid>http://allenny.javaeye.com/blog/137095</guid>
      </item>
      <item>
        <title>[原创] Tapestry 学习总结(未完成）</title>
        <author>allenny</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://allenny.javaeye.com">allenny</a>&nbsp;
          链接：<a href="http://allenny.javaeye.com/blog/132967" style="color:red;">http://allenny.javaeye.com/blog/132967</a>&nbsp;
          发表时间: 2007年10月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [请注意，由于Javaeye博客有很多bug，插入文章的代码段的显示有很多的错误，注意自己正确辨别]<br />
<br />
Tapestry给我得第一感觉是想法非常不错，把界面的渲染和界面的数据、逻辑分离的很彻底，但是对于程序员来说写程序并不是很直观。而且有关文档、资料和书籍都不多。特别是一些复杂点的需求不知从何下手。经过一段时间的学习，我也总结了一些，以下所有内容都是基于Tapestry 4.1.3版本的。<br />
<font size="4"><br />
<strong>基础</strong></font> <br />
<hr size="2" width="100%" />
实现一个页面需要有三个文件：*.html, *.page, *.java（好象有点麻烦哦，不过在某些简单、极端的情况下page文件和java文件可以省略掉），html模板和page文件名字需要相同，Java类的名字不强制，他是在page文件里显式关联的。这样有个好处，多个page可以共用一个java类，不过这样做法可能有点乱。<br />
<br />
<strong>模板（html）的搜索路径<br />
</strong>Tapestry会首先page定义的路径下搜索html模板，然后在Web应用Context的根路径下搜索--也就是说在WebRoot/下搜索。这样我们可以选择把html模板和page放在一起或者放在WebRoot下。<br />
<br />
把html模板放在WebRoot下有个好处，可以不需要page文件（如果有必要的话），反过来说，如果你没有定义page文件，那就只能放在WebRoot下了。<strong><br />
</strong><br />
为了便于分类，我们可以把html模板和page文件放到子目录下面，如 WebRoot/Pages/User/UserReg.*。 但是这样需要在相应的地方把完整的路径都写上。可能会有以下几处：<br />
1. Java类的listener方法处理后跳转的页面：如<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="annotation">@InjectPage</span><span>(</span><span class="string">&quot;Pages/User/UserList&quot;</span><span>)  </span></span></li>
    <li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">abstract</span><span> IPage getUserListPage();  </span></span></li>
</ol>
</div>
<br />
2. 链接：<font size="5">
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-xml" start="1"><font>
    <li class="alt"><span><span>/app?</span><span class="attribute">service</span><span>=</span><span class="attribute-value">page</span><span>&amp;</span><span class="attribute">page</span><span>=</span><span class="attribute-value">Pages</span><span>/User/UserReg  </span></span></li>
    </font></ol>
    </div>
    <div class="code_title"><font><br />
    </font></div>
    <div class="dp-highlighter">
    <div class="bar"> </div>
    <ol class="dp-xml" start="1"><font>
        <li class="alt"><span><span>/Pages/User/UserReg, $Direct?</span><span class="attribute">sp</span><span>=</span><span class="attribute-value">XXX</span><span>  </span></span></li>
        </font></ol>
        </div>
        <font size="2"><br />
        <strong>组件搜索路径</strong><br />
        有以下几个：<br />
        </font></font>
        <ol>
            <li><font size="5"><font size="2">根据在*.application中用</font></font><a href="file:///E:/JavaDevelopment/Framework_Library/tapestry-project-4.1.3/docs/usersguide/spec.html#spec.component-type"><component-type></component-type></a> <font size="5"><font size="2">显式定义的组件类型的路径</font></font></li>
            <li><font size="5"><font size="2">*.application所在的目录，通常是WEB-INF</font></font></li>
            <li>WEB-INF/                         <em>servlet-name</em><font size="5"><font size="2">目录，</font></font><em>servlet-name</em><font size="5"><font size="2">也就是在web.xml中配置的名字。</font></font></li>
            <li><font size="5"><font size="2">Web项目根目录，也就是/WebRoot</font></font></li>
        </ol>
        <font size="5"><font size="2">一般情况可以使用第三种，这样比较不乱，可以将所有组件放在一起，通常自定义组件都不会太多。<br />
        </font>         <br />
        <font size="4"><strong>链接</strong></font></font><font size="4"> </font><br />
        <hr size="2" width="100%" />
        链接在Tapestry里似乎不是问题，因为它变的非常的对象化；但是用起来又好像有很多的问题。比较常用的链接组件是DirectLink和PageLink，下面是他们的用法：<br />
        <br />
        <strong>DirectLink</strong><br />
        用法一：可以这样用：<br />
        <div class="code_title">HTML</div>
        <div class="code_title">
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">a</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;@DirectLink&quot;</span><span> </span><span class="attribute">listener</span><span>=</span><span class="attribute-value">&quot;listener:prepareUserEdit&quot;</span><span> </span><span class="attribute">parameters</span><span>=</span><span class="attribute-value">&quot;ognl:user.id&quot;</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;#&quot;</span><span class="tag">&gt;</span><span>Edit</span><span class="tag"><!--</span--><span class="tag-name">a</span><span class="tag">&gt;</span><span>  </span></span></span></li>
        </ol>
        </div>
        <br />
        </div>
        <br />
        listener是处理链接点击的方法名，parameters是参数，对应的的方法是<br />
        <div class="code_title">java 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-j" start="1">
            <li class="alt"><span><span class="keyword">public</span><span> IPage prepareUserEdit(String id){    </span></span></li>
            <li class=""><span>  </span></li>
            <li class="alt"><span>}    </span></li>
        </ol>
        </div>
        注意这里的参数，如果这个参数如果不是String的而是int话，这个listener方法要这么：<br />
        <div class="code_title">java 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-j" start="1">
            <li class="alt"><span><span class="keyword">public</span><span> IPage prepareUserEdit(</span><span class="keyword">int</span><span> id){    </span></span></li>
            <li class=""><span>  </span></li>
            <li class="alt"><span>}    </span></li>
        </ol>
        </div>
        Tapestry会自动判断数据类型。<br />
        <br />
        用法二：<br />
        将用法一中的HTML模板内的绑定信息搬到page文件中：<br />
        <div class="code_title">HTML</div>
        <div class="code_title">
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">a</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;menuItem&quot;</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;#&quot;</span><span class="tag">&gt;</span><span>xxx</span><span class="tag"><!--</span--><span class="tag-name">a</span><span class="tag">&gt;</span><span>  </span></span></span></li>
        </ol>
        </div>
        <br />
        page</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">component</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;menuItem&quot;</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;DirectLink&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
            <li class=""><span>  <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;listener&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;listener:doClickMenuItem&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
            <li class="alt"><span>  <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;parameters&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;ongl:xxx&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
            <li class=""><span>  <span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;target&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;literal:Content&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
            <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">component</span><span class="tag">&gt;</span><span>  </span></span></span></li>
        </ol>
        </div>
        <br />
        怎么样，HTML模板现在看上很简洁吧。<br />
        个人觉得第二种方式好一些，虽然要多写一些，但是它使得HTML代码很&ldquo;干净&rdquo;，特别是页面比较复杂的时候，即便不复杂，HTML里面也不应该有太多与显示无关的东西。当然，如果是特别简单的情况，那就无所谓了。<br />
        <br />
        技巧：<br />
        如果要给链接传多个参数，两种方法的parameters这么写：<br />
        <strong>HTML</strong>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="attribute">parameters</span><span>=&quot;</span><span class="attribute-value">ognl</span><span>:{userName, id}&quot;  </span></span></li>
        </ol>
        </div>
        <strong>Page</strong>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;parameters&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;ognl:{userName, id}&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
        </ol>
        </div>
        <br />
        <br />
        <br />
        <strong>PageLink<br />
        </strong>方法一：<br />
        <div class="code_title">HTML
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">a</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;@PageLink&quot;</span><span> </span><span class="attribute">page</span><span>=</span><span class="attribute-value">&quot;Page1&quot;</span><span class="tag">&gt;</span><span>go to Page1</span><span class="tag">&lt;</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>  </span></span></li>
        </ol>
        </div>
        </div>
        <br />
        点击这个链接会直接跳转到名为Page1的页面。<br />
        <br />
        方法二：<br />
        <div class="code_title">HTML</div>
        <div class="code_title">
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">a</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;page2&quot;</span><span class="tag">&gt;</span><span>go to Page2</span><span class="tag">&lt;</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>  </span></span></li>
        </ol>
        </div>
        <br />
        page</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">component</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;page2&quot;</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;PageLink&quot;</span><span class="tag">&gt;</span><span>  </span></span></li>
            <li class=""><span><span class="tag">&lt;</span><span class="tag-name">binding</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;page&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;literal:Page2&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">component</span><span class="tag">&gt;</span><span>  </span></span></li>
        </ol>
        </div>
        <br />
        PageLink一般比较简单，只是页面的跳转，两个方法都可以。<br />
        <br />
        <br />
        <br />
        <strong>硬编码超链接：<br />
        </strong>如果我们不使用链接组件，要自己动态生成一个对某个页面的超链接该怎么办呢？这个URL该如何写呢？参数如何传递呢？<br />
        在文档里我只找到了诸如 &quot;/app?service=page&amp;page=xxx&quot;的URL写法，但是这样的链接只能页面间跳转，无法绑定listener方法并传递参数，似乎作者不希望人们这么做。但是我观察带参数的DirectLink生成的网页链接，如：<br />
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span>/Users,$DirectLink.direct?</span><span class="attribute">sp</span><span>=</span><span class="attribute-value">l1</span><span>  </span></span></li>
        </ol>
        </div>
        <br />
        看起来Users就是当前页面，$DirectLink是链接组件的名字，如果没有显式的指定的话就自动采用组件的名字加上$前缀，如果有其他无名链接就会出现类似$DirectLink_0, $DirectLink_1的链接， sp=l1看起来就是参数了。这样我们不用链接组件也可以自己生成网页超链接了。<br />
        当然，我们还是要在page文件里写上对应的组件声明进行绑定--我们还没告诉它要如何处理这个链接的点击操作呢。如下面的例子：<br />
        <div class="code_title">HTML<br />
        </div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span>/TreeMenuPage,menuItem.direct?</span><span class="attribute">sp</span><span>=</span><span class="attribute-value">item_01</span><span>&amp;</span><span class="attribute">sp</span><span>=</span><span class="attribute-value">doSomthing</span><span>  </span></span></li>
        </ol>
        </div>
        <strong>
        <div class="code_title"><strong>xml 代码</strong></div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag"><strong>&lt;</strong></span><span class="tag-name"><strong>component</strong></span><span><strong> </strong></span><span class="attribute"><strong>id</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>&quot;menuItem&quot;</strong></span><span><strong> </strong></span><span class="attribute"><strong>type</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>&quot;DirectLink&quot;</strong></span><span class="tag"><strong>&gt;</strong></span><span><strong>  </strong></span></span></li>
            <li class=""><span><span class="tag"><strong>&lt;</strong></span><span class="tag-name"><strong>binding</strong></span><span><strong> </strong></span><span class="attribute"><strong>name</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>&quot;listener&quot;</strong></span><span><strong> </strong></span><span class="attribute"><strong>value</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>&quot;listener:doClickMenuItem&quot;</strong></span><span class="tag"><strong>/&gt;</strong></span><span><strong>  </strong></span></span></li>
            <li class="alt"><span><span class="tag"><strong>&lt;</strong></span><span class="tag-name"><strong>binding</strong></span><span><strong> </strong></span><span class="attribute"><strong>name</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>&quot;target&quot;</strong></span><span><strong> </strong></span><span class="attribute"><strong>value</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>&quot;literal:Menu&quot;</strong></span><span class="tag"><strong>/&gt;</strong></span><span><strong>  </strong></span></span></li>
            <li class=""><span><span class="tag"><strong>&lt;</strong></span><span class="tag-name"><strong>component</strong></span><span class="tag"><strong>&gt;</strong></span><span><strong>  </strong></span></span></li>
        </ol>
        </div>
        </strong><br />
        <div class="code_title">java 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-j" start="1">
            <li class="alt"><span><span class="keyword">public</span><span> IPage doClickMenuItem(String itemId, String itemName) {  </span></span></li>
            <li class=""><span>  </span></li>
            <li class="alt"><span>}  </span></li>
        </ol>
        </div>
        链接的名字不是什么$DirectLink了，必须和page里声明的组件的名字一致。注意链接参数的顺序和Java类listener方法的参数顺序应该也是一致的。<br />
        <br />
        <br />
        <font size="4"><strong>Form相关组件</strong></font><br />
        <hr size="2" width="100%" />
        Form相关组件的使用应该算是比较简单的。但是有几个点要说一下：<br />
        <br />
        <br />
        <strong>Hidden组件<br />
        </strong>Hidden组件和TextField组件有些不一样，废话，一个显示一个不显示，不过我要说的不是这个。Hidden和TextFiled组件在渲染页面的的时候经常要给一个初始化值（如果有的话），不同的是Hidden组件会在值的前面加一个前缀，如果是String类型就加S，如果是long型的就加l，以此类推。不过好像Tapestry在提交Hidden的时候会自动处理这个前缀，所以无需担心类型转换错误。<br />
        <br />
        <br />
        <strong>与For组件一起使用</strong><br />
        如果将Form的组件于For组件一起使用的话，For组件会将数据转换成字符串并存储在Hidden组件内。也就是说，如果For组件使用的数据无法被序列化的话，Tapestry就会报错，抛出<code>ApplicationRuntimeException异常。例如，如果你要循环输出若干了User对象给Select组件，形成的话一个User列表框的话，你的User对象必须序列化：<br />
        </code>
        <div class="code_title">java 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-j" start="1">
            <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> User </span><span class="keyword">implements</span><span> Serializable  </span></span></li>
        </ol>
        </div>
        <strong><br />
        <br />
        多个Submit按钮</strong><br />
        当需要多个Sumit按钮来提交同一个Form，用不同的listener方法来处理的时候，可以在默认的submit组件后添加另外一个submit组件，指定listner 方法，如：<br />
        <div class="code_title">xml 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;submit&quot;</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;help@Submit&quot;</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">&quot;listener:doHelp&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;Help&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
        </ol>
        </div>
        <br />
        <br />
        <br />
        <font size="4"><strong>自定义组件</strong></font><br />
        <hr size="2" width="100%" />
        <br />
        自定义组件也和定义Page一样需要三个文件，一个组件的模板，也是一个html文件，一个*.jwc文件和一个Java类。其实自定义组件的方法和定义Page几乎完全一样，除了实现的接口不一样之外。要注意的是一下几点：<br />
        <br />
        <strong>body<br />
        </strong>如果需要自定义组件包含其他组件或者html元素的话，需要在组件模板内使用@RenderBody组件，如：<br />
        <br />
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">span</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;@RenderBody&quot;</span><span class="tag">&gt;</span><span>Unique content goes here.</span><span class="tag"><!--</span--><span class="tag-name">span</span><span class="tag">&gt;</span><span>  </span></span></span></li>
        </ol>
        </div>
        <br />
        那么用自定义组件包含的内容都会被渲染，如：<br />
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">span</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;@UserComponent&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;#&quot;</span><span class="tag">&gt;</span><span>Hello World</span><span class="tag"><!--</span--><span class="tag-name">a</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">span</span><span class="tag">&gt;</span><span>  </span></span></span></span></li>
        </ol>
        </div>
        <br />
        如果组件内有数据提交，要处理提交的数据的话，要在renderComponent()里做<br />
        <div class="code_title">java 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-j" start="1">
            <li class="alt"><span><span class="keyword">if</span><span>(cycle.isRewinding()){  </span></span></li>
            <li class=""><span>                  ......  </span></li>
            <li class="alt"><span>}  </span></li>
        </ol>
        </div>
        <br />
        <br />
        <font size="4"><strong><br />
        JavaScript</strong></font>         <br />
        <hr size="2" width="100%" />
        可以把JavaScript代码从html模板中分离出来实现代码重用，在Tapestry下可以用传统的方式引入js文件，但是如果你需要在Tapestry处理JavaScript里的某些数据的话，就需要使用Tapestry的方式，把JavaScript代码放到后缀为&times;.script的XML文件中，如：<br />
        <div class="code_title">xml 代码</div>
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag"><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>    </span></span></span></li>
            <li class=""><span></span></li>
            <li class="alt"><span>&quot;-//Apache Software Foundation//Tapestry Script Specification 3.0//EN&quot;    </span></li>
            <li class=""><span>&quot;http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd&quot;<span class="tag">&gt;</span><span>    </span></span></li>
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>    </span></span></li>
            <li class=""><span><span class="tag">&lt;</span><span class="tag-name">input-symbol</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;symbol&quot;</span><span> </span><span class="attribute">required</span><span>=</span><span class="attribute-value">&quot;yes&quot;</span><span class="tag">/&gt;</span><span>    </span></span></li>
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>    </span></span></li>
            <li class=""><span><span class="cdata"><!--[CDATA[  </span> </span></li>
            <li class="alt"><span><span class="cdata">    function doSomthing(){  </span> </span></li>
            <li class=""><span><span class="cdata">  </span> </span></li>
            <li class="alt"><span><span class="cdata">    }  </span> </span></li>
            <li class=""><span><span class="cdata">]]--></span><span>    </span></span></li>
            <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>    </span></span></span></li>
            <li class=""><span><span class="tag"><!--</span--><span class="tag-name">script</span><span class="tag">&gt;</span><span>   </span></span></span></li>
        </ol>
        </div>
        <br />
        注意JavaScript代码段的body部分要加<br />
        <span><span>
        <div class="code_title">xml 代码</div>
        <div class="dp-highlighter">
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span><!--[CDATA[    ]]-->  </span></span></li>
        </ol>
        </div>
        <br />
        标签，很显然，JavaScript不符合XML格式。</span></span><br />
        使用的时候在html模板内直接引用：<br />
        <div class="dp-highlighter">
        <div class="bar"> </div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">span</span><span> </span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;myScript&quot;</span><span class="tag">/&gt;</span><span>  </span></span></li>
        </ol>
        </div>
        <br />
        给script传递参数：<br />
        上面代码段中的<span><span class="tag">&lt;</span><span class="tag-name">input-symbol</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;symbol&quot;</span><span> </span><span class="attribute">required</span><span>=</span><span class="attribute-value">&quot;yes&quot;</span><span class="tag">/&gt;就是script的参数<br />
        <br />
        <br />
        <br />
        <br />
        StyleSheet<br />
        </span></span><hr size="2" width="100%" />
        StyleSheet不是在html模板中直接定义的，也是通过Tapestry作为asset来实现的。当然你完全可以在html模板中指定css文件路径，不过那通常是给模板的编辑人员使用的。那么在Tapestry中应该怎么样使用呢？<br />
        <br />
        假如你的css文件在WebRoot/css下面。那么在你的xxx.page里加上<br />
        <br />
        <div class="dp-highlighter">
        <div class="bar">&nbsp;</div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">asset</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;stylesheet&quot;</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;css/style.css&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        </ol>
        </div>
        <br />
        <span><span class="tag">在你的xxx.html模板中用Shell组件包裹你的body标签，把你在page里声明的stylesheet赋给Shell组件<br />
        <br />
        <div class="code_title">xml 代码</div>
        <div class="dp-highlighter">
        <div class="bar">&nbsp;</div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;@Shell&quot;</span><span>&nbsp;</span><span class="attribute">stylesheet</span><span>=</span><span class="attribute-value">&quot;asset:stylesheet&quot;</span><span></span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">jwcid</span><span>=</span><span class="attribute-value">&quot;@Body&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;</span></li>
            <li class=""><span>......&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;</span></li>
            <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        </ol>
        </div>
        <br />
        这样的话整个页面就应用了这个css/style.css了。<br />
        <br />
        <br />
        </span></span>
          <br/>
          <span style="color:red;">
            <a href="http://allenny.javaeye.com/blog/132967#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 17 Oct 2007 20:10:46 +0800</pubDate>
        <link>http://allenny.javaeye.com/blog/132967</link>
        <guid>http://allenny.javaeye.com/blog/132967</guid>
      </item>
      <item>
        <title>进入Ubuntu的世界（2）- 驱动程序</title>
        <author>allenny</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://allenny.javaeye.com">allenny</a>&nbsp;
          链接：<a href="http://allenny.javaeye.com/blog/131831" style="color:red;">http://allenny.javaeye.com/blog/131831</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>从前面的情况看，没有正确驱动的只有显卡，那么怎么驱动显卡呢，我先到NVidia的官方网站上search到了GeForce8400 GS的相关驱动。一个以run结尾的文件，官网上说直接sh运行这个文件就可以了，于是我进入控制台：</p>
<p>$sh NVIDIA-Linux-x86-100.14.09-pkg1.run</p>
<p>运行失败，提示应该在X Server没有运行的情况下运行，也就是说要退出图形界面，于是我Ctrl-Alt-Backspace, 但是这个命令只会让你重新登录图形界面。于是我找/etc/inittab，但是发现Ubuntu下面好像没有这个东东；最后我在系统设置里面找到了一个和Windows差不多的东西&ldquo;服务&rdquo;，里面有一项GDM，嘿嘿，把GDM前面的钩钩去掉，确定后就直接推出图形界面了，再次运行，还是失败，好像缺少一些依赖的库，Google了一下，很多说要安装nvidia-glx，在网上查了一堆各式各样的，最后也没搞明白怎么弄。还是在新立得软件包管理找到这个软件包，直接下载安装，这玩意儿可真TMD的方便。装完nvidia-glx后再安装nvidia的驱动，这次终于成功了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://allenny.javaeye.com/blog/131831#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 22:22:36 +0800</pubDate>
        <link>http://allenny.javaeye.com/blog/131831</link>
        <guid>http://allenny.javaeye.com/blog/131831</guid>
      </item>
      <item>
        <title>进入Ubuntu的世界 (3) -常用软件安装</title>
        <author>allenny</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://allenny.javaeye.com">allenny</a>&nbsp;
          链接：<a href="http://allenny.javaeye.com/blog/131810" style="color:red;">http://allenny.javaeye.com/blog/131810</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2" face="Arial">在安装软件之前,首先要解决一个问题, Ubuntu 无法直接安装RPM软件包, 如果有些软件只提供了最为流行的RPM包或者你不想自己编译软件的话, 可以用Alien把RPM包转换成deb包安装. 步骤如下:<br />
<br />
1. 首先安装Alien, <br />
$sudo apt-get install alien</font> </p>
<p><font size="2" face="Arial">    回车后, Ubuntu会自动下载安装, 这功能可比在Window下爽多了. </font></p>
<p><font size="2" face="Arial"> 2. 然后用安装后的alien转换RPM安装包:<br />
$sudo alien -k xxxxx.rpm</font></p>
<p><font size="2" face="Arial"> 3. 完成后RPM包就转成了一个deb包，然后就可以安装这个deb包了:<br />
</font> <font size="2" face="Arial">   $sudo dpkg -i xxxxx.deb</font></p>
<br />
<br />
<p>解压缩tar文件：</p>
<p>tar -zxvf xxxxxx.tar.gz</p>
<p><font size="2" face="Arial"><br />
</font></p>
<p><font size="2" face="Arial"> </font></p>
<p><font size="2" face="Arial"><strong>Download for X</strong></font></p>
<hr size="2" width="100%" />
<p><font size="2" face="Arial">下载软件，在新立得软件管理里可以找大，界面看上去很不错，和FlashGet有点像，但是我试了下好像不能断点续传，还有多线程不知道哪里开启(可能是自动分配线程的吧）</font></p>
<p><font size="2" face="Arial"><br />
</font></p>
<font size="2" face="Arial"><strong>Music Player</strong><br />
</font><hr size="2" width="100%" />
<font size="2" face="Arial">XMMX仍然是默认的mp3播放器，并且界面仍然是那么丑陋，似乎多年来未曾改变过，连Winamp自己都放弃了那样的界面，XMMS为啥还坚持不屑；Amarok相对要好的多，有媒体库，也有播放列表，在新立得里可以找到安装。<br />
乱码问题由来已久，其原因应该是多数中文mp3的歌曲信息都是按照中文编码的，但是Linux下的mp3播放器都是以utf-8编码读取的。解决的方法是转换所有mp3文件中歌曲信息的编码，按一下步骤：<br />
1、安装python-mutagen<br />
2、sudo find . -iname &quot;*.mp3&quot; -execdir mid3iconv -e GBK {} \;<br />
<br />
<br />
</font>
<p><font size="2" face="Arial"><strong>AVI &amp; RMVB<br />
</strong></font></p>
<hr size="2" width="100%" />
<p><font size="2" face="Arial">播放AVI很方便，双击avi文件启动Totem Movie Player会提示下载解码器，下载后就可以播放avi了。</font></p>
<p><font size="2" face="Arial">RMVB的话网上有两种方法都有问题：</font></p>
<p><font size="2" face="Arial">1. 安装RealPlayer, 到RealPlayer的官方网站上下载RealPlayer for Linux。</font></p>
<p><font size="2" face="Arial">    下载后给此文件分配执行权限：<br />
</font></p>
<pre class="screen"><font size="2" face="Arial">	# chmod a+x RealPlayer10GOLD.bin<br />	执行安装：<br />	# ./RealPlayer10GOLD.bin<br />	运行后提示选择安装目录<br />	安装好之后运行就报Segment fault之类的错误<br /><br />2. 用Totem播放：<br />	从mplayer的网站上下载rm的解码器，解压拷贝到Totem的目录~/.gnome2/totem-addons/，<br />但是我在.gnome2/目录下怎么也找不到totem-addons目录。<br /><br /><strong>只有以下方法是可行的</strong>：<br />	sudo gedit /etc/apt/sources.list<br />	加入<br />	deb http://medibuntu.sos-sts.com/repo/ feisty free non-free<br />	deb-src http://medibuntu.sos-sts.com/repo/ feisty free non-free<br />	加入key<br />	wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | sudo apt-key add -<br />	更新<br />	sudo apt-get update<br />	安装<br />	sudo apt-get install w32codecs libdvdcss2 <br /><br /><br /><strong>Enermy Territery<br /></strong></font></pre>
<hr size="2" width="100%" />
<pre class="screen"><font size="2" face="Arial">用了linux不能不玩游戏了呀，ET可比CS 好玩多了，到以下地址下载：<br /><a href="http://returntocastlewolfenstein.filefront.com/file/Enemy_Territory;14408">returntocastlewolfenstein.filefront.com/file/Enemy_Territory;14408</a><br /><br />下载后sh 运行安装包：<br />	sh et-linux-2.55.x86.run<br />出来安装界面后就可以安装啦，装完后运行！嘿嘿，进去了，但是奇怪，没有<br />声音，查看控制台，有以下错误：<br /><span class="postbody">	/dev/dsp: Input/output error<br />	Could not mmap /dev/dsp<br /><br /></span> 应该和声卡有关，Google到以下方案：<br />编辑文件<span class="postbody">/etc/init.d/bootmisc.sh，加入以下三行：</span><br /><span class="postbody"><div class="dp-highlighter"><div class="bar"> </div><ol class="dp-c" start="1"><li class="alt"><span><span class="preprocessor"># fix sound for Quake 3 and Enemy Territory</span><span>  </span></span></li><li class=""><span>echo <span class="string">&quot;et.x86 0 0 direct&quot;</span><span> &gt; /proc/asound/card0/pcm0p/oss  </span></span></li><li class="alt"><span>echo <span class="string">&quot;quake3.x86 0 0 direct&quot;</span><span> &gt; /proc/asound/card0/pcm0p/oss  </span></span></li><li class=""><span>echo <span class="string">&quot;quake3.x86 0 0 disable&quot;</span><span> &gt; /proc/asound/card0/pcm0c/oss  </span></span></li></ol></div><br /></span>我加进去后重新登录但是不起效果，于是重启，在进入et，这次可以了，可爱的声音终于出来了。<br /><br /></font></pre>
<p><font size="2" face="Arial"><strong>JDK5.0 </strong><strong>安装和设置</strong></font></p>
<hr size="2" width="100%" />
<font size="2" face="Arial">从SUN网站上下载JDK5.0，解压至目录/usr/java/jdk1.5.0<br />
</font>
<p><font size="2" face="Arial"> 在用户Home目录下，打开 .bashrc文件，命令如下：<br />
</font></p>
<pre class="overflow"><font size="2" face="Arial"><br />    $ gedit .bashrc<br /></font></pre>
<font size="2" face="Arial"><br />
在文件最前面加入如下内容：<br />
</font>
<pre class="overflow"><font size="2" face="Arial"><br /><div class="dp-highlighter"><ol class="dp-c" start="1"><font><li class="alt"><span><span class="preprocessor">#set environment for java</span><span>  </span></span></li><li class=""><span><span class="keyword">export</span><span> JAVA_HOME=/usr/java/jdk1.5.0_13  </span></span></li><li class="alt"><span><span class="keyword">export</span><span> PATH=$JAVA_HOME/bin:$PATH  </span></span></li><li class=""><span><span class="keyword">export</span><span> CLASSPATH=.;$JAVA_HOME/lib  </span></span></li></font></ol></div><br /></font></pre>
<font size="2" face="Arial"><br />
完成后保存推出。登出后再重新登入。此时，执行<br />
</font>
<pre class="overflow"><font size="2" face="Arial"><br />  	 $ echo $JAVA_HOME<br /></font></pre>
<font size="2" face="Arial"><br />
如果显示正确的环境变量，表明设置成功。 </font>
<p><font size="2" face="Arial"><br />
</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://allenny.javaeye.com/blog/131810#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 20:55:00 +0800</pubDate>
        <link>http://allenny.javaeye.com/blog/131810</link>
        <guid>http://allenny.javaeye.com/blog/131810</guid>
      </item>
      <item>
        <title>进入Ubuntu的世界（1）－安装Ubuntu</title>
        <author>allenny</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://allenny.javaeye.com">allenny</a>&nbsp;
          链接：<a href="http://allenny.javaeye.com/blog/131719" style="color:red;">http://allenny.javaeye.com/blog/131719</a>&nbsp;
          发表时间: 2007年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我的机器配置如下：</p>
<p>Core2 Duo T7250<br />
</p>
<p>NVidia GeForece 8400 GS</p>
<p>2G (2X1G) 667MHz Dual-Channel DDR</p>
<p>160G SATA HD</p>
<br />
<p>用Ubuntu7.04的LiveCD从光盘启动安装，选择菜单第一项进入安装，进度条滚动几次后就出现以下错误：</p>
<p>&nbsp;</p>
<div class="code_title"><br />
</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>BusyBox&nbsp;v1.</span><span class="number">1.3</span><span>&nbsp;(Debian&nbsp;</span><span class="number">1</span><span>:</span><span class="number">1.1</span><span>.</span><span class="number">3</span><span>-3ubuntu3)&nbsp;built-in&nbsp;shell&nbsp;(ash)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>Enter&nbsp;<span class="string">&quot;help&quot;</span><span>&nbsp;</span><span class="keyword">for</span><span>&nbsp;a&nbsp;list&nbsp;of&nbsp;built-in&nbsp;commands...&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>/Bin/sh:can't&nbsp;access&nbsp;tty;job&nbsp;control&nbsp;turned&nbsp;off&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
<p>&nbsp;</p>
<p>看上去和硬件设备有关，看来只能Google了，查到以下方法：</p>
<p>1. 在菜单出现的时候,按F6,这时出现一行命令,在最前面加入break=top,然后回车.</p>
<p>2.这时又回到刚才的错误界面<br />
</p>
<p>3. 在命令行下输入以下命令：</p>
<p>&nbsp;&nbsp;&nbsp; modprobe piix</p>
<p>&nbsp;&nbsp;&nbsp; exit</p>
<p>终于出现Ubuntu的图形界面啦，哈哈，这下应该能顺利了安装了吧。可是过了一会儿就跳到了黑屏，难道死机了，但是黑屏的时候系统欢迎的声音也出来了啊，而且按下电源键后出现关机的界面。喔～，对了，应该是显卡太新了，Ubuntu不支持，所以无法显示。重新开始安装，选择启动菜单第二项&ldquo;安全模式&rdquo;安装，重复上面的步骤，最后终于进入系统了，然后单机桌面上的安装图标就可以进行系统的安装啦。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://allenny.javaeye.com/blog/131719#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 13 Oct 2007 23:38:17 +0800</pubDate>
        <link>http://allenny.javaeye.com/blog/131719</link>
        <guid>http://allenny.javaeye.com/blog/131719</guid>
      </item>
  </channel>
</rss>