<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>pikachu</title>
    <description></description>
    <link>http://pikachu.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>Liferay 4.3 中 friendly url的生成和解析过程</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/124763" style="color:red;">http://pikachu.javaeye.com/blog/124763</a>&nbsp;
          发表时间: 2007年09月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          friendly url是liferay的一个功能.在liferay里,可以将portal系统生成的复杂的url转换成好记的url.<br />比如在我的liferay 4.3.1环境下<br />http://localhost:8080/c/portal/layout?p_l_id=10125&_19_messageId=10505&p_p_id=19&p_p_state=maximized&p_p_action=0&_19_struts_action=%2Fmessage_boards%2Fview_message<br />和<br />http://localhost:8080/web/26/1/message_boards/message/10505<br />是同一个页面.<br /><br />程序是如何将原来复杂的url转换成那么简单的friendly url的,当程序要处理friendly url时,又是如何处理的呢?<br /><br />具体的调试跟踪过程不再赘述,这是一个有趣而痛苦的过程,这里我只列出最后的调试结果<br /><br />liferay解析friendlyurl的过程<br /><ol><li>浏览器提交friendlyurl</li><li>FriendlyURLServlet.service处理</li><li>调用getRedirect</li>从url里能够截取 groupid,layoutid (url中的/26/1)<li>调用PortalUtil.getLayoutActualURL</li><li>从liferay-portlet.xml中查询friendly url mapper</li><li>根据mapper的getMapping方法和url中截取的相匹配,查到对应的mapper(url中的message_boards)</li><li>调用mapper的populateParams,将friendly url转换为参数对(message_boards/message/10505->_19_messageId=10505;	_19_struts_action=%2Fmessage_boards%2Fview_message)</li><li>从前面查出的groupid,layoutid,查询出plid (/web/26/1->p_l_id=10125)</li><li>补充其余的参数(p_p_action,p_p_state)</li><li>返回原始的url给FriendlyURLServlet</li><li>forward该url</ol></li>接下去和以前版本一样,由MainServlet处理<br />以上流程见下图<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/5258/f4500346-bff5-42b4-9ffd-ae8f456376f3.png" /><br /><br />liferay生成friendlyurl的过程<br /><ol><li>页面获得PortletURL实例(renderResponse.createActionURL() renderResponse.createRenderURL())</li><li>PortletURLImpl.generateToString()</li><li>PortalUtil.getLayoutFriendlyURL 构造出groupid和layoutid样式的url</li><li>调用getPortletFriendlyURLPath</li><li>从_portlet.getFriendlyURLMapper()查询mapper</li><li>如果由mapper,那么调用mapper.buildPath,mapper会将原先的parameter转换成friendlyurl</li><li>将页面url和protleturl合并,在页面上显示最终的friendlyurl</ol></li>以上流程见下图<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/5259/b10d1291-74db-4437-a62c-f8ad5142e697.png" />
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/124763#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Sep 2007 17:03:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/124763</link>
        <guid>http://pikachu.javaeye.com/blog/124763</guid>
      </item>
      <item>
        <title>Liferay 4.3 与CAS集成配置方法</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/122831" style="color:red;">http://pikachu.javaeye.com/blog/122831</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文基于Liferay 4.3，采用默认的cas验证。在生产环境中，请参阅cas手册，调整cas验证方法。下文的keytool都是在命令行下运行，keytool使用方法请参见sun手册。<br /><br />Liferay 4.3的cas配置同4.2类似，我们一步步来。<br /><br />首先检查是否已有创建过同名证书<br /><pre name="code" class="java">keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass changeit</pre><br /><br />如果找到同名证书，请找到原有创建时的证书keystore，如果找不到可以使用<br /><pre name="code" class="java">
keytool -delete -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass changeit</pre><br />删除已有的证书。<br /><span style="color: red">原始证书删除后，将会影响到使用该证书的应用，请谨慎决定</span><br /><br />随后创建所需证书<br /><pre name="code" class="java">keytool -genkey -alias tomcat -keystore c:\mykeystore  -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass changeit

keytool -export -alias tomcat -keystore c:\mykeystore -file c:\mycerts.cer -storepass changeit

keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass changeit -file c:\mycerts.cer</pre><br /><br />证书创建完成后，依旧是用-list检测<br /><pre name="code" class="java">keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass changeit</pre><br /><br />随后我们从 <a href="http://downloads.sourceforge.net/lportal/liferay-portal-cas-web-4.3.1.war" target="_blank">http://downloads.sourceforge.net/lportal/liferay-portal-cas-web-4.3.1.war</a>下载cas集成包。将下载后的文件改名为cas-web.war，放置在liferay的webapps目录下<br /><br />修改liferay所在tomcat下conf/server.xml。将SSL段修改为<br /><pre name="code" class="java">&lt;Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
    					 URIEncoding="UTF-8" keystoreFile="c:\mykeystore" keystorePass="changeit" keyAlias="tomcat"/></pre><br /><br />修改liferay配置文件<br />在liferay 的webapps\ROOT\WEB-INF\classes下，修改(创建)portal-ext.properties，在其中添加 <br /><pre name="code" class="java">cas.auth.enabled=true</pre><br /><br />启动liferay，在首页上选择<span style="color: red">右上角</span> Sign In,页面跳转到cas登陆页面<br /><br />使用 joebloggs/joebloggs登陆liferay.
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/122831#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 11:25:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/122831</link>
        <guid>http://pikachu.javaeye.com/blog/122831</guid>
      </item>
      <item>
        <title>Liferay 4.3 新功能介绍-- multiple companies , one liferay</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/122580" style="color:red;">http://pikachu.javaeye.com/blog/122580</a>&nbsp;
          发表时间: 2007年09月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay是很早就支持多company的asp模式的。不过原先的支持方式很复杂，需要copy liferay，在web.xml中设置新的company_id，最后配置server的virtual host。<br /><br />从版本4开始，liferay逐步开始支持内置virtual host支持。在运行时可以指定virtual host与某个community的对应关系。4.3版本则可以在运行时配置新增一个company。<br /><br />新增company后，将生成一套全新的portal环境。与其他的company互不干扰。这下asp模式的portal应用更加便利了。<br /><br />要使用multiple companies，在admin portlet里选Instances，填写新company所对应的名称、virtual host 域名和 邮局域名。当使用新的virtual host 域名时，liferay将会显示该company环境。
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/122580#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Sep 2007 14:53:39 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/122580</link>
        <guid>http://pikachu.javaeye.com/blog/122580</guid>
      </item>
      <item>
        <title>Liferay 4.3 新功能介绍--OpenSearch</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/122552" style="color:red;">http://pikachu.javaeye.com/blog/122552</a>&nbsp;
          发表时间: 2007年09月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          OpenSearch协议请参见 <a href="http://www.opensearch.org/" target="_blank">http://www.opensearch.org/</a>。OpenSearch可以将search结果以atom或者rss格式返回。<br /><br />liferay里中有多个portlet提供opensearch支持。参见liferay-portlet.xml，其中带有open-search-class的都是支持opensearch的portlet<br /><br />可以使用如下格式，测试官方网站的opensearch功能<br /><a href="http://www.liferay.com/c/search/open_search?keywords=hello&p=1&c=2&format=atom" target="_blank">http://www.liferay.com/c/search/open_search?keywords=hello&p=1&c=2&format=atom</a>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/122552#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Sep 2007 13:38:30 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/122552</link>
        <guid>http://pikachu.javaeye.com/blog/122552</guid>
      </item>
      <item>
        <title>Liferay 4.3 新功能介绍--SiteMap</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/100399" style="color:red;">http://pikachu.javaeye.com/blog/100399</a>&nbsp;
          发表时间: 2007年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          sitemap:<a href="http://wiki.liferay.com/index.php/How_to_use_the_sitemap_protocol_with_Liferay" target="_blank">http://wiki.liferay.com/index.php/How_to_use_the_sitemap_protocol_with_Liferay</a><br />Sitemap协议将有助于搜索引擎对站点进行分析和抓取。在Liferay4.3中以增添了对Sitemap的协议的支持，任何public的community都可以有sitemap，而任何public的page都可以配置sitem参数。<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/4282/c0cb8bee-0caf-46f9-a781-57d42116ba2a.png " /><br /><br /><pre name="code" class="java">  &lt;?xml version="1.0" encoding="UTF-8" ?> 
  &lt;urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
  &lt;url>
  &lt;loc>http://localhost:8080/c/portal/layout?p_l_id=10090&lt;/loc> 
  &lt;/url>
  &lt;/urlset></pre>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/100399#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jul 2007 13:35:55 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/100399</link>
        <guid>http://pikachu.javaeye.com/blog/100399</guid>
      </item>
      <item>
        <title>Liferay 4.3 新功能介绍--Staging</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/98088" style="color:red;">http://pikachu.javaeye.com/blog/98088</a>&nbsp;
          发表时间: 2007年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Staging <a href="http://wiki.liferay.com/index.php/Staging" target="_blank">http://wiki.liferay.com/index.php/Staging</a><br />如果将liferay正式应用于生产系统，需要有个方法能够不影响生产环境而进行Community页面的修改和测试，待完成修改后再发布到生产系统中。<br />原先的做法是使用单独的liferay，带页面配置后导出lar文件再导入。<br />本版本增加Staging功能，可以直接在原系统上进行划分出Staging区域。该区域中中的页面配置不会影响原有页面，配置测试完成后同步回正常区域。<br />使用方法：<br />使用 Communities portlet中Configure Pages功能，选择Staging <br /><br /><img src="http://pikachu.javaeye.com/upload/picture/pic/4215/5047b008-db0d-441d-97d2-f9ed912f021e.png " /> Active Staging后，使用 View Page配置Staging页面，配置完成后Publish to Live.
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/98088#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jul 2007 13:16:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/98088</link>
        <guid>http://pikachu.javaeye.com/blog/98088</guid>
      </item>
      <item>
        <title>Liferay中的第三方组件：验证码(simple java captcha)</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/91872" style="color:red;">http://pikachu.javaeye.com/blog/91872</a>&nbsp;
          发表时间: 2007年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay是个很成功的开源项目，其中用到了大量的第三方组件。<br /><br />组件列表来自<br />http://wiki.liferay.com/index.php/Liferay_Dependencies <br /><br />simple java captcha <a href="http://simplecaptcha.sourceforge.net" target="_blank">http://simplecaptcha.sourceforge.net</a> 是一套创建验证码图像的组件。Liferay使用该组件在多个功能中添加验证码功能。<br /><br />在4.3版本中验证码的配置有两个地方<br />portal.properties<br /><pre name="code" class="java">##
