<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://oxyc.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2foxyc.spaces.live.com%2fcategory%2ftips%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>蚯蚓: tips</title><description /><link>http://oxyc.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cattips</link><language>en-US</language><pubDate>Fri, 15 Aug 2008 14:58:55 GMT</pubDate><lastBuildDate>Fri, 15 Aug 2008 14:58:55 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://oxyc.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-1409798983858752950</live:id><live:alias>oxyc</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>终于实现了Tapestry4 EntityForm和QueryTable的组件化</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!324.entry</link><description>&lt;div&gt;取代以前的BaseEditPage 和 BaseListingPage 两个基础抽象类,所有的Page统一继承自 BasePage（自定义的继承自org.apache.tapestry.html.BasePage）&lt;/div&gt;
&lt;div&gt;实现BasePage的单一化&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;QueryTable的实现思路&lt;/div&gt;
&lt;div&gt;传入Query和Parameters 取代掉source参数,用Query和Parameters构建一个model提供给TableView&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;看下demo 类&lt;/div&gt;
&lt;div&gt;EmployeeList.java&lt;/div&gt;
&lt;div&gt;package app.demo.web.pages;&lt;/div&gt;
&lt;div&gt;import java.util.HashMap;&lt;br&gt;import java.util.Map;&lt;/div&gt;
&lt;div&gt;import org.apache.commons.lang.StringUtils;&lt;br&gt;import org.apache.tapestry.IRequestCycle;&lt;br&gt;import org.apache.tapestry.event.PageBeginRenderListener;&lt;br&gt;import org.apache.tapestry.event.PageEvent;&lt;/div&gt;
&lt;div&gt;import common.tapestry.components.table.QueryTable;&lt;br&gt;import common.tapestry.html.BasePage;&lt;/div&gt;
&lt;div&gt;public abstract class EmployeeList extends BasePage implements&lt;br&gt;  PageBeginRenderListener {&lt;br&gt; &lt;br&gt; public abstract String getName();&lt;/div&gt;
&lt;div&gt; public void pageBeginRender(PageEvent event) {&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; QueryTable getTable_1() {&lt;br&gt;  return (QueryTable) getComponent(&amp;quot;table1&amp;quot;);&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; public void doSubmit() {&lt;br&gt;  Map map = new HashMap();&lt;br&gt;  map.put(&amp;quot;A&amp;quot;, &amp;quot;1&amp;quot;);&lt;br&gt;  &lt;br&gt;  String hql = &amp;quot;select a from Employee a where 1=:A&amp;quot;;&lt;br&gt;  if(StringUtils.isNotBlank(getName())){&lt;br&gt;   hql = hql +&amp;quot; and a.Name like :name&amp;quot;;&lt;br&gt;   map.put(&amp;quot;name&amp;quot;, &amp;quot;%&amp;quot; + getName() +&amp;quot;%&amp;quot;);&lt;br&gt;  }&lt;br&gt;  getTable_1().setQueryAndParameters(hql, map);&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; public void activateExternalPage(Object[] obj,IRequestCycle cycle){&lt;br&gt;  super.activateExternalPage(obj, cycle);&lt;br&gt;  getTable_1().setQueryAction(false);&lt;br&gt; }&lt;br&gt;}&lt;br&gt;&lt;/div&gt;
&lt;div&gt;html模板&lt;/div&gt;&amp;lt;t3 &lt;br&gt;jwcid=&amp;quot;&lt;a href="mailto:table1@ext:QueryTable"&gt;table1@ext:QueryTable&lt;/a&gt;&amp;quot; &lt;br&gt;title=&amp;quot;ognl:components.border.title&amp;quot; &lt;br&gt;columns=&amp;quot;a_Name:名字:Name,a_Age:年龄:Age,a_Remark:备注:Remark,a_Birthday:生日:Birthday,!Operate:操作:operate&amp;quot; class=&amp;quot;data_window&amp;quot; &lt;br&gt;cellSpacing=&amp;quot;1&amp;quot; cellPadding=&amp;quot;3&amp;quot; border=&amp;quot;0&amp;quot; pageSize=&amp;quot;10&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;t3 jwcid=&amp;quot;&lt;a href="mailto:OperateColumnValue@Block"&gt;OperateColumnValue@Block&lt;/a&gt;&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;a jwcid=&amp;quot;@ExternalLink&amp;quot; page=&amp;quot;EmployeeEdit&amp;quot; parameters=&amp;quot;ognl:{components.table1.row.Id}&amp;quot; &amp;gt; 查 看&amp;lt;/a&amp;gt;&lt;br&gt;&amp;lt;a jwcid=&amp;quot;&lt;a href="mailto:delete@ext:EntityDeleteLink"&gt;delete@ext:EntityDeleteLink&lt;/a&gt;&amp;quot; entity=&amp;quot;ognl:components.table1.row&amp;quot;&amp;gt;删除&amp;lt;/a&amp;gt;&lt;br&gt;&amp;lt;/t3&amp;gt;&lt;br&gt;&amp;lt;/t3&amp;gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+%e7%bb%88%e4%ba%8e%e5%ae%9e%e7%8e%b0%e4%ba%86Tapestry4+EntityForm%e5%92%8cQueryTable%e7%9a%84%e7%bb%84%e4%bb%b6%e5%8c%96&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!324.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!324.entry</guid><pubDate>Wed, 26 Mar 2008 08:03:35 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!324/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!324.entry#comment</wfw:comment><dcterms:modified>2008-03-26T08:06:49Z</dcterms:modified></item><item><title>Extension Tapestry4`s restart service to clear my login cookies</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!321.entry</link><description>&lt;p&gt;接上篇,自定义一个logout service 把我的login cookies 清楚掉
&lt;p&gt;Tapestry .java
&lt;p&gt;package common.tapestry;
&lt;p&gt;public final  class Tapestry {&lt;br&gt;  public static final String LOGOUT_SERVICE = &amp;quot;logout&amp;quot;;&lt;br&gt;}
&lt;p&gt;LogoutService.java&lt;br&gt;package common.tapestry.engine;
&lt;p&gt;import java.io.IOException;
&lt;p&gt;import org.apache.tapestry.IRequestCycle;&lt;br&gt;import org.apache.tapestry.engine.RestartService;
&lt;p&gt;import common.tapestry.Tapestry;
&lt;p&gt;public class LogoutService extends RestartService {&lt;br&gt; private LoginCookiesManager loginCookiesManager;
&lt;p&gt;&lt;br&gt; public void setLoginCookiesManager(&lt;br&gt;   LoginCookiesManager loginCookiesManager) {&lt;br&gt;  this.loginCookiesManager = loginCookiesManager;&lt;br&gt; }
&lt;p&gt; public void service(IRequestCycle cycle) throws IOException {&lt;br&gt;  loginCookiesManager.removeCookies();&lt;br&gt;  super.service(cycle);&lt;br&gt; }
&lt;p&gt; public String getName() {&lt;br&gt;  return Tapestry.LOGOUT_SERVICE;&lt;br&gt; }&lt;br&gt;}
&lt;p&gt;hivemodule.xml&lt;br&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br&gt;&amp;lt;module id=&amp;quot;common.tapestry&amp;quot; version=&amp;quot;1.0.0&amp;quot;&amp;gt;
&lt;p&gt; &amp;lt;!-- extends tapestry RestartService and clear the login cookies info--&amp;gt;&lt;br&gt;    &amp;lt;service-point id=&amp;quot;LogoutService&amp;quot; interface=&amp;quot;org.apache.tapestry.engine.IEngineService&amp;quot;&amp;gt;&lt;br&gt;        &amp;lt;invoke-factory&amp;gt;&lt;br&gt;            &amp;lt;construct class=&amp;quot;common.tapestry.engine.LogoutService&amp;quot;&amp;gt;&lt;br&gt;             &amp;lt;set-service property=&amp;quot;request&amp;quot; service-id=&amp;quot;tapestry.globals.HttpServletRequest&amp;quot; /&amp;gt;&lt;br&gt;                &amp;lt;set-service property=&amp;quot;response&amp;quot; service-id=&amp;quot;tapestry.globals.HttpServletResponse&amp;quot; /&amp;gt;&lt;br&gt;                &amp;lt;set-object property=&amp;quot;servletPath&amp;quot; value=&amp;quot;app-property:org.apache.tapestry.servlet-path&amp;quot; /&amp;gt;&lt;br&gt;                &amp;lt;set-object property=&amp;quot;linkFactory&amp;quot; value=&amp;quot;infrastructure:linkFactory&amp;quot; /&amp;gt;&lt;br&gt;                &amp;lt;set-object property=&amp;quot;loginCookiesManager&amp;quot; value=&amp;quot;service:common.tapestry.LoginCookiesManager&amp;quot;/&amp;gt;&lt;br&gt;             &amp;lt;/construct&amp;gt;&lt;br&gt;        &amp;lt;/invoke-factory&amp;gt;&lt;br&gt;    &amp;lt;/service-point&amp;gt;
&lt;p&gt;    &amp;lt;contribution configuration-id=&amp;quot;tapestry.services.ApplicationServices&amp;quot;&amp;gt;&lt;br&gt;        &amp;lt;service name=&amp;quot;logout&amp;quot; object=&amp;quot;service:common.tapestry.LogoutService&amp;quot; /&amp;gt;&lt;br&gt;    &amp;lt;/contribution&amp;gt;
&lt;p&gt;&amp;lt;/module&amp;gt;
&lt;p&gt;in your Pages&lt;br&gt;&amp;lt;a jwcid=&amp;quot;@ServiceLink&amp;quot; href=&amp;quot;#&amp;quot; service=&amp;quot;ognl:@common.tapestry.Tapestry@LOGOUT_SERVICE&amp;quot; target=&amp;quot;_top&amp;quot;&amp;gt;退出&amp;lt;/a&amp;gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+Extension+Tapestry4%60s+restart+service+to+clear+my+login+cookies&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!321.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!321.entry</guid><pubDate>Mon, 24 Mar 2008 06:38:11 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!321/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!321.entry#comment</wfw:comment><dcterms:modified>2008-03-24T06:38:11Z</dcterms:modified></item><item><title>How to use cookies in tapestry4? my Tapestry4.1.5`LoginCookiesManagerImpl</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!319.entry</link><description>&lt;p&gt;How to use cookies in tapestry4? my Tapestry4.1.5`LoginCookiesManagerImpl
&lt;p&gt;思路&lt;br&gt;首先BasePage是需要登陆的 protected ,&lt;br&gt;BasePage实现org.apache.tapestry.event.PageValidateListener方法,判断asm对象Visit是否已经登陆&lt;br&gt;如没visit==null,去cookies找回用户名和密码从cycle中获得Login页面&lt;br&gt;Login页面实现common.tapestry.IConstructVisit接口。LoginPage登陆时保存用户名密码到cookies中,并对cookies的值加密,&lt;br&gt;cookies的key是baseUrl+key,取回时对cookies值解密,加密解密的password放到Application的meta信息中
&lt;p&gt;实现代码如下&lt;br&gt;抽象接口LoginCookiesManager
&lt;p&gt;package common.tapestry.engine;
&lt;p&gt;public interface LoginCookiesManager {&lt;br&gt; &lt;br&gt; String APPLICATION_META_KEY_DEFAULT_COOKIES_IS_ENCRYPTION = &amp;quot;common.tapestry.default-cookies-encrypt&amp;quot;;//是否需要加密,默认加密&lt;br&gt; String APPLICATION_META_KEY_DEFAULT_COOKIES_ENCRYPTION_KEY = &amp;quot;common.tapestry.default-cookies-encryption-key&amp;quot;;//加密的password
&lt;p&gt; public static final String COOKIES_KEY_LOGIN_USERNAME = &amp;quot;USERNAME&amp;quot;;&lt;br&gt; public static final String COOKIES_KEY_LOGIN_PASSWORD = &amp;quot;PASSWORD&amp;quot;;&lt;br&gt; &lt;br&gt; /**&lt;br&gt;  * 将用户名和密码写入cookies&lt;br&gt;  * @param username&lt;br&gt;  * @param password&lt;br&gt;  * @param maxAge&lt;br&gt;  */&lt;br&gt; void writeCookies(String username,String password,int maxAge);&lt;br&gt; /**&lt;br&gt;  * 清除用户名和密码cookies&lt;br&gt;  */&lt;br&gt; void removeCookies();&lt;br&gt; /**&lt;br&gt;  * 从cookies中获得用户名&lt;br&gt;  * @return&lt;br&gt;  */&lt;br&gt; String getUsername();&lt;br&gt; /**&lt;br&gt;  * 从cookies中获得密码&lt;br&gt;  * @return&lt;br&gt;  */&lt;br&gt; String getPassword();&lt;br&gt;}
&lt;p&gt;LoginCookiesManagerImpl 实现
&lt;p&gt;package common.tapestry.engine;
&lt;p&gt;import org.apache.hivemind.ApplicationRuntimeException;&lt;br&gt;import org.apache.tapestry.engine.IPropertySource;&lt;br&gt;import org.apache.tapestry.services.AbsoluteURLBuilder;&lt;br&gt;import org.apache.tapestry.services.CookieSource;&lt;br&gt;import org.apache.tapestry.web.WebRequest;&lt;br&gt;import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;&lt;br&gt;import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
&lt;p&gt;public class LoginCookiesManagerImpl implements LoginCookiesManager {&lt;br&gt; private static StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();&lt;br&gt; private IPropertySource applicationPropertySource;&lt;br&gt; private CookieSource cookieSource;&lt;br&gt; private WebRequest request;&lt;br&gt; private AbsoluteURLBuilder absoluteURLBuilder;
&lt;p&gt; public void setApplicationPropertySource(&lt;br&gt;   IPropertySource applicationPropertySource) {&lt;br&gt;  this.applicationPropertySource = applicationPropertySource;&lt;br&gt;  String encrypKey = getCookiesEncryptionKey();&lt;br&gt;  standardPBEStringEncryptor.setPassword(encrypKey);&lt;br&gt; }
&lt;p&gt; private String decrypt(String value) {&lt;br&gt;  String tmp = value;&lt;br&gt;  try {&lt;br&gt;   tmp = standardPBEStringEncryptor.decrypt(value);&lt;br&gt;  } catch (EncryptionOperationNotPossibleException e) {&lt;br&gt;   throw new ApplicationRuntimeException(&amp;quot;please clear your cookies&amp;quot;);&lt;br&gt;  }&lt;br&gt;  return tmp;&lt;br&gt; }
&lt;p&gt; private String encrypt(String value) {&lt;br&gt;  return standardPBEStringEncryptor.encrypt(value);&lt;br&gt; }
&lt;p&gt; private String getCookiesEncryptionKey() {&lt;br&gt;  String temp = applicationPropertySource&lt;br&gt;    .getPropertyValue(APPLICATION_META_KEY_DEFAULT_COOKIES_ENCRYPTION_KEY);&lt;br&gt;  return (temp != null) ? temp : &amp;quot;crypassword&amp;quot;;&lt;br&gt; }
&lt;p&gt; private boolean isCookiesEncryption() {&lt;br&gt;  String temp = applicationPropertySource&lt;br&gt;    .getPropertyValue(APPLICATION_META_KEY_DEFAULT_COOKIES_IS_ENCRYPTION);&lt;br&gt;  return (temp != null) ? Boolean.valueOf(temp).booleanValue() : true;&lt;br&gt; }
&lt;p&gt; public void removeCookies() {&lt;br&gt;  String cookiesKeyLogin_username = generateApplicationCookiesKey_Login__Username();&lt;br&gt;  String cookiesKeyLogin_password = generateApplicationCookiesKey_Login__Password();&lt;br&gt;  cookieSource.removeCookieValue(cookiesKeyLogin_username);&lt;br&gt;  cookieSource.removeCookieValue(cookiesKeyLogin_password);&lt;br&gt; }
&lt;p&gt; public void writeCookies(String username, String password, int maxAge) {&lt;br&gt;  writeCookiesValue_Login__Username(username, maxAge);&lt;br&gt;  writeCookiesValue_Login__Password(password, maxAge);&lt;br&gt; }
&lt;p&gt; public String getUsername() {&lt;br&gt;  String value = cookieSource&lt;br&gt;    .readCookieValue(generateApplicationCookiesKey_Login__Username());&lt;br&gt;  if (isCookiesEncryption()) {&lt;br&gt;   value = decrypt(value);&lt;br&gt;  }&lt;br&gt;  return value;&lt;br&gt; }
&lt;p&gt; public String getPassword() {&lt;br&gt;  String value = cookieSource&lt;br&gt;    .readCookieValue(generateApplicationCookiesKey_Login__Password());&lt;br&gt;  if (isCookiesEncryption()) {&lt;br&gt;   value = decrypt(value);&lt;br&gt;  }&lt;br&gt;  return value;&lt;br&gt; }
&lt;p&gt; private void writeCookiesValue_Login__Username(String username, int maxAge) {&lt;br&gt;  String key = generateApplicationCookiesKey_Login__Username();&lt;br&gt;  String value = username;&lt;br&gt;  if (isCookiesEncryption()) {&lt;br&gt;   value = encrypt(username);&lt;br&gt;  }&lt;br&gt;  cookieSource.writeCookieValue(key, value, maxAge);&lt;br&gt; }
&lt;p&gt; private void writeCookiesValue_Login__Password(String password, int maxAge) {&lt;br&gt;  String key = generateApplicationCookiesKey_Login__Password();&lt;br&gt;  String value = password;&lt;br&gt;  if (isCookiesEncryption()) {&lt;br&gt;   value = encrypt(password);&lt;br&gt;  }&lt;br&gt;  cookieSource.writeCookieValue(key, value, maxAge);&lt;br&gt; }
&lt;p&gt; private String generateApplicationCookiesKey_Login__Username() {&lt;br&gt;  return generateApplicationCookiesKey(COOKIES_KEY_LOGIN_USERNAME);&lt;br&gt; }
&lt;p&gt; private String generateApplicationCookiesKey_Login__Password() {&lt;br&gt;  return generateApplicationCookiesKey(COOKIES_KEY_LOGIN_PASSWORD);&lt;br&gt; }
&lt;p&gt; private String generateApplicationCookiesKey(String key) {&lt;br&gt;  String contextPath = request.getContextPath();&lt;br&gt;  return absoluteURLBuilder.constructURL(contextPath + &amp;quot;/&amp;quot;) + key;&lt;br&gt; }
&lt;p&gt; public void setCookieSource(CookieSource cookieSource) {&lt;br&gt;  this.cookieSource = cookieSource;&lt;br&gt; }
&lt;p&gt; public void setRequest(WebRequest request) {&lt;br&gt;  this.request = request;&lt;br&gt; }
&lt;p&gt; public void setAbsoluteURLBuilder(AbsoluteURLBuilder absoluteURLBuilder) {&lt;br&gt;  this.absoluteURLBuilder = absoluteURLBuilder;&lt;br&gt; }
&lt;p&gt;}
&lt;p&gt;hivemodule.xml配置
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br&gt;&amp;lt;module id=&amp;quot;common.tapestry&amp;quot; version=&amp;quot;1.0.0&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;service-point id=&amp;quot;LoginCookiesManager&amp;quot; interface=&amp;quot;common.tapestry.engine.LoginCookiesManager&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;invoke-factory&amp;gt;&lt;br&gt;   &amp;lt;construct class=&amp;quot;common.tapestry.engine.LoginCookiesManagerImpl&amp;quot; &amp;gt;&lt;br&gt;     &amp;lt;set-object property=&amp;quot;cookieSource&amp;quot; value=&amp;quot;infrastructure:cookieSource&amp;quot;/&amp;gt;&lt;br&gt;     &amp;lt;set-service property=&amp;quot;absoluteURLBuilder&amp;quot; service-id=&amp;quot;tapestry.request.AbsoluteURLBuilder&amp;quot;/&amp;gt;&lt;br&gt;              &amp;lt;set-service property=&amp;quot;request&amp;quot; service-id=&amp;quot;tapestry.globals.WebRequest&amp;quot;/&amp;gt;   &lt;br&gt;              &amp;lt;set-object property=&amp;quot;applicationPropertySource&amp;quot; value=&amp;quot;service:tapestry.props.ApplicationPropertySource&amp;quot;/&amp;gt;              &lt;br&gt;      &amp;lt;/construct&amp;gt;&lt;br&gt;  &amp;lt;/invoke-factory&amp;gt; &lt;br&gt;&amp;lt;/service-point&amp;gt;
&lt;p&gt;&amp;lt;contribution configuration-id=&amp;quot;tapestry.Infrastructure&amp;quot;&amp;gt;&lt;br&gt;    &amp;lt;property name=&amp;quot;loginCookiesManager&amp;quot; object=&amp;quot;service:common.tapestry.LoginCookiesManager&amp;quot;/&amp;gt;&lt;br&gt;&amp;lt;/contribution&amp;gt;&lt;br&gt;&amp;lt;/module&amp;gt;
&lt;p&gt;使用
&lt;p&gt;在BasePage中获得该service
&lt;p&gt;public LoginCookiesManager getLoginCookiesManager() {&lt;br&gt;  LoginCookiesManager svc = (LoginCookiesManager) getRequestCycle().getInfrastructure().getProperty(&amp;quot;loginCookiesManager&amp;quot;);&lt;br&gt;  return svc;&lt;br&gt; }&lt;br&gt; &lt;br&gt;/**&lt;br&gt;  * 判断用户是否已经登陆&lt;br&gt;  * &lt;br&gt;  * @return&lt;br&gt;  */&lt;br&gt; private boolean isUserLoggedIn() {&lt;br&gt;  Object asmVisit = this.getRequestCycle().getInfrastructure().getApplicationStateManager().get(ASM_VISIT);
&lt;p&gt;  if (!(asmVisit instanceof IVisit)) {&lt;br&gt;   throw new ApplicationRuntimeException(&lt;br&gt;     &amp;quot;The visit class must implements &amp;quot; + IVisit.class);&lt;br&gt;  }&lt;br&gt;  IVisit visit = (IVisit) asmVisit;&lt;br&gt;  if (visit == null || (visit != null &amp;amp;&amp;amp; !visit.isLoggedIn())) {&lt;br&gt;   IPage loginPage = getRequestCycle().getPage(PAGE_LOGIN);&lt;br&gt;   if (loginPage instanceof IConstructVisit) {&lt;br&gt;    //从cookies中找回用户名和密码&lt;br&gt;    String cookiesLoginUsername = getLoginCookiesManager().getUsername();&lt;br&gt;    String cookiesLoginPassword = getLoginCookiesManager().getPassword();&lt;br&gt;    IConstructVisit constructVisit = (IConstructVisit) loginPage;&lt;br&gt;    visit = constructVisit.doConstructVisit(this.getRequestCycle(),&lt;br&gt;      cookiesLoginUsername, cookiesLoginPassword);&lt;br&gt;   } else {&lt;br&gt;    throw new ApplicationRuntimeException(&amp;quot;The &amp;quot; + PAGE_LOGIN&lt;br&gt;      + &amp;quot; class must implements &amp;quot; + IConstructVisit.class);&lt;br&gt;   }&lt;br&gt;  }&lt;br&gt;  if (visit == null)&lt;br&gt;   return Boolean.FALSE.booleanValue();&lt;br&gt;  return visit.isLoggedIn();&lt;br&gt; } 
&lt;p&gt;&lt;br&gt;Login类必须实现如下接口&lt;br&gt;package common.tapestry;
&lt;p&gt;import org.apache.tapestry.IRequestCycle;
&lt;p&gt;public interface IConstructVisit {&lt;br&gt; public IVisit doConstructVisit(IRequestCycle cycle, String username,String password);&lt;br&gt;}
&lt;p&gt; &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+How+to+use+cookies+in+tapestry4%3f+my+Tapestry4.1.5%60LoginCookiesManagerImpl&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!319.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!319.entry</guid><pubDate>Mon, 24 Mar 2008 06:23:52 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!319/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!319.entry#comment</wfw:comment><dcterms:modified>2008-03-24T06:23:52Z</dcterms:modified></item><item><title>Tapestry4.1.5`s common Base Border Component</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!318.entry</link><description>&lt;p&gt;Tapestry4.1.5`s common Base Border Component 
&lt;p&gt;考虑到每个项目都必须具有Border组件,所以把这个组件提到Base项目的ext组件库&lt;br&gt;但是每个项目的基本css又各不相同,这个css可以使用Tapestry的meta提供给Border&lt;br&gt;我在{yourTapestyServlet}.application中增加&lt;br&gt;&amp;lt;meta key=&amp;quot;common.tapestry.components.border.stylesheets&amp;quot; value=&amp;quot;css/POJO*.css,css/sys*.css&amp;quot;/&amp;gt;&lt;br&gt;其value是一个通配符表达式,灵感来源于spring的加载*.xml的写法,&amp;quot;,&amp;quot;号分割多个匹配 
&lt;p&gt;来看我们的Border.jwc规范 
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br&gt;&amp;lt;!DOCTYPE component-specification PUBLIC&lt;br&gt;  &amp;quot;-//Apache Software Foundation//Tapestry Specification 4.0//EN&amp;quot;&lt;br&gt;  &amp;quot;&lt;a href="http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"&gt;http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd&lt;/a&gt;&amp;quot;&amp;gt; 
&lt;p&gt;&amp;lt;component-specification allow-body=&amp;quot;yes&amp;quot; allow-informal-parameters=&amp;quot;no&amp;quot; class=&amp;quot;common.tapestry.components.Border&amp;quot;&amp;gt;                         &lt;br&gt;&amp;lt;parameter name=&amp;quot;title&amp;quot;/&amp;gt;&lt;br&gt;&amp;lt;parameter name=&amp;quot;ajaxDelegate&amp;quot;/&amp;gt; 
&lt;p&gt;&amp;lt;component id=&amp;quot;shell&amp;quot; type=&amp;quot;Shell&amp;quot;&amp;gt;&lt;br&gt;    &amp;lt;binding name=&amp;quot;title&amp;quot; value=&amp;quot;ognl:title+' - '+messages.getMessage('appname')&amp;quot;/&amp;gt;&lt;br&gt;    &amp;lt;binding name=&amp;quot;doctype&amp;quot; value=&amp;quot;literal:html PUBLIC &amp;amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;amp;quot; &amp;amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;amp;quot;&amp;quot; /&amp;gt;&lt;br&gt; &amp;lt;binding name=&amp;quot;delegate&amp;quot; value=&amp;quot;new org.apache.tapestry.components.BlockRenderer(components.remainingHead)&amp;quot;/&amp;gt;&lt;br&gt;    &amp;lt;binding name=&amp;quot;renderBaseTag&amp;quot; value=&amp;quot;ognl:false&amp;quot; /&amp;gt;&lt;br&gt;    &amp;lt;binding name=&amp;quot;disableTapestryMeta&amp;quot; value=&amp;quot;ognl:true&amp;quot; /&amp;gt;&lt;br&gt;    &amp;lt;inherited-binding name=&amp;quot;ajaxDelegate&amp;quot; parameter-name=&amp;quot;ajaxDelegate&amp;quot; /&amp;gt;&lt;br&gt;    &amp;lt;binding name=&amp;quot;stylesheets&amp;quot; value=&amp;quot;ognl:stylesheets&amp;quot;/&amp;gt;    &lt;br&gt;&amp;lt;/component&amp;gt; 
&lt;p&gt;&amp;lt;inject property=&amp;quot;httpServletRequest&amp;quot; object=&amp;quot;service:tapestry.globals.HttpServletRequest&amp;quot;/&amp;gt;&lt;br&gt;&amp;lt;inject property=&amp;quot;webContext&amp;quot; object=&amp;quot;service:tapestry.globals.WebContext&amp;quot;/&amp;gt; 
&lt;p&gt;&amp;lt;!--&lt;br&gt;&amp;lt;inject property=&amp;quot;stylesheetResource&amp;quot; type=&amp;quot;meta&amp;quot; object=&amp;quot;common.tapestry.components.border.stylesheets&amp;quot;/&amp;gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&amp;lt;/component-specification&amp;gt; 
&lt;p&gt;html模板 
&lt;p&gt;&amp;lt;html jwcid=&amp;quot;shell&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;head jwcid=&amp;quot;&lt;a href="mailto:remainingHead@Block"&gt;remainingHead@Block&lt;/a&gt;&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; /&amp;gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body jwcid=&amp;quot;@Body&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;span jwcid=&amp;quot;@RenderBody&amp;quot;/&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt; 
&lt;p&gt;&lt;br&gt;Border.java 
&lt;p&gt;package common.tapestry.components; 
&lt;p&gt;import java.io.IOException;&lt;br&gt;import java.util.ArrayList;&lt;br&gt;import java.util.List; 
&lt;p&gt;import javax.servlet.ServletContext;&lt;br&gt;import javax.servlet.http.HttpServletRequest; 
&lt;p&gt;import org.apache.tapestry.BaseComponent;&lt;br&gt;import org.apache.tapestry.IAsset;&lt;br&gt;import org.apache.tapestry.asset.ContextAsset;&lt;br&gt;import org.apache.tapestry.web.WebContext;&lt;br&gt;import org.apache.tapestry.web.WebContextResource;&lt;br&gt;import org.springframework.core.io.Resource;&lt;br&gt;import org.springframework.web.context.support.ServletContextResource;&lt;br&gt;import org.springframework.web.context.support.ServletContextResourcePatternResolver; 
&lt;p&gt;public abstract class Border extends BaseComponent {&lt;br&gt; // public abstract String getStylesheetResource(); //inject meta can`not&lt;br&gt; // use? 
&lt;p&gt; public abstract HttpServletRequest getHttpServletRequest(); 
&lt;p&gt; public abstract WebContext getWebContext(); 
&lt;p&gt; public static final String APPLICATION_META_KEY_DEFAULT_BORDER_STYLE = &amp;quot;common.tapestry.components.border.stylesheets&amp;quot;;&lt;br&gt; public static final String DEFAULT_STYLESHEET_RESOURCE = &amp;quot;css/system_*.css&amp;quot;; 
&lt;p&gt; public String getStylesheetResource() {&lt;br&gt;  String tmp = getPage().getRequestCycle().getInfrastructure()&lt;br&gt;    .getApplicationPropertySource().getPropertyValue(&lt;br&gt;      APPLICATION_META_KEY_DEFAULT_BORDER_STYLE);&lt;br&gt;  return (tmp != null) ? tmp : DEFAULT_STYLESHEET_RESOURCE;&lt;br&gt; } 
&lt;p&gt; public abstract IAsset[] getCssAsset(); 
&lt;p&gt; public abstract void setCssAsset(IAsset[] oo); 
&lt;p&gt; public IAsset[] getStylesheets() { 
&lt;p&gt;  if (getCssAsset() == null) { 
&lt;p&gt;   String _stylesheetResource = (getStylesheetResource() != null) ? getStylesheetResource()&lt;br&gt;     : DEFAULT_STYLESHEET_RESOURCE;&lt;br&gt;   List list = new ArrayList();&lt;br&gt;   ServletContext _servletContext = getHttpServletRequest()&lt;br&gt;     .getSession().getServletContext();&lt;br&gt;   ServletContextResourcePatternResolver servletContextResourcePatternResolver = new ServletContextResourcePatternResolver(&lt;br&gt;     _servletContext); 
&lt;p&gt;   String[] _stylesheetResources = _stylesheetResource.split(&amp;quot;,&amp;quot;); 
&lt;p&gt;   for (int i = 0; i &amp;lt; _stylesheetResources.length; i++) { 
&lt;p&gt;    try {&lt;br&gt;     Resource[] resources = servletContextResourcePatternResolver&lt;br&gt;       .getResources(_stylesheetResources[i]); 
&lt;p&gt;     for (int j = 0; j &amp;lt; resources.length; j++) {&lt;br&gt;      ServletContextResource resource = (ServletContextResource) resources[j]; 
&lt;p&gt;      WebContextResource _resourceLocation = new WebContextResource(&lt;br&gt;        getWebContext(), resource.getPath());&lt;br&gt;      IAsset asset = new ContextAsset(&lt;br&gt;        common.tapestry.TapestryUtils&lt;br&gt;          .getContextPath(getPage()&lt;br&gt;            .getRequestCycle()),&lt;br&gt;        _resourceLocation, getLocation(), getPage()&lt;br&gt;          .getRequestCycle());&lt;br&gt;      list.add(asset);&lt;br&gt;     } 
&lt;p&gt;    } catch (IOException e) {&lt;br&gt;     e.printStackTrace();&lt;br&gt;    }&lt;br&gt;   } 
&lt;p&gt;IAsset[] tmp = (IAsset[])list.toArray(new IAsset[list.size()]);&lt;br&gt;   setCssAsset(tmp);&lt;br&gt;  }&lt;br&gt;  return getCssAsset();&lt;br&gt; }&lt;br&gt;}&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+Tapestry4.1.5%60s+common+Base+Border+Component&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!318.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!318.entry</guid><pubDate>Mon, 24 Mar 2008 02:59:26 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!318/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!318.entry#comment</wfw:comment><dcterms:modified>2008-03-25T00:41:30Z</dcterms:modified></item><item><title>Tapestry4.1.5 how to inject spring`s bean to pages</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!312.entry</link><description>&lt;p&gt;Tapestry4.1.5 how to inject spring`s bean to pages 
&lt;p&gt;1、in web.xml config spring 
&lt;p&gt;&amp;lt;context-param&amp;gt;&lt;br&gt;    &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br&gt;    &amp;lt;param-value&amp;gt;classpath:applicationContext.xml&amp;lt;/param-value&amp;gt;&lt;br&gt;&amp;lt;/context-param&amp;gt; 
&lt;p&gt;&amp;lt;listener&amp;gt;&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&amp;lt;/listener&amp;gt; 
&lt;p&gt;2、put the tapestry-spring-1.0.0.jar to your classpath&lt;br&gt;you can download here&lt;br&gt;&lt;a href="http://howardlewisship.com/tapestry-javaforge/tapestry-spring/"&gt;http://howardlewisship.com/tapestry-javaforge/tapestry-spring/&lt;/a&gt; 
&lt;p&gt;&lt;br&gt;ok you can use  &amp;lt;inject property=&amp;quot;userInfoService&amp;quot; object=&amp;quot;spring:userInfoService&amp;quot;/&amp;gt; in your .page file &lt;br&gt;or use Annotations inject the service 
&lt;p&gt;but how to get the spring`s beans in the java code ? &lt;br&gt;-------------------------------------------------------------- 
&lt;p&gt;3、config your ${yourApp}/WEB-INF/hivemodule.xml 
&lt;p&gt;&amp;lt;contribution configuration-id=&amp;quot;tapestry.Infrastructure&amp;quot;&amp;gt;&lt;br&gt;    &amp;lt;property name=&amp;quot;springObjectProvider&amp;quot; object=&amp;quot;service:hivemind.lib.SpringObjectProvider&amp;quot;/&amp;gt;&lt;br&gt;&amp;lt;/contribution&amp;gt; 
&lt;p&gt;put the springObjectProvider to the tapestry.Infrastructure 
&lt;p&gt;ok in your code you can 
&lt;p&gt;org.apache.hivemind.service.ObjectProvider springprovider springprovider = (ObjectProvider) infrastructure.getProperty(&amp;quot;springprovider&amp;quot;); 
&lt;p&gt;YourSpringBean yourSpringBean = (YourSpringBean)springprovider.provideObject(null, null, yourSpringBeanId, null); 
&lt;p&gt;  
&lt;p&gt;  
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+Tapestry4.1.5+how+to+inject+spring%60s+bean+to+pages&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!312.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!312.entry</guid><pubDate>Fri, 21 Mar 2008 01:45:36 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!312/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!312.entry#comment</wfw:comment><dcterms:modified>2008-03-21T01:48:21Z</dcterms:modified></item><item><title>Tapestry5的无侵入式框架实现use Annotations?</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!304.entry</link><description>&lt;div&gt;Tapestry5称使用JDK5的Annotations实现无侵入式的框架，我看起来Annotations依然是侵入到了类,:(&lt;/div&gt;
&lt;div&gt;敏捷的思维正在一步步渗透到Java Framework中,现在不仅要求类与类之间要解藕，类和Framework之间也要解耦,&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;途径:1)硬编码,extends/implements&lt;/div&gt;
&lt;div&gt;      2)xml&lt;/div&gt;
&lt;div&gt;      3)Framework的实践约定,比如说 public void **doActionListener(),方法名称的匹配说明了这是个Action监听器,够敏捷吧&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;我期待的Tapestry Control BackingBean是更纯的Java类,看来这个实现除了xml + implments,只剩下Framework的约定才能实现了,毕竟不用xml,不用Annotations,不用extends/implements 你得告诉Framework container 这个BackingBean 是怎么跟template粘起来的!&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+Tapestry5%e7%9a%84%e6%97%a0%e4%be%b5%e5%85%a5%e5%bc%8f%e6%a1%86%e6%9e%b6%e5%ae%9e%e7%8e%b0use+Annotations%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!304.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!304.entry</guid><pubDate>Mon, 14 May 2007 14:14:18 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!304/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!304.entry#comment</wfw:comment><dcterms:modified>2007-05-14T14:14:18Z</dcterms:modified></item><item><title>利用org.apache.commons.io.FileUtils快速读写文件</title><link>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!296.entry</link><description>&lt;div&gt;String fileName = &amp;quot;C://11.txt&amp;quot;;&lt;br&gt;  File file = new File(fileName);&lt;br&gt;  String fileContent = &amp;quot;&amp;quot;;&lt;br&gt;  try {&lt;br&gt;   fileContent = org.apache.commons.io.FileUtils.readFileToString(file, &amp;quot;GBK&amp;quot;);&lt;br&gt;  } catch (IOException e) {&lt;br&gt;   e.printStackTrace();&lt;br&gt;  }&lt;br&gt;  fileContent +=&amp;quot;Helloworld&amp;quot;;&lt;br&gt;  try {&lt;br&gt;   org.apache.commons.io.FileUtils.writeStringToFile(file, fileContent, &amp;quot;GBK&amp;quot;);&lt;br&gt;  } catch (IOException e) {&lt;br&gt;   e.printStackTrace();&lt;br&gt;  }&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1409798983858752950&amp;page=RSS%3a+%e5%88%a9%e7%94%a8org.apache.commons.io.FileUtils%e5%bf%ab%e9%80%9f%e8%af%bb%e5%86%99%e6%96%87%e4%bb%b6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=oxyc.spaces.live.com&amp;amp;GT1=oxyc"&gt;</description><comments>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!296.entry#comment</comments><guid isPermaLink="true">http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!296.entry</guid><pubDate>Tue, 27 Mar 2007 04:45:12 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://oxyc.spaces.live.com/blog/cns!EC6F634B2A64724A!296/comments/feed.rss</wfw:commentRss><wfw:comment>http://oxyc.spaces.live.com/Blog/cns!EC6F634B2A64724A!296.entry#comment</wfw:comment><dcterms:modified>2007-03-27T04:45:12Z</dcterms:modified></item></channel></rss>