﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-黑灵客栈-随笔分类-Tapestry</title><link>http://www.blogjava.net/mstar/category/3078.html</link><description>搞软件开发就像被强奸,如果不能反抗,就享受它吧！</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:33:52 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:33:52 GMT</pubDate><ttl>60</ttl><item><title>Tapestry4初试小结</title><link>http://www.blogjava.net/mstar/archive/2005/08/28/11393.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Sun, 28 Aug 2005 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2005/08/28/11393.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/11393.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2005/08/28/11393.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/11393.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/11393.html</trackback:ping><description><![CDATA[<P>Tapestry 4 beta5<BR><BR>一、注意空格。tapestry这点作的不太好。如果在一些属性中开始或结尾多写了个空格，就会发生错误，而且很难找出来。<BR>二、中文乱码问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<P>在*.application中加入下面语句：</P>
<P>&nbsp;&nbsp;&nbsp; 
<META value="GB2312" key="org.apache.tapestry.output-encoding"><BR>&nbsp;&nbsp;&nbsp; 
<META value="GB2312" key="org.apache.tapestry.template-encoding"><BR>三。Shell组件默认Render出来的meta有限，有时需要扩展，通过delegate属性，下面是个例子：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;HeadMetaRender&nbsp;implements&nbsp;IRender&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;render(IMarkupWriter&nbsp;writer,&nbsp;IRequestCycle&nbsp;cycle)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.begin(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">meta</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.attribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http-equiv</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Content-Language</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.attribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">content</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">zh-cn</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.closeTag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.begin(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">meta</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.attribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http-equiv</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Content-Type</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.attribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">content</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html;&nbsp;charset=gb2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.closeTag();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></DIV></DIV><BR>四、今天尝试了Application State Object,Localization,FriendURL。<BR>FriendUrl比较好弄，给的文档也比较详细。按照文档copy就可以了。没有仔细研究。<BR>Locaition也很好弄，为每个页面写一个properties文件用于文件里面的文字，再为application写一个用于做系统通用信息。只是注意编码<BR>&nbsp;&nbsp;&nbsp; <TARGET name="native2ascii"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <NATIVE2ASCII <BR src="${props}/" encoding="GB2312">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dest="${webinfo.dir}/page"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; includes="*.properties"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excludes="TNetCatcher.properties"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <NATIVE2ASCII <BR src="${props}/" encoding="GB2312">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dest="${webinfo.dir}"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; includes="*NetCatcher.properties"/&gt;<BR>&nbsp;&nbsp;&nbsp; </TARGET><BR>在ant中加入如上target。<BR>Application State Object 相关的东西弄了半天。我要做一个验证用户合法性的功能，就是看VisitObject（Session Scope）中又没有用户信息，如果没有用户信息就跳转到登录页面。这样的功能以往我是写一个LoginFilter里检查Session。但是在Tapestry中不建议直接操作Session。虽然我也可以知道那个VisitObject在Session中的名字（一般为"state:App-Name:visit-Name"），但是还是不用Filter了。我就写了一个MyBasePage继承与BasePage然后添加了一个MyPageValidateListener&nbsp;实现 PageValidateListener 在MyPageValidateListener&nbsp;的pageValidate方法中进行验证。<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;MyPageValidateListener&nbsp;implements&nbsp;PageValidateListener&nbsp;{<BR></SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;pageValidate(PageEvent&nbsp;</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRequestCycle&nbsp;cycle&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">.getRequestCycle();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyBasePage&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(MyBasePage)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">.getPage();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppVisit&nbsp;visit&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;page.getAppVisit();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(visit.getCustomer()</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;!</SPAN><SPAN style="COLOR: #000000">page.getPageName().equals(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Login</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;!</SPAN><SPAN style="COLOR: #000000">page.getPageName().equals(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Register</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;!</SPAN><SPAN style="COLOR: #000000">page.getPageName().equals(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">GetPassword</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPage&nbsp;login&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cycle.getPage(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Login</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;PageRedirectException(login);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV></DIV><BR>这里，最好在最后Throw一个PageRedirectException，不要用cycle.activate()。<BR>这样有一点要注意的是，必须在没有页面的page文件中加入<BR>&nbsp;<INJECT object="appVisit" type="state" property="appVisit" />把Visit对象注射进去。我不知道Tapestry4为什么建议这样用，而不是用原有的getVisit方法。这样做的确使得程序灵活的很多可以自定义很多ASO。而不是仅仅局限于Global和Visit。但是我感觉也比较麻烦。当然原来的Visit和Global还是可以用的。<BR><BR>五<FONT color=#003399>Tacos - Tapestry Components<BR><A href="http://tacos.sourceforge.net/">http://tacos.sourceforge.net/</A><BR>现在升级到4.0了，增加了很多新组件，以Ajax应用为主。以后应该关注。<BR><BR><BR>2005年9月11日<BR>这一周来，利用在家里的一点点空闲实现，慢慢的熟悉Tapestry。从最开始的getting started，到熟悉各种component，现在已经开始慢慢的尝试自己做component了。今天做了一个很简单的Component，会显示tooltip的Insert组件。最然很简单只是在render的过程中加入一些js语句而已，但是自己已经很高兴了。<BR>现在越来越感觉到用Tapestry的乐趣了。Tapestry的确是一个很优秀也很有趣的Web Framework。还有很多有意思的东西值得去研究。现在我遇到的难题是Script部分。据说Tapestry对javaScript支持作的很好，但是我现在的感觉是，满头雾水。再慢慢研究吧。</FONT><img src ="http://www.blogjava.net/mstar/aggbug/11393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2005-08-28 23:13 <a href="http://www.blogjava.net/mstar/archive/2005/08/28/11393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>