## Captcha
##

    #
    # Set the maximum number of captcha checks per portlet session. Set this
    # value to 0 to always check. Set this value to a number less than 0 to
    # never check.
    #
    captcha.max.challenges=1</pre><br /><br />以及<br />captcha.properties<br /><pre name="code" class="java">include-and-override=captcha-ext.properties

cap.border=yes
cap.border.c=black
cap.border.th=1

cap.image.height=50
cap.image.width=150

#cap.text.producer=com.liferay.portal.captcha.DictionaryWordTextProducer
cap.text.producer=com.liferay.portal.captcha.PinNumberTextProducer
</pre><br />可以通过创建ext文件，覆盖默设置。
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/91872#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Jun 2007 11:32:51 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/91872</link>
        <guid>http://pikachu.javaeye.com/blog/91872</guid>
      </item>
      <item>
        <title>Liferay中的第三方组件：Google SOAP Search API </title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/84512" style="color:red;">http://pikachu.javaeye.com/blog/84512</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay是个很成功的开源项目，其中用到了大量的第三方组件。<br /><br />组件列表来自 <br />http://wiki.liferay.com/index.php/Liferay_Dependencies<br /><br />Google SOAP Search API <a href="http://code.google.com/apis/soapsearch/index.html" target="_blank">http://code.google.com/apis/soapsearch/index.html</a>是liferay中google portlet所用组件。该组件不是开源组件且只能个人使用。<br /><br />该组件代码在com.liferay.portlet.google包下使用，提供google的search、spell和cache功能.<br />要使用这些功能，需要有google license。并且在portal.properties中 Google License Keys 段配置。<br />现在google已经不再提供soap api的license，如果你以前申请过，那么还能继续使用<br /><div class="quote_title">引用</div><div class="quote_div">As of December 5, 2006, we are no longer issuing new API keys for the SOAP Search API. Developers with existing SOAP Search API keys will not be affected.</div><br /><br /><br />由于每个google license只能使用1000次，所以在liferay下可以配置多个License Keys，如果有一个出错了，那么liferay会使用下一个，但是这次查询会返回一个错误页面。这段代码值得商榷，是不是应该一直尝试直到成功或者把所有key都用完呢？
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/84512#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 May 2007 17:02:04 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/84512</link>
        <guid>http://pikachu.javaeye.com/blog/84512</guid>
      </item>
      <item>
        <title>Liferay中的第三方组件：Friki (wiki)</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/84174" style="color:red;">http://pikachu.javaeye.com/blog/84174</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay是个很成功的开源项目，其中用到了大量的第三方组件。<br /><br />组件列表来自 <br />http://wiki.liferay.com/index.php/Liferay_Dependencies <br /><br />Friki <a href="http://sourceforge.net/projects/friki" target="_blank">http://sourceforge.net/projects/friki</a> 是一个wiki程序，可独立运行。<br /><br />在liferay中的wiki页面展示和存储是自行开发的，只用到Friki ClassicToHTMLFilter以及相关的部分。所有用到friki的代码在com.liferay.portlet.wiki.util包下。<br /><br />ClassicToHTMLFilter的作用是将wiki的原始内容转换成html。转换规则参见<a href="http://www.stringtree.org/friki/view?PageFormatting" target="_blank">http://www.stringtree.org/friki/view?PageFormatting</a><br />此外，wiki还需要识别一些缩写并且转换为外部的url<br /><br />Friki使用spec和remoteNames实现上面的要求。可以在liferay下找到wiki.transform和intermap.txt。这两个文件分别是原始wiki的转换规则和外部url的列表。<br /><br />另，<br />liferay portal.properties中和wiki相关的配置在 wiki portlet下。<br />当前4.2版本中只有一项<br />wiki.front.page.name=FrontPage
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/84174#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 May 2007 13:02:13 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/84174</link>
        <guid>http://pikachu.javaeye.com/blog/84174</guid>
      </item>
      <item>
        <title>Liferay中的第三方组件：即时消息(AIM ICQ MSN YM)的开源客户端</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/83852" style="color:red;">http://pikachu.javaeye.com/blog/83852</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay是个很成功的开源项目，其中用到了大量的第三方组件。<br /><br />组件列表来自 <br />http://wiki.liferay.com/index.php/Liferay_Dependencies<br /><br />以上列举的是liferay所使用的外部即时消息服务。内部chat所使用的jabber本文不做讨论。<br /><br />所有的即时消息在当前版本中只有一个作用－－在calnedar portlet事件中进行提醒。<br /><br />发送即时消息的账户是在portal.properties中Instant Messenger下配置，<br />所有的密码是明文，有一定的安全风险。<br /><br /><br />接受即时消息的账户在portal用户账户中配置。<br /><br />所有即时消息的核心代码在com.liferay.portal.im包下<br /><br /><a href="http://jaimbot.sourceforge.net" target="_blank">http://jaimbot.sourceforge.net</a><br />AIM的客户端<br />该库使用非常简单，singon之后直接发送消息即可。非常容易开发。<br /><br /><a href="http://sourceforge.net/projects/ooimlib" target="_blank">http://sourceforge.net/projects/ooimlib</a><br />ICQ的客户端<br />该库使用java中Observer模式。loging之后并不能马上发送消息，需要等待update事件后才能发送。<br /><br /><a href="http://sourceforge.net/projects/jmsn" target="_blank">http://sourceforge.net/projects/jmsn</a><br />MSN的客户端<br />该库使用java中listener模式。login之后并不能马上发送消息，需要等待listener的whoJoinSession事件。<br /><br /><a href="http://jymsg9.sourceforge.net/ " target="_blank">http://jymsg9.sourceforge.net/ </a><br />YM的客户端<br />该库使用非常简单，login之后直接发送消息即可。非常容易开发。<br /><br />所有的即时消息组件将在portal关闭时断开连接。<br />详见com.liferay.portal.events.GlobalShutdownAction
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/83852#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 May 2007 11:26:39 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/83852</link>
        <guid>http://pikachu.javaeye.com/blog/83852</guid>
      </item>
      <item>
        <title>Liferay中的第三方组件：数据库持久层 Hibernate </title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/83811" style="color:red;">http://pikachu.javaeye.com/blog/83811</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay是个很成功的开源项目，其中用到了大量的第三方组件。<br /><br />组件列表来自<br /><a href="http://wiki.liferay.com/index.php/Liferay_Dependencies" target="_blank">http://wiki.liferay.com/index.php/Liferay_Dependencies</a><br /><br /><br />Hibernate<a href="http://www.hibernate.org/ " target="_blank">http://www.hibernate.org/ </a>在liferay中作为数据持久层组件，所有persistence包中都使用hibernate。<br /><br />Liferay中hibernate配置在portal.properties的hibernate段中。<br />其中hbm文件默认为位置在<br />META-INF/counter-hbm.xml,META-INF/mail-hbm.xml,META-INF/portal-hbm.xml,META-INF/ext-hbm.xml<br /><br />特别要注意的是：<br /><br />dialet=com.liferay.portal.spring.hibernate.DynamicDialect<br />此dialet使用hiberante中的DialectFactory.determineDialect(dbName, dbMajorVersion)动态判断<br />如果采用比较特殊的数据库，可以将dialet替换成实际使用的数据库方言。<br /><br />hibernate.query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory<br />该设置是为了避免同weblogic中的ANTLR版本冲突。<br /><div class="quote_title">引用</div><div class="quote_div">    #<br />    # Use the classic query factory until WebLogic and Hibernate 3 can get<br />    # along. See http://www.hibernate.org/250.html#A23 for more information.<br />    #</div><br />使用ClassicQueryTranslatorFactory不能在代码中使用hibernate3的新式hql，比如delete语句。<br />如果不用weblogic，可以将此设置改为<br />hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory<br /><br />hibernate session在spring中bean名字为<br />liferaySessionFactory
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/83811#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 May 2007 10:02:19 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/83811</link>
        <guid>http://pikachu.javaeye.com/blog/83811</guid>
      </item>
      <item>
        <title>Howto：使用Selenium IDE，如何模拟登录Liferay</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/69955" style="color:red;">http://pikachu.javaeye.com/blog/69955</a>&nbsp;
          发表时间: 2007年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay 4.2.1中为了阻止览器记住用户密码，会在每次登录时更换password所在输入框的name。<br />这样作一方面加强了安全性，另一方面也造成Selenium IDE进行测试时无法正常登录liferay。<br /><br /><img src="http://pikachu.javaeye.com/upload/picture/pic/2872/0e020f84-f990-4735-92e0-a68a70bd0e3c.png " /><br /><br />通过分析，liferay是根据com.liferay.util.servlet.SessionParameters参数来决定是否调整password输入框的名称<br /><br />我们进行一下调整，在classes下创建文件<br />system-ext.properties<br /><br />在其中添加<br />com.liferay.util.servlet.SessionParameters=false<br /><br />重启liferay后，重新录入脚本，回放正常<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/2873/faff1f3d-7e59-4bb3-92ae-9aab17d09152.png" />
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/69955#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Apr 2007 09:19:13 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/69955</link>
        <guid>http://pikachu.javaeye.com/blog/69955</guid>
      </item>
      <item>
        <title>Howto: 在Tomcat上如何集成Pentaho和Liferay</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/65266" style="color:red;">http://pikachu.javaeye.com/blog/65266</a>&nbsp;
          发表时间: 2007年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Pentaho和Liferay同时成为今年Jolt Enterprise Tools类的Productivity Winners。<br />Pentaho是一个完整的BI解决方案，不同于独立的报表或者数据挖掘，Pentaho立足于将多种BI所需部件通过流程进行串联集成。<br />更多的Pentaho内容请参考其主页<a href="http://www.pentaho.com/" target="_blank">http://www.pentaho.com/</a>。<br /><br />Pentaho的demo使用jboss作为发布平台，其中有jsr168的portlet界面。不过Pentaho也可以使用tomcat发布。tomcat发布过程参见<a href="http://qinhui99.itpub.net/post/2570/204839" target="_blank">http://qinhui99.itpub.net/post/2570/204839</a>。在tomcat上发布成功后，我们就可以考虑在Liferay上集成了。<br /><br />首先查看Pentaho的war结构。同标准的liferay portlet war相比，缺少liferay-portlet.xml和liferay-display.xml两个文件。而且PortalNavigationPortle是基于Jboss开发的。<br />修改Portlet.xml，注销掉第一个PortalNavigationPortle。创建liferay-portlet.xml和liferay-display.xml（参考其他liferay 例子）。从lib目录中删除portlet-api-1.0.jar。重新打成war包。启动liferay，使用热部署发布pentaho。成功后,可以在add content中看到新增的pentaho的portlet。<br /><br />但是在使用中会发生一些异常，报内存溢出，而且Portlet的名称也不正常。<br /><br />修改catalina.bat，将<br />set JAVA_OPTS=-Xms128m -Xmx768m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config<br />修改为<br />set JAVA_OPTS=-Xms128m -Xmx768m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config<br /><br />set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:MaxPermSize=128m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config<br /><br /><br />将portlet.properties及其他语言的文件拷贝到pentaho的WEB-INF下。<br /><br />重新启动liferay，Pentaho的portlet可以使用了。<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/2629/1b552924-eb67-4eb9-8824-5551961d1d6f.png" /><br /><br />附件中为修改后WEB-INF下的文件。<br />其中的pentaho.xml为conf\Catalina\localhost下的配置
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/65266#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 24 Mar 2007 21:57:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/65266</link>
        <guid>http://pikachu.javaeye.com/blog/65266</guid>
      </item>
      <item>
        <title>Howto: 如何集成Liferay与Alfresco帐户信息</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/54043" style="color:red;">http://pikachu.javaeye.com/blog/54043</a>&nbsp;
          发表时间: 2007年02月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay 新版本中可以与Alfresco进行比较密切的集成。Liferay中有两种集成方式，Alfresco content和Alfersco client。<br /><br /><a href="http://wiki.liferay.com/index.php/Setting_up_the_Alfresco_Portlet" target="_blank">http://wiki.liferay.com/index.php/Setting_up_the_Alfresco_Portlet</a><br /><br />使用Alfresco client模式，需要将alfresco 与 liferay部署在一起。默认情况下，添加alfresco client后需要再次登陆才能使用该portlet。<br /><br />通过修改Alfresco 的部分代码，可以做到同Liferay使用同一个帐号免除再次登陆的问题。<br /><br />参照<br /><a href="http://forums.alfresco.com/viewtopic.php?t=3014&highlight=jboss+portal+role" target="_blank">http://forums.alfresco.com/viewtopic.php?t=3014&highlight=jboss+portal+role</a><br />使用PortletFilter自动登录，使用Liferay 的 userid进行认证。<br /><br /><br />附件中是修改后文件<br />从<br /><a href="http://www.liferay.com/web/guest/downloads" target="_blank">http://www.liferay.com/web/guest/downloads</a><br />下载alfresco.war，将附件中文件覆盖war中的文件，使用Liferay中的portlet war部署功能发布该war（直接拷贝war文件不能正常运行）。<br /><br />注：参照<br /><a href="http://wiki.liferay.com/index.php/Setting_up_the_Alfresco_Portlet" target="_blank">http://wiki.liferay.com/index.php/Setting_up_the_Alfresco_Portlet</a><br />中的方式修改catalina.bat，避免PermGen错误。
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/54043#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 Feb 2007 20:15:31 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/54043</link>
        <guid>http://pikachu.javaeye.com/blog/54043</guid>
      </item>
      <item>
        <title>Howto: 如何使用Liferay权限配置</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/48930" style="color:red;">http://pikachu.javaeye.com/blog/48930</a>&nbsp;
          发表时间: 2007年01月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          当前的Liferay权限结构是从4.0版本开始的。jsr168中基于role的权限设计只解决了开发技术层面，并没有和实际的应用关联起来。在Liferay中权限设计有很大的扩展，并可在多个层次进行配置。<br /><br />首先要解释的是Liferay的权限模型。首先看一下Liferay的定义<br />A permission is defined as an action acting on a resource<br />在Liferay中，权限作用是判断当前用户是否允许在Resource上进行某项操作(action)。<br /><br /><br />Resource代表着一个个的可操作的实体。在Portal系统中，最直观的Resource就是一个个的Portlet。但是由于应用的原因，在Portlet下还可以根据应用的功能再细分，最典型的就是Message Board Portlet下还分Category和Message两类Resource。这些Resource是很直观的。此外还存在一些特殊的Resource可以控制，比如每张Page也是Resource。另外由于在Liferay中可以配置多个Community，每个Community都可以多次放置同一种Portlet作为多个Instance的，所以对于Resource又附加了Scope的概念。Resource有三种Scope：Enterprise、Community和Individual。Enterprise代表整个Portal系统中的一类资源，Community需要指明是哪个Community下的一类资源，Individual则是独立的Resource。<br /><br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1924/1500a19c-dc35-4ce5-ada7-b7509e4ecc6c.gif" /><br /><br />举个例子，我们要定义一个Permission<br />View＋Message Board Topic / Enterprise<br />上面的定义说明，“查看当前Portal系统中任一个Message Board的Topic”。<br />再举个例子<br />Update Message Board Topic / "Developer" Community Scope<br />上面的定义说明，“修改 Developer 这个 Community 下的任一个 Message Board Topic ”。<br /><br />在Liferay Portal中所有Portlet都会有默认的View/Configuration Action。其他的Resource和Action都需要开发人员预先设计，并在代码中调用PermissionChecker检验当前用户是否拥有权限。这是后话，今后在开发相关的文章中再讨论。<br /><br />如果理解了上面关于Resource、Scope和Action，接下去我们就可以讨论Liferay中如何进行设置，将Permission和User联系起来从而将权限赋予某人。<br /><br />首先说最简单的Individual类型的Resource的配置方法。如果以管理员身份登录系统，那么在任何一个portlet的右上角都有一个齿轮图标，点击该图标后选择Permissions标签就可进行该portlet得配置。<br /><br />假设我们以管理员身份登录后切换到support Community，对Message Boards权限进行配置。<br />新出现的页面第一排中如果选择Users、Organizations、Locations、User Groups，下方还将出现Current和Available。<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1927/53b2e632-691b-417f-8cb8-b75b29cdc06e.png" /><br />Current中是当前已经配置的结果，Available是可供选择的人员、机构的列表。<br />我们选择User->Available->Test HKG 1上打钩。点击Update Permissions。将所有权限都选择到Current下。配置后再查看Users->Current，现在Test HKG 1已经在Current下了。<br />使用test.hkg.1@liferay.com账户登录系统，可以看到Support下的Message Boards上出现了配置图标。而且有Add Category按钮。<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1925/86e6b740-53e7-489d-b4c3-55e5acea7901.png" /><br />然后看一下如何配置其他scope的权限。<br />首先以管理员身份登录系统，将Enterprise Admin添加到页面上。选择Roles，添加一个Role名称为SupportMBAdmin，选择Delegate。<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1926/1f205b21-b604-4995-a0b9-b97f95e5f677.png" /><br />在portlet列表中选择Message Boards，随后将Configuration后的Scope选择为Community，Next->Available->选择Support->Finish。随后使用SupportMBAdmin的assign，将Test HKG 2选中。<br />使用test.hkg.2@liferay.com账户登录系统，可以看到Support下的Message Boards上出现了配置图标。<br /><br />hkg.1和hkg.2有什么区别呢？<br />hkg.1获得的是Individual的Resource。只有这个Portlet是可以允许他配置的。<br />hkg.2获得的是support Community下任一个Message Boards的配置权限。<br /><br />最后要说明的是，个人页面上的Portlet的Permission配置是没有意义的。因为其他人不能查看你的页面，也就无法配置了。
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/48930#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Jan 2007 21:50:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/48930</link>
        <guid>http://pikachu.javaeye.com/blog/48930</guid>
      </item>
      <item>
        <title>Howto: 如何使用Liferay中Communities，兼谈page setting和其他</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/40651" style="color:red;">http://pikachu.javaeye.com/blog/40651</a>&nbsp;
          发表时间: 2006年12月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天来和大家讨论一下Liferay 中的 Communities 。<br />在Liferay中Communities被翻译为社区。这个翻译让人云里雾里，不知所谓。<br /><div class="quote_title">引用</div><div class="quote_div">Communities是什么？<br />A community is defined as a grouping of users by interest or skill set. For example, a “Pet Lovers" community would consist of users who have an interest in their pets, while a “Tech Support" community would consist of users who have the skills to provide technical support to an organization. A user can belong to any number of communities (NOTE: In previous versions of Liferay, communities were called groups). Communities are entities in and of themselves -- they do not belong to a specific organization or location.</div><br /><br />如果要一个比较贴切的概念，我觉得类似于现在流行的圈子。在本文中，我还是使用community一词。<br /><br /><br />Ok，理解了community 的意思，接下来，我们就要试着创建一个community来真正体会一下作用。<br /><br />启动Liferay，以管理员身份登录<br />添加Communities portlet。最大化这个portlet后，出现add按钮。<br />我们新建一个community 取名为java。其他的先保留默认设置<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1621/e00d6111-ac1a-446e-804b-a5654aa6e8cf.png" /><br />在我们新增的community后面出现了一排按钮。delete不用多说，本文中我们只讲述剩余中的三个按钮，edit、pages、assign。还有两个Permissions和Delegate留待后文权限部分再讨论。<br /><br />首先来一点最直接的测试，点击pages按钮<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1624/6f072711-6239-4fac-8a18-8dcff861ba21.png" /><br />出现public和private两个选项，但是其他的好像都类似哦！<br />先不管那么多，首先我们选择public，在name中输入"home"，点击add。<span style="color: blue">在private中也如此增加</span>。<br /><br />好像没什么反应啊！！<br /><br />不着急，在上方的“功能区”中如下图操作，显出出一个列表框<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1625/833f8012-a73f-4ced-a636-0ce749f4e9ab.png" /><br />出现了java public和java private。<br /><br />点击后出现了一个空白页面，我们可以在其中任意增加portlet。（不会增加portlet？在“功能区”中，选择add content图标，就是哪个十字）<br />这样我们就完成了community页面的配置。<br />那么public和private是什么区别呢？<br /><div class="quote_title">引用</div><div class="quote_div">A public page is a page in your community that can be accessed by guests. As long as the guest has the appropriate URL (Friendly URLs will be discussed in the next section), the guest has permission to access any public page.<br /><br />A private page is a page in your community that can only be accessed by logged in users who are part of your community. If a user is not logged in (i.e., the user is a guest) or if a user does not belong to your community, then the user cannot access your private page.</div><br /><br />我们不防测试一下，按照上面的方法，切换到java public和java private两个页面，分别记下url，我的liferay测试环境里分别是<br /><br />http://localhost:8080/c/portal/layout?p_l_id=PUB.1002.1<br />http://localhost:8080/c/portal/layout?p_l_id=PRI.1002.1<br /><br />然后退出当前账户，果然public所在页面能够被任何人访问，而private不行。<br /><br /><br />但是这种url太诡异了，能不能有更好记的呢？当然可以，重新用管理员身份登录，使用Communities 中的pages。<br />打开pages配置界面，最后有virtual host。<br />在Friendly URL中输入/java后保存。<br /><br />重复刚才退出的实验，只是这次的url使用<br />http://localhost:8080/web/java。<br /><br />我们又学会一个功能，Friendly URL。<br /><br />再来看看edit。<br />edit的功能粗看很简单，修改当前community的名称和描述，且慢，上面有一个open的选框是什么意思？我们先选上后再说。<br /><br />哈，按钮有变化了。多出了一个Leave的图标<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1622/59dec772-766f-40e1-89da-6bafd8665bf7.png" /><br />先点一下Leave，按钮又变成了join<br />再取消open，新增的按钮又消失了。<br /><br />从这里我们知道了community的一个小功能，如果是open的community，那么portal 用户能够自由选择加入或者退出community。<br /><br />那么除了open的community，还有其他办法么加入用户么？当然，这就是assign的作用，点击assign，出来一个复杂的页面，大家要熟悉这个页面，今后类似的页面会经常出现。<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1623/c7af6767-1c8a-4218-9c18-364129c28575.png" /><br />默认页面显示User下Current是创建者的名字,点击Organizations、Locations、User Groups，其中Current都是空的。<br />因为当community被创建的时候，只有创建者属于这个community。所以当前只有创建者的名字。<br />选择Available，其中有当前系统所有的用户。勾选某个用户后，点击Update Associations，该用户被添加到这个community中。<br /><br />我们也可以间接的添加用户，如果选择Organizations、Locations、User Groups，那么这些组织、机构或者用户组的成员就被间接的添加到community中了。<br /><br /><br />通过这次学习，和大家一起了解了<br />community的概念：community是一组成员的页面，相当于圈子的作用<br />community的创建和页面设置：创建community后，可以设置public和private页面，public可以直接供未登录的guest查看，private不行。<br />Friendly URL：设置一个Friendly URL可以提供更友好的url。根据liferay的设置，public的url是/web/FriendlyURL的形式，private的是/group/FriendlyURL<br />assign：可以设置为open,也可以由管理员手工配置。<br /><br />但是这次学习中没有讲解community的权限设置，包括如何设置community的管理权限，以及community上的各portlet的权限设置。
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/40651#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Dec 2006 22:19:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/40651</link>
        <guid>http://pikachu.javaeye.com/blog/40651</guid>
      </item>
      <item>
        <title>Liferay 4.2 Velocity 模板 render探索 (兼Java remote debug方法)</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/40184" style="color:red;">http://pikachu.javaeye.com/blog/40184</a>&nbsp;
          发表时间: 2006年12月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在 Liferay 4.2 parallel rendering 探索 <a href="http://pikachu.javaeye.com/blog/39937" target="_blank">http://pikachu.javaeye.com/blog/39937</a>中我们分析了portal render时的基本过程，但是其中的一个环节<br /><pre name="code" class="java">Velocity.evaluate(vc, sw, RuntimePortletUtil.class.getName(), content)</pre><br />让人很疑惑<br /><br />这次我们要打开这里的谜团，看看Velocity中的content到底是什么。<br /><br />这次我决定用动态的代码trace来帮助我们的trace<br /><br />首先要下载到liferay的源代码，并加载到eclipse中。<br />然后修改liferay 的 bin/catalina.bat文件<br />将<br /><pre name="code" class="java">
set JAVA_OPTS=-Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config
</pre><br />-><br /><pre name="code" class="java">set JAVA_OPTS=-Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config -Xdebug -Xrunjdwp:transport=dt_socket,address=4321,server=y,suspend=n</pre><br />新增的参数是告诉jdk，请在4321端口上监听我的调试命令。<br />其他的java程序也可以用类似的方法进行调试<br />startup启动liferay<br /><br />如果没有异常，我们在Eclipse|Run|Debug|Remote Java Application下新增一个调试配置。将port设置为<span style="color: blue">4321</span><br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1560/e92f3d4a-b936-41db-bad1-cb8069eaf6d4.png" /><br />debug<br />没有反应？？<br />切换到Debug Perspect <br />Bingo!!<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1561/4ecd239a-80c6-4546-a8b2-f7d4010af6b4.png" /><br /><br />既然调试器已经连接到liferay上了，我们就可以设置断点<br /><br />在portal-ejb/src下，找到com.liferay.portlet.layoutconfiguration.util.RuntimePortletUtil<br />在Velocity.evaluate设置断点<br /><br />然后用浏览器打开liferay页面，稍等片刻<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1562/b57cba1b-ba21-4d0d-99b8-2e179e5f6058.png" /><br />马上watch content这个变量<br /><br />很神奇，竟然是一套模板的内容<br />仔细查看其中的内容有<br /><pre name="code" class="java">$processor.processColumn("column-1")</pre><br />终于和上次我们的跟踪到的TemplateProcessor.processColumn联系起来了。<br /><br />那么这套content是从哪里来的呢？<br />把trace 倒退几层就找到了<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1563/400bcc64-deca-4401-b47c-9aa00772d7fe.png" /><br />打开html\portal\layout\view\portlet.jsp<br />找到了<pre name="code" class="java">
	String content = LayoutTemplateLocalUtil.getContent(layoutTypePortlet.getLayoutTemplateId(), false, theme.getThemeId());

	RuntimePortletUtil.processTemplate(application, pageContext, request, response, content);</pre><br /><br />原来content就是Layout Template的内容<br />另外搜索有$processor.processColumn("column-1")的文件也会发现，这些文件都在layouttpl目录下<br /><img src="http://pikachu.javaeye.com/upload/picture/pic/1564/2da1c84b-0835-4847-a570-1aac6451320f.png" /><br /><br />最后我们终于把整个环串了起来<br />LayoutAction->(forward)portal.layout-><br />(tiles定义)-> <br />html/common/themes/portal.jsp-><br />(include)portal_normal.jsp-><br />(include)/portal/layout.jsp-><br />(include)/portal/layout/view/portlet.jsp(加载template文件)-><br />RuntimePortletUtil.processTemplate-><br />Velocity.evaluate（使用template内容作为Velocity模板render）-><br />TemplateProcessor.processColumn-><br />PortletColumnLogic.processContent-><br />带出 /html/portal/load_render_portlet.jsp;
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/40184#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Dec 2006 11:56:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/40184</link>
        <guid>http://pikachu.javaeye.com/blog/40184</guid>
      </item>
      <item>
        <title>Howto: windows上如何快速体验liferay</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39948" style="color:red;">http://pikachu.javaeye.com/blog/39948</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在本机安装jdk 5.0，http://java.sun.com/javase/downloads/index.jsp下载</p>
<p>设置JAVA_HOME变量</p>
<p>在 <br />
<a href="http://prdownloads.sourceforge.net/lportal/liferay-portal-tomcat-jdk5-4.1.3.zip?download" target="_blank">http://prdownloads.sourceforge.net/lportal/liferay-portal-tomcat-jdk5-4.1.3.zip?download</a> <br />
下载当前新最新版liferay tomcat集成包</p>
<p>解压zip包 <br />
运行bin/start.bat</p>
<p>浏览器中输入http://localhost:8080 <br />
登录名为test@liferay.com <br />
密码为test</p>
<br />
<p>&nbsp;</p>
<p>另,为了避免portlet title乱码,应该选有jdk 5.0以上版本<br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39948#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:11:54 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39948</link>
        <guid>http://pikachu.javaeye.com/blog/39948</guid>
      </item>
      <item>
        <title>Howto: 如何让tomcat bundle liferay使用不同的数据库</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39947" style="color:red;">http://pikachu.javaeye.com/blog/39947</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>如果要使用不同的数据库，需要做好以下准备。 <br />
1. 设置好dbms系统，并且有方便的数据库客户端供使用 <br />
2. 找到适当的jdbc驱动 <br />
3. 下载liferay的数据库脚本 <br />
（http://prdownloads.sourceforge.net/lportal/liferay-portal-sql-4.1.3.zip?download）</p>
<p>将压缩文件解压后会看到三个主要的目录:create,portal和index <br />
create 目录中的脚本会在dbms中自动创建新的schema（有的叫database），这种自动创建的schema会被命名为lportal。如果数据库中有同名的，那么就会被drop。随后脚本创建liferay所需的table，并且插入初始化数据</p>
<p>portal目录中的脚本只会创建table，不会自动创建schema。</p>
<p>以上两类脚本只会在数据库中创建pk，不会创建一般索引。一般索引使用index目录中脚本创建。</p>
<p>数据库创建后通过dbms客户端设置账户、访问权限后</p>
<p>修改liferay所在${tomcathome}\conf\Catalina\localhost ROOT.xml <br />
<resource></resource></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Resource</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jdbc/LiferayPool&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auth</span><span>=</span><span class="attribute-value">&quot;Container&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;javax.sql.DataSource&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">driverClassName</span><span>=</span><span class="attribute-value">&quot;org.hsqldb.jdbcDriver&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url</span><span>=</span><span class="attribute-value">&quot;jdbc:hsqldb:test&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">username</span><span>=</span><span class="attribute-value">&quot;sa&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">password</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">maxActive</span><span>=</span><span class="attribute-value">&quot;20&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>修改driverClassName,url,username,passwd <br />
重启liferay，查看页面是否正常</p>
<p>注。在当前版本(4.1.3)中，请不要直接使用oracle 9以下驱动。因为oracle clob字段会被查询为null。oracle 10以上驱动可以&ldquo;比较正确&rdquo;查询出clob字段为String，但有时候会被死锁在一个查询上。</p>
<p>另一个解决办法是将oracle数据库中的clob字段转为vchar类型。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39947#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:10:41 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39947</link>
        <guid>http://pikachu.javaeye.com/blog/39947</guid>
      </item>
      <item>
        <title>Howto: 如何使用war包在tomcat中安装liferay</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39946" style="color:red;">http://pikachu.javaeye.com/blog/39946</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>有时我们无法使用预集成的liferay(比如在已有的tomcat上再部署)。这时候就可以使用war包进行部署安装。</p>
<p>我们将使用apache-tomcat-5.5.17，liferay-portal-4.1.3.war进行试验。为了化简复杂度，我们将会把war部署在根context下，也就是 /</p>
<p>在部署之前首先需要创建liferay所需数据库(http://liferay.javaeye.com/group/topic/338)。并且寻找到数据库jdbc驱动和portlet.jar文件。 <br />
jdbc可以从所使用数据库厂商网站下载 <br />
portlet.jar文件可以从 <br />
<a href="http://www.jcp.org/en/jsr/detail?id=168%E4%B8%8B%E8%BD%BD%E3%80%82%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%9C%A8%E9%A2%84%E9%9B%86%E6%88%90%E7%9A%84liferay%20tomcat%20bundle%E4%B8%AD%E6%89%BE%E5%88%B0" target="blank">http://www.jcp.org/en/jsr/detail?id=168下载。你也可以在预集成的liferay tomcat bundle中找到</a> </p>
<p>数据库创建后，我们可以使用war包进行部署了。</p>
<p>在部署过程中我们将会重起tomcat，所以请确保不会影响生产。</p>
<p>1，将下载liferay-portal-4.1.3.war 放到tomcat目录下，启动tomcat对war解压，解压完成后停止tomcat <br />
2，将解压后的目录liferay-portal-4.1.3改名为ROOT，删除原始的 liferay-portal-4.1.3.war 文件 <br />
3，修改 ${tomca_home}\conf\catalina.properties 在common.loade上新增${catalina.home}/common/lib/ext/*.jar，并且在$ {catalina.home}/common/lib下创建ext目录 <br />
4，将liferay解压后WEB-INF/lib中的activation.jar、jms.jar、jta.jar、mail.jar、portal-kernel.jar移动到${catalina.home}/common/lib/ext下。 <br />
将jdbc驱动和portlet.jar拷贝到${catalina.home}/common/lib/ext下。 <br />
在 <br />
5，在${tomca_home}\conf下新建文件jaas.config，其中内容为 <br />
PortalRealm { <br />
com.liferay.portal.kernel.security.jaas.PortalLoginModule required; <br />
}; <br />
该文件也可以在预集成的liferay tomcat bundle中找到 <br />
6，在${tomca_home}\conf\Catalina\localhost下新建文件ROOT.xml其中内容类似 <br />
<context path=""></context></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Context</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">Resource</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jdbc/LiferayPool&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auth</span><span>=</span><span class="attribute-value">&quot;Container&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;javax.sql.DataSource&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">driverClassName</span><span>=</span><span class="attribute-value">&quot;org.hsqldb.jdbcDriver&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url</span><span>=</span><span class="attribute-value">&quot;jdbc:hsqldb:test&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">username</span><span>=</span><span class="attribute-value">&quot;sa&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">password</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">maxActive</span><span>=</span><span class="attribute-value">&quot;20&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">Resource</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;mail/MailSession&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auth</span><span>=</span><span class="attribute-value">&quot;Container&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;javax.mail.Session&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">mail.transport.protocol</span><span>=</span><span class="attribute-value">&quot;smtp&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">mail.smtp.host</span><span>=</span><span class="attribute-value">&quot;localhost&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">Realm</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">className</span><span>=</span><span class="attribute-value">&quot;org.apache.catalina.realm.JAASRealm&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">appName</span><span>=</span><span class="attribute-value">&quot;PortalRealm&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">userClassNames</span><span>=</span><span class="attribute-value">&quot;com.liferay.portal.security.jaas.PortalPrincipal&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">roleClassNames</span><span>=</span><span class="attribute-value">&quot;com.liferay.portal.security.jaas.PortalRole&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">debug</span><span>=</span><span class="attribute-value">&quot;99&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">useContextClassLoader</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag"><!--</span--><span class="tag-name">Context</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>请修改jdbc/LiferayPool和mail/MailSession中配置。 <br />
该文件也可以在预集成的liferay tomcat bundle中找到。 <br />
7，修改${tomca_home}/bin/catalina.bat，在 <br />
rem ----- Execute The Requested Command ----------------------------------- <br />
下方添加 <br />
set JAVA_OPTS=-Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config <br />
该步骤将影响全局jvm系统参数，请修改后测试该tomcat上其他应用是否出现问题，可能会出现的问题有中文乱码以及时间错乱问题。</p>
<p>重新启动tomcat liferay应该能够正确运行了</p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39946#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:09:59 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39946</link>
        <guid>http://pikachu.javaeye.com/blog/39946</guid>
      </item>
      <item>
        <title>Howto: 如何使用Liferay 4.2 SSO(cas)功能</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39944" style="color:red;">http://pikachu.javaeye.com/blog/39944</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font color="#ff00ff">于 2007-9-11修改创建证书内容</font></p>
<p>&nbsp;</p>
<p>首先从liferay 下载liferay-portal-cas-4.2.0.war 改名为cas-web.war 放到liferay webapp下</p>
<p>修改(创建) ROOT\WEB-INF\classes\portal-ext.properties <br />
添加 <br />
auto.login.hooks=com.liferay.portal.security.auth.BasicAutoLogin,com.liferay.portal.security.auth.CASAutoLogin</p>
<p>修改(创建) ROOT\WEB-INF\classes\system-ext.properties <br />
添加 <br />
com.liferay.filters.sso.cas.CASFilter=true</p>
<p>随后创建数字证书 </p>
<p>首先验证是否已创建过同名的证书</p>
<p><font face="Arial">keytool -list -v -alias tomcat -keystore &quot;%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS&quot; -storepass changeit</font></p>
<p>如果提示&quot;<font face="Arial">别名 <tomcat></tomcat>不存在&quot;则说明证书还没有创建</font></p>
<p><font face="Arial">否则请找出原先创建的证书,如果找不到原先证书,则可以使用</font></p>
<p><font face="Arial"><font face="Arial">keytool -delete -alias tomcat -keystore &quot;%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS&quot; -storepass changeit</font></font></p>
<p>删除已创建的证书</p>
<p>证书一经删除,原先依赖于证书的应用将会出现错误,请谨慎决定.</p>
<p>随后我们创建证书</p>
<p><br />
<font face="Arial">1.keytool -genkey -alias tomcat -keystore c:\mykeystore&nbsp; -dname &quot;CN=localhost,&nbsp;OU=localhost, O=localhost, L=SH, ST=SH, C=CN&quot; -keypass changeit -storepass changeit</font><br />
<font face="Arial">2.keytool -export -alias tomcat -keystore c:\mykeystore -file c:\mycerts.cer -storepass changeit</font></p>
<p><font face="Arial">3.keytool -import -trustcacerts -alias tomcat -keystore &quot;%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS&quot; -file c:\mycerts.cer -storepass changeit</font></p>
<p>修改conf\server.xml <br />
将 SSL HTTP 所在节注释取消,修改为类似 <br />
</p>
<connector port="8443" maxhttpheadersize="8192"></connector>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Connector</span><span>&nbsp;</span><span class="attribute">port</span><span>=</span><span class="attribute-value">&quot;8443&quot;</span><span>&nbsp;</span><span class="attribute">maxHttpHeaderSize</span><span>=</span><span class="attribute-value">&quot;8192&quot;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="attribute">maxThreads</span><span>=</span><span class="attribute-value">&quot;150&quot;</span><span>&nbsp;</span><span class="attribute">minSpareThreads</span><span>=</span><span class="attribute-value">&quot;25&quot;</span><span>&nbsp;</span><span class="attribute">maxSpareThreads</span><span>=</span><span class="attribute-value">&quot;75&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="attribute">enableLookups</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">disableUploadTimeout</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="attribute">acceptCount</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;</span><span class="attribute">scheme</span><span>=</span><span class="attribute-value">&quot;https&quot;</span><span>&nbsp;</span><span class="attribute">secure</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="attribute">clientAuth</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">sslProtocol</span><span>=</span><span class="attribute-value">&quot;TLS&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="attribute">URIEncoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span>&nbsp;</span><span class="attribute">keystoreFile</span><span>=</span><span class="attribute-value">&quot;c:\mykeystore&quot;</span><span>&nbsp;</span><span class="attribute">keystorePass</span><span>=</span><span class="attribute-value">&quot;changeit&quot;</span><span>&nbsp;</span><span class="attribute">keyAlias</span><span>=</span><span class="attribute-value">&quot;tomcat&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<div class="code_title">xml 代码</div>
<p>重起liferay. <br />
登陆时liferay将把登陆页面切换到cas 页面上</p>
<p>由于我们还未调整cas登陆配置，默认使用cas的SimpleTestUsernamePasswordAuthenticationHandler，用户名和密码都是 liferay.com.1</p>
<p>登陆成功后将转回liferay</p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39944#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:09:23 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39944</link>
        <guid>http://pikachu.javaeye.com/blog/39944</guid>
      </item>
      <item>
        <title>Howto: 如何使用Liferay 4.2 chat功能</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39942" style="color:red;">http://pikachu.javaeye.com/blog/39942</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Liferay 4.2 chat 采用jabber+ajax开发。在使用上给人的感觉非常好。</p>
<p>为了使用chat需要有一台jabber server 并对liferay 配置进行修改.</p>
<p>以下假设都是在同一台机器上的配置</p>
<p>1.从http://www.igniterealtime.org/downloads/index.jsp下载Wildfire作为jabber server。(igniterealtime前身就是大名鼎鼎的jivesoftware)</p>
<p>2.运行Wildfire. 使用 http://localhost:9090 进行配置。如果仅作为测试，可以使用其自带的hsql数据库并且将用户存储在数据库中。</p>
<p>3.修改(创建) ROOT\WEB-INF\classes\portal-ext.properties <br />
添加 <br />
jabber.xmpp.server.enabled=true <br />
reverse.ajax.enabled=true</p>
<p>重起liferay。当用户登陆时liferay会尝试在jabber server上创建该用户的jabber 账号。密码是L1f3RayJabb3r</p>
<p>运行中偶尔发现创建新帐号的过程有错误。用户登陆时间非常久。登陆之后无法使用chat功能，这时候只要退出后重新登陆即可。</p>
<p>登陆进liferay后，添加chat portlet ，使用mail地址添加chat 对象</p>
<p>hava a fun!! </p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39942#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:08:33 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39942</link>
        <guid>http://pikachu.javaeye.com/blog/39942</guid>
      </item>
      <item>
        <title>Howto: 如何更改Liferay context path</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39938" style="color:red;">http://pikachu.javaeye.com/blog/39938</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先参考 Howto：windows上如何快速体验 liferay(http://liferay.javaeye.com/group/topic/325) <br />确保liferay能够正常运行，假设新的context为myportal <br />将liferay关闭后准备按照以下步骤修改<br /><br />1.将${TOMCAT_HOME}\webapps下ROOT目录改名为myportal<br /><br />2.修改myportal下index.html <br /><pre name="code" class="java">&lt;meta content="0; url=/c" http-equiv="refresh"> 
&lt;body onLoad="javascript:location.replace('/c')"> 
-> 
&lt;meta content="0; url=c" http-equiv="refresh"> 
&lt;body onLoad="javascript:location.replace('c')">
</pre><br /><br /><br />3.修改myportal\WEB-INF\web.xml <br /><pre name="code" class="java">&lt;context-param> 
&lt;param-name>root_path&lt;/param-name> 
&lt;param-value>/&lt;/param-value> 
&lt;/context-param> 
-> 
&lt;context-param> 
&lt;param-name>root_path&lt;/param-name> 
&lt;param-value>/myportal&lt;/param-value> 
&lt;/context-param>
</pre><br /><br /><br />4.修改myportal\WEB-INF\classes\portal-ext.properties <br /><pre name="code" class="java">portal.ctx=/ 
-> 
portal.ctx=/myportal</pre><br /><br />5.修改myportal\html\js\editor\fckeditor\fckconfig.jsp <br /><br /><pre name="code" class="java">FCKConfig.LinkBrowserURL = FCKConfig.BasePath + "filemanager/browser/liferay/browser.html?Connector=/html/js/editor/fckeditor/editor/filemanager/browser/liferay/connectors/jsp/connector?p_l_id=&lt;%= plid %>"; 
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + "filemanager/browser/liferay/browser.html?Type=Image&Connector=/html/js/editor/fckeditor/editor/filemanager/browser/liferay/connectors/jsp/connector?p_l_id=&lt;%= plid %>"; 
-> 
FCKConfig.LinkBrowserURL = FCKConfig.BasePath + "filemanager/browser/liferay/browser.html?Connector=/myportal/html/js/editor/fckeditor/editor/filemanager/browser/liferay/connectors/jsp/connector?p_l_id=&lt;%= plid %>"; 
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + "filemanager/browser/liferay/browser.html?Type=Image&Connector=/myportal/html/js/editor/fckeditor/editor/filemanager/browser/liferay/connectors/jsp/connector?p_l_id=&lt;%= plid %>";</pre><br /><br /><br /><br />重新启动liferay <br />http://localhost:8080/myportal查看新设置是否正常 <br /><br />另： <br />由于fckeditor中的某些代码被硬编码在java文件中，所以使用fckeditor时浏览服务器图像和浏览器文件时返回的url不正确 <br />比如某个图像url是/myportal/image/image_gallery?img_id=1001，但是在使用fckeditor时返回的是/image/image_gallery?img_id=1001 <br />见ImageCommandReceiver.java <br /><pre name="code" class="java">fileEl.setAttribute("url", "/image/image_gallery?img_id=" + image.getImageId());</pre>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39938#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:05:37 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39938</link>
        <guid>http://pikachu.javaeye.com/blog/39938</guid>
      </item>
      <item>
        <title> Liferay 4.2 parallel rendering 探索</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39937" style="color:red;">http://pikachu.javaeye.com/blog/39937</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Liferay 的 portal 渲染过程好像很神奇，特别是当前4.2版还增强了渲染，实现了parallel rendering。也就是当打开portal页面时首先可以看到整个portal布局，每个portlet会先显示为一个进度条，过会portlet才 会被显示出来。</p>
<p>现在不妨随我trace一下liferay 的代码， 看看liferay是怎么渲染出整个页面，并且了解如何实现parallel rendering。</p>
<p>首先发现一个现象，liferay中的所有url都是/c/portal/layout开头的。说明什么？</p>
<p>liferay portal建立在strtus tiles上，所以我们首先要关注一下strtus-config.xml</p>
<p><action type="com.liferay.portal.action.LayoutAction" path="/portal/layout"></action></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;/portal/layout&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;com.liferay.portal.action.LayoutAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">forward</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;portal.layout&quot;</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;portal.layout&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<forward name="portal.layout" path="portal.layout"></forward><br />
</p>
<p>果然，这个url会forward到portal.layout上。找一下tiles的定义文件，和tiles 的定义文件</p>
<p><definition name="portal" path="/common/themes/portal.jsp"></definition><font face="Arial"></font>万里长征第一步，找到目标了，接着看portal.jsp中有什么 <br />
<liferay-theme:include page="portal_normal.jsp"></liferay-theme:include>
<br />
看上去被include了一个页面，portal_normal.jsp <br />
搜一下整个liferay目录，portal_noraml.jsp是分布在各个theme下的，从这里我们得到第一个结论，可以用portal_normal.jsp控制theme的render结果，包括head,navigation和foot。 <br />
但是我们还没有找到渲染portlet的部分，相反，我们在portal_noraml.jsp中找到了很奇怪的一行 <br />
<liferay-util:include page="&lt;%= Constants.TEXT_HTML_DIR + tilesContent %&gt;"></liferay-util:include>
<br />
这个明显是include另一个页面，但是tilesContent 是什么东西？寻遍整个文件，都没有其他地方有tilesContent字样的代码，似乎断了线索。</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">definition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;portal&quot;</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;/common/themes/portal.jsp&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">put</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;title&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">put</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;selectable&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">definition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">definition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;portal.layout&quot;</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">&quot;portal&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">put</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;content&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;/portal/layout.jsp&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">put</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;selectable&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">definition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>且慢，portal_noraml.jsp头部有一句，<!--include file="portal_init.jsp"-->，此文件大有含义，立马打开查看 <br />
<tiles:useattribute name="content" classname="java.lang.String" id="tilesContent" ignore="true"></tiles:useattribute></p>
<p>再联系刚才的tiles定义里有 <br />
<put name="content" value="/portal/layout.jsp"></put>
<br />
立马清楚了。</p>
<p>跟随这这条路下去，会发现 <br />
/portal/layout/view/portlet.jsp-&gt; <br />
RuntimePortletUtil.processTemplate</p>
<p>跟踪到此没了头绪。有一个TemplateProcessor，好像是处理模板的，但是被Velocity.evaluate封装了。</p>
<p>所谓条条大路通罗马，我们从另一个方向开始trace。 <br />
打开页面时每个portlet都会先显示出一个进度条。如果手够快的话:)可以找到进度条的图片文件名称 loading_animation.gif。 <br />
我们先在整个工程中查找 &quot;loading_animation.gif&quot; 字样，看看哪个部分引用了这个文件。很顺利，找到几个引用这个文件的页面，同portal有关的有porlte_js.jsp和load_render_portlet.jsp <br />
先来看看portlet_js.jsp,从内容上看，这是个操作portlet的js文件，同render没有直接关系。不是这个 <br />
再看看load_render_portlet.jsp，打开这个文件，眼前为之一亮！！ <br />
var portletDiv = document.getElementById(&quot;p_load<!--namespace-->&quot;); <br />
addPortletHTML(xmlHttpReq.responseText, portletDiv.parentNode, portletDiv); <br />
portletDiv.parentNode.removeChild(portletDiv); <br />
众里寻她千百度！终于找到了parallel rendering的核心了，原来liferay 使用ajax手法，在下载真正的portlet之前先显示出loading_animation.gif这幅 <br />
图象，然后发起一个ajax请求，最后将进度条替换为真正的portlet内容。</p>
<p>现在还差最后的任务了，怎么把我们找到的两条线搭扣起来？继续刚才的手法，工程里再找引用load_render_portlet.jsp的部分。 <br />
PortletColumnLogic.processContent <br />
再接再厉PortletColumnLogic是被TemplateProcessor.processColumn调用的。 <br />
还记得刚才我们的线索是哪里断的么？RuntimePortletUtil.processTemplate里也有一个TemplateProcessor！ <br />
这个环终于合起来了</p>
<p>我们重头开始整理一下，当打开一个portal页面时，url会映射到 <br />
<action type="com.liferay.portal.action.LayoutAction" path="/portal/layout"></action><br />
<forward name="portal.layout" path="portal.layout"></forward><br />
</p>
<p>之后就是 <br />
LayoutAction-&gt;(forward)portal.layout-&gt;(tiles定义)-&gt; html/common/themes/portal.jsp-&gt;(include)portal_normal.jsp-&gt;(include)/portal/layout.jsp-&gt;(include)/portal/layout/view/portlet.jsp-&gt;RuntimePortletUtil.processTemplate-&gt; <br />
Velocity.evaluate-&gt;TemplateProcessor.processColumn-&gt;PortletColumnLogic.processContent -&gt;带出 /html/portal/load_render_portlet.jsp;</p>
<p>通过这次探索，我们还知道，Liferay 4.2中parallel rendering是用ajax实现的。 <br />
并且我们学会了两种trace代码的方法，一种是正向的分析方法，一种是反向的搜索方法。</p>
<p>但是这次探索还不令人完全满意，遗留有几个未完之处 <br />
1 我只是追踪到PortletColumnLogic.processContent，但是这个函数并没有最终的render功能，load_render_portlet.jsp最终是如何被显示的需要各位朋友们自己探索了。权当一个小练习吧。 <br />
2 Velocity.evaluate的过程很模糊，虽然最终我们是在这里把扣搭上的，但还是很让人迷糊。特别是 <br />
Velocity.evaluate(vc, sw, RuntimePortletUtil.class.getName(), content);中的参数content，总让人觉得大有玄机。 <br />
3 整个过程只是探寻了portal的渲染，对于portlet的显示过程完全没有涉及。</p>
<p>如果说我们到这步算是完成了二万五千里长征，那么离全面胜利还有很艰难的一段要走，各位朋友不妨暂待后文。当然更欢迎各位亲自动手，弄清楚liferay的整个后台机制。 </p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39937#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:04:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39937</link>
        <guid>http://pikachu.javaeye.com/blog/39937</guid>
      </item>
      <item>
        <title>Liferay 4.2 reverse ajax探索</title>
        <author>pikachu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pikachu.javaeye.com">pikachu</a>&nbsp;
          链接：<a href="http://pikachu.javaeye.com/blog/39935" style="color:red;">http://pikachu.javaeye.com/blog/39935</a>&nbsp;
          发表时间: 2006年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>为了使用Liferay中的chat功能，除了要建立一台jabber server之外，还需要启动两个属性 <br />
jabber.xmpp.server.enabled=true <br />
reverse.ajax.enabled=true</p>
<p>jabber.xmpp.server.enabled比较好理解，reverse.ajax.enabled是什么？</p>
<p>在Liferay 4.2的chat有个特点。即使用户没有chat portlet的权限，当有其他人员向其发送chat消息时，会立即弹出一个chat消息框。</p>
<p>该消息框的实现就是用了reverse ajax。我们可以trace一下liferay的代码看看这个自动弹出的chatbox是如何实现的。</p>
<p>首先找到ajax.js <br />
找到里面有</p>
<p>request: function() { <br />
... <br />
onComplete: ReverseAjax.response, <br />
... <br />
},</p>
<p>response: function(xmlHttpRequest) { <br />
... <br />
ReverseAjax.request(); <br />
... <br />
},</p>
<p>写过点ajax的朋友都能猜出来，这两段是干什么的。一旦一个ajax请求发起，如果正常结束，那么在responnse方法中重新再发起一次请求。</p>
<p>吓人一跳，liferay不会那么没效率吧，当中都没有个延迟？？</p>
<p>再找java代码ReverseAjaxAction.java 在不起眼的代码中，有这么一行 <br />
reqWait.waitForRequest();看看waitForRequest的定义</p>
<p>public synchronized void waitForRequest() throws InterruptedException { <br />
int heartbeatCycle = GetterUtil.getInteger(PropsUtil.get( <br />
PropsUtil.REVERSE_AJAX_HEARTBEAT));</p>
<p>		_timedOut = true;</p>
<p>		wait(heartbeatCycle); <br />
}</p>
<p>大有玄机！！找找notify是被谁调用的代码...... <br />
BinGo!! <br />
RosterUpdateListener和MessageListener中有reqWait.notifyWait()</p>
<p>让我们重新理一下思路 <br />
两条主线 <br />
ajax.js中ReverseAjax.request()-&gt;ReverseAjaxAction.java-&gt;reqWait.waitForRequest() <br />
RosterUpdateListener|MessageListener-&gt;reqWait.notifyWait()</p>
<p>在浏览器中一直有一个请求，但是当请求到服务端端时，被java阻塞了。 <br />
当有jabber消息返回时，则会notify前一个被阻塞的线程，最终使得浏览器端的ajax代码将chatbox显示出来。</p>
<p>最终，我们得出一个结论，liferay 中ReverseAjax是用poll来模拟push。但是poll过程中利用了java线程同步的技巧。</p>
<p>当然以上的分析还很粗糙。没有解释线程同步之间的资源和超时的设计，本文就算起个抛砖引玉的作用吧。</p>
          <br/>
          <span style="color:red;">
            <a href="http://pikachu.javaeye.com/blog/39935#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Dec 2006 11:03:00 +0800</pubDate>
        <link>http://pikachu.javaeye.com/blog/39935</link>
        <guid>http://pikachu.javaeye.com/blog/39935</guid>
      </item>
  </channel>
</rss>