<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Tyler_Zhou</title>
    <description>天下本没神,因为人做了普通人所做不到的事所以就成了神,所以说我也可以成为神!</description>
    <link>http://tyler-zhou.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>liferay5.0 plugins sdk开发（一）</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/196719" style="color:red;">http://tyler-zhou.javaeye.com/blog/196719</a>&nbsp;
          发表时间: 2008年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一次用plugins开发无疑等自于自杀，两个星期过去了，经历了无边的黑暗终于看到了光明。接着上一篇create.bat一个portlet，生成的一个portlet是一个最简单的portlet，如果只是普通的显示，OK是可以满足的。如果是一个复杂的则他是不能满足的，你需要做如下的修改：<br />（1）portlet.xml：&lt;portlet-class>com.liferay.portlet.StrutsPortlet&lt;/portlet-class>JSPPortlet改为StrutsPortlet，view-jsp改为view-action,&lt;value>改为自已的。这样就和struts绑上了。<br />（2）增加struts-config文件，文件里，可以根据自已的需要来定义message-resource，tiles.<br />（3）liferay-portlet.xml 增加上struts-path,&lt;configuration-action-class>则根据需要。<br />（4）web.xml增加如下：<br />	&lt;servlet><br />		&lt;servlet-name>PortletActionServlet&lt;/servlet-name><br />		&lt;servlet-class>com.liferay.portal.struts.PortletActionServlet&lt;/servlet-class><br />		&lt;init-param><br />			&lt;param-name>config&lt;/param-name><br />			&lt;param-value>/WEB-INF/struts-config.xml&lt;/param-value><br />		&lt;/init-param><br />		&lt;load-on-startup>1&lt;/load-on-startup><br />	&lt;/servlet><br />自定义servlet&lt;load-on-startup>要从1开始，因为自动部署后0会被com.liferay.portal.kernel.servlet.PortletServlet占用。&lt;taglib>liferay-portlet.tld也是自动部署后加上去，但是这是不够的，如果你要用到配置页，liferay-portlet-ext.tld是需要的，liferay-ui也经常会需要的，如果在页面上会用到themeid，layout之类的方法，那么你还要增加liferay-theme.tld。其他的可在项目中根据需要看是否要增加。<br />（5）在docroot下面增加META-INF/context.xml,文件内容如下：<br />&lt;Context><br />	&lt;Loader <br />		loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader"<br />	/><br />&lt;/Context><br />不要小瞧这段话，他是至关重要的，让你当前的portlet依赖于lifeay的包。如果没有这个会报castException之类的错误，两个应用虽然引用的是同一个包，但是包不在同一个别lib下面，类型转换时会认为他们不是同一类型，这个问题看了一周，在lifeay官网上有人回答了这个错误的引起的原因，却没有告之解决方案，还是在一个好友的帮助之下解决了这个问题。<br />（6）生成的JSP都有这么一句话，&lt;portlet:defineObjects />这个是就是第四点说的，liferay-portlet.tld标签中的一个，你的代码要写在这句话之下，他定义很多常用的类，如actionurl,renderurl,portletpreferences,具体可以看com.liferay.taglib.portlet.DefineObjectsTei,同样的liferay-theme.tld中也有&lt;liferay-theme:defineObjects />他定义了themeDisplay，layout，permissionChecker，portletGroupId，theme，具体可以看com.liferay.taglib.theme.DefineObjectsTei。<br />按上面的配置改好后，基本就和ext中开发一样了，最后一点建义，自定义portlet工程，如果要引用包，不要放在WIN-INF/lib下面，放在sdk下面的lib下面，如果用到了除了lifeay之外的包可以放在WIN-INF/lib下面，因为deploy后他会把WIN-INF/lib下所有的包都部署过去，而有些包是只能加载一次的。<br />最后希望大家都能看到光明。
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/196719#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 25 May 2008 16:29:32 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/196719</link>
        <guid>http://tyler-zhou.javaeye.com/blog/196719</guid>
      </item>
      <item>
        <title>liferay5.0plugins sdk开发环境配置</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/191754" style="color:red;">http://tyler-zhou.javaeye.com/blog/191754</a>&nbsp;
          发表时间: 2008年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://docs.liferay.com/4.3/official/liferay-43-plugins-guide.pdf" target="_blank">http://docs.liferay.com/4.3/official/liferay-43-plugins-guide.pdf</a>这是一份liferay官方的文档,你只要按照上面来就可以配置出plugins sdk开发环境,你也可以直接把SKD/portlet/portlet.rar给解压了直接用,然后改个名字,就直接可以拿来开发了,然后把需要的包导入来,就OK了.不过这个工程一定要放在portlet文件夹下面,因为ant的时候要用到里面的xml.然后打成war放在{username}/liferay/deploy下面,这样只不过麻烦点,和按照他文档一步步配置是一样的效果.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/191754#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/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>Sat, 10 May 2008 17:08:18 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/191754</link>
        <guid>http://tyler-zhou.javaeye.com/blog/191754</guid>
      </item>
      <item>
        <title>liferay实例(instances)操作</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/191745" style="color:red;">http://tyler-zhou.javaeye.com/blog/191745</a>&nbsp;
          发表时间: 2008年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          lifray实例存在于admin/instances中,初始化里面就一个实例 liferay.com,这个是webid,我们可以把这一个实例理解成一个集团公司,他的下面可以建立很多的公司,在这里一个实例可以对应多个社区,在什么情况下需要建立多个实例呢?当你建立的多个社区他们之间是完全没有关系的,是完全独立的,就像google公司和伊利公司两个无关时就可以新建一个google实例和伊利实例,如果是一个实例下的社区通过域名+/frendly url是可以相互访问的,很多情况下我们不希望这样,那么就要新建一个实例.新建一个实例后,还要将这个域名指向本机,如www.163.com,你输入www.163.com就会进入到这个实例中,那么这就是一个全新的实例了.但是这样有个问题,默认的实例总是指向liferay.com,这样是很讨厌的,输入localhost/web/guest/home总是会到了liferay.com,而且也是不安全的,当你上线后,输入www.163.com虽然指向了你的实例,但是如果有不怀好意者,用IP+端口+web/guest/home这样就访问到了liferay.com实例.怎么办?实例是不能删除的,幸好liferay提供了这样的设置,在portal.properties里面有个defult.web.id将他改为www.163.com的webid(163.com),这样不管是输入localhost/web/guest/home还是远程用IP+端口+web/guest/home访问的都将是www.163.com实例.还有我总是看到有很多的朋友想屏蔽guest社区甚至想删掉他,这是没有必要的,geust这是一个系统社区,我们完全可以在新建实例之初就重新指定一个自已想到的系统社区,这个是在portal.properties里面system group的设置,而且是可以设置多个的.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/191745#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 May 2008 16:43:26 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/191745</link>
        <guid>http://tyler-zhou.javaeye.com/blog/191745</guid>
      </item>
      <item>
        <title>liferay5.0+oralce10启动报DocumentException</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/190276" style="color:red;">http://tyler-zhou.javaeye.com/blog/190276</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          liferay5.0+oracle10配置好后启动报如下错误:<br />15 May 2007 01:44:59,453 CPOR ERROR [http-8080-Processor24] util.ContentTransformerListener: org.dom4j.DocumentException: Error on line 1 of document : Content is not allowed in prolog. Nested exception: Content is not allowed in prolog.<br />at org.dom4j.io.SAXReader.read(SAXReader.java:482)<br />at org.dom4j.io.SAXReader.read(SAXReader.java:365)<br />at com.liferay.portlet.journal.util.ContentTransformerListener.replaceContent(ContentTransformerListener.java:90)<br />at com.liferay.portlet.journal.util.ContentTransformerListener.onXml(ContentTransformerListener.java:58)<br />at com.liferay.portlet.journal.util.JournalUtil.transform(JournalUtil.java:757)<br />at com.liferay.portlet.journal.service.impl.JournalArticleLocalServiceImpl.getArticleContent(JournalArticleLocalServiceImpl.java:709)<br />at com.liferay.portlet.journal.service.impl.JournalArticleLocalServiceImpl.getArticleContent(JournalArticleLocalServiceImpl.java:585)<br />at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />at java.lang.reflect.Method.invoke(Method.java:585)<br />at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:280)<br />at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:187)<br />at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:154)<br />at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)<br />at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)<br />at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:210)<br />at $Proxy12.getArticleContent(Unknown Source)<br />at com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil.getArticleContent(JournalArticleLocalServiceUtil.java:269)<br />at com.liferay.portlet.journalcontent.util.JournalContentUtil.getContent(JournalContentUtil.java:78)<br />at com.liferay.portlet.journalcontent.action.ViewAction.render(ViewAction.java:69)<br />at com.liferay.portal.struts.PortletAction.execute(PortletAction.java:102)<br />at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)<br />at com.liferay.portal.struts.PortletRequestProcessor.processActionPerform(PortletRequestProcessor.java:249)<br />at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)<br />at com.liferay.portal.struts.PortletRequestProcessor.process(PortletRequestProcessor.java:131)<br />at com.liferay.portlet.StrutsPortlet.include(StrutsPortlet.java:223)<br />at com.liferay.portlet.StrutsPortlet.doView(StrutsPortlet.java:194)<br />at com.liferay.portlet.LiferayPortlet.doDispatch(LiferayPortlet.java:51)<br />at javax.portlet.GenericPortlet.render(GenericPortlet.java:163)<br />at com.liferay.portlet.CachePortlet._invoke(CachePortlet.java:365)<br />at com.liferay.portlet.CachePortlet.render(CachePortlet.java:182)<br />at org.apache.jsp.html.portal.render_005fportlet_jsp._jspService(render_005fportlet_jsp.java:953)<br />at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)<br />at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br />at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)<br />at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)<br />at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)<br />at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.filters.strip.StripFilter.doFilter(StripFilter.java:260)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.filters.compression.CompressionFilter.doFilter(CompressionFilter.java:124)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:169)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)<br />at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)<br />at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)<br />at com.liferay.portal.util.PortalUtil.renderPortlet(PortalUtil.java:1108)<br />at com.liferay.portal.util.PortalUtil.renderPortlet(PortalUtil.java:1054)<br />at com.liferay.portal.action.RenderPortletAction.execute(RenderPortletAction.java:72)<br />at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)<br />at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)<br />at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:156)<br />at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)<br />at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)<br />at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)<br />at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:479)<br />at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:877)<br />at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.filters.strip.StripFilter.doFilter(StripFilter.java:94)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.filters.secure.SecureFilter.doFilter(SecureFilter.java:143)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.filters.compression.CompressionFilter.doFilter(CompressionFilter.java:115)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:169)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)<br />at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)<br />at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)<br />at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)<br />at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)<br />at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)<br />at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)<br />at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)<br />at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)<br />at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)<br />at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)<br />at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)<br />at java.lang.Thread.run(Thread.java:595)<br />Nested exception: <br />根据错误可以看出是XML解析错误,在网上找了好久找到一些人的回答:<br /># DocumentTransformerListener does not work<br />journal.transformer.listener=com.liferay.portlet.journal.util.TokensTransformerListener,com.liferay.portlet.journal.util.PropertiesTransformerListener,com.liferay.portlet.journal.util.LocaleTransformerListener<br /><br />The issue happens because DocumentTransformerListener, which used to be disabled in Liferay 4.2.0, is now enabled by default. However, if the filter breaks, that does not disable the journal content, only the filter.<br />按他回答的修改后,错误依旧.没办法,自已找原因.用sqldeveloper打开数据库发现journalarticle表content字段,有的显示很多"\n",有的是正确的换行,只要是显示"\n"运行就会报错,自已写了三个存储过程,分别针对journalarticle,journaltemplate,journalstructure三个表修改,代码如下:<br /><br />create or replace PROCEDURE ARTICLE AS<br />BEGIN<br />   FOR RESULT_ IN (SELECT * FROM JOURNALARTICLE WHERE CONTENT LIKE '%\n%') LOOP<br />  UPDATE JOURNALARTICLE SET CONTENT = <br />    Replace(RESULT_.CONTENT,'\n',CHR(10)) WHERE ID_=RESULT_.ID_;<br />  END LOOP;<br />END ARTICLE;<br /><br /><br />create or replace PROCEDURE STRUCTRUE AS<br />BEGIN<br /> FOR RESULT_ IN (SELECT * FROM JOURNALSTRUCTURE WHERE XSD LIKE '%\n%') LOOP<br />  UPDATE JOURNALSTRUCTURE SET XSD = <br />    Replace(RESULT_.XSD,'\n',CHR(10)) WHERE ID_=RESULT_.ID_;<br />  END LOOP;<br />END STRUCTRUE;<br /><br /><br />create or replace PROCEDURE TEMPLATE AS<br />BEGIN<br />   FOR RESULT_ IN (SELECT * FROM JOURNALTEMPLATE WHERE XSL LIKE '%\n%') LOOP<br />  UPDATE JOURNALTEMPLATE SET XSL = <br />    Replace(RESULT_.XSL,'\n',CHR(10)) WHERE ID_=RESULT_.ID_;<br />  END LOOP;<br />END TEMPLATE;
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/190276#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 16:12:23 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/190276</link>
        <guid>http://tyler-zhou.javaeye.com/blog/190276</guid>
      </item>
      <item>
        <title>liferay5.0 plugins sdk开发现的一个小秘密</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/185558" style="color:red;">http://tyler-zhou.javaeye.com/blog/185558</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          等了好久终于等到了5.0的出现,download下来一看,突然发现自已好像啥也不会了,liferay5.0他提倡的是plugins开发方式,tomcat里面啥也没有了,郁闷只好重新deploy了一下,然后配置plugins-sdk自已做了一个简单的portlet,deploy然后发现ROOT下面啥也没有,郁闷极了,日志到是写成功了,找了半天发现他deploy到了bin/{jetty.home}下面了,为什么会这样,最初我以为是那里配置文件那里没有配好,在eclipse里面search关键字jetty.home啥也没有找到,逼不得已只好去找hot deploy相关代码,居然让我发现了liferay的一个小秘密.ServerDetector中<br />public static String getServerId() {<br />		ServerDetector sd = _instance;<br /><br />		if (sd._serverId == null) {<br />			if (ServerDetector.isGeronimo()) {<br />				sd._serverId = GERONIMO_ID;<br />			}<br />			else if (ServerDetector.isGlassfish()) {<br />				sd._serverId = GLASSFISH_ID;<br />			}<br />			else if (ServerDetector.isJBoss()) {<br />				sd._serverId = JBOSS_ID;<br />			}<br />			else if (ServerDetector.isJOnAS()) {<br />				sd._serverId = JONAS_ID;<br />			}<br />			else if (ServerDetector.isOC4J()) {<br />				sd._serverId = OC4J_ID;<br />			}<br />			else if (ServerDetector.isOrion()) {<br />				sd._serverId = ORION_ID;<br />			}<br />			else if (ServerDetector.isPramati()) {<br />				sd._serverId = PRAMATI_ID;<br />			}<br />			else if (ServerDetector.isResin()) {<br />				sd._serverId = RESIN_ID;<br />			}<br />			else if (ServerDetector.isRexIP()) {<br />				sd._serverId = REXIP_ID;<br />			}<br />			else if (ServerDetector.isSun7()) {<br />				sd._serverId = SUN7_ID;<br />			}<br />			else if (ServerDetector.isSun8()) {<br />				sd._serverId = SUN8_ID;<br />			}<br />			else if (ServerDetector.isWebLogic()) {<br />				sd._serverId = WEBLOGIC_ID;<br />			}<br />			else if (ServerDetector.isWebSphere()) {<br />				sd._serverId = WEBSPHERE_ID;<br />			}<br /><br />			if (ServerDetector.isJetty()) {<br />				if (sd._serverId == null) {<br />					sd._serverId = JETTY_ID;<br />				}<br />				else {<br />					sd._serverId += "-" + JETTY_ID;<br />				}<br />			}<br />			else if (ServerDetector.isTomcat()) {<br />				if (sd._serverId == null) {<br />					sd._serverId = TOMCAT_ID;<br />				}<br />				else {<br />					sd._serverId += "-" + TOMCAT_ID;<br />				}<br />			}<br /><br />			if (_log.isInfoEnabled()) {<br />				_log.info("Detected server " + sd._serverId);<br />			}<br /><br />			if (sd._serverId == null) {<br />				throw new RuntimeException("Server is not supported");<br />			}<br />		}<br /><br />		return sd._serverId;<br />	}jetty的判断在tomcat的前面,而他做判断是根据能不能生成不同web server服务器的server.class来判断你是用的tomcat还是jetty还是其他的.<br />而plugins-sdk自动生成portlet的时才有两名代码<br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />这两个类本身是不识别的,在portal-src中他是在selenium-server.jar中的,所以我也直接引入了这个包,tomcat中没有这个包,我直接把他放到了tomcat中去了,而这个包中能找到/org/mortbay/jetty/Server.class这个类,这个就是jetty服务器用的,jetty判断写在tomcat之前,自然系统就以为你用的是jetty服务器.可是为什么没有这个包之前,那其他的类为什么能识别这个呢,原来liferay不知道出于什么目的,在开发中用的是selenium-server.jar这个包,而在真正发布的时候他用的是commons-logging.jar这个包,其实这本身就是apache的log包,打开selenium-server.jar这个包会发现里面也包括了commons-logging的内容.所以说解决方法也很简单,用commons-logging.jar而不要去用selenium-server.jar.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/185558#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 17:25:05 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/185558</link>
        <guid>http://tyler-zhou.javaeye.com/blog/185558</guid>
      </item>
      <item>
        <title>liferay对外提供webservice按口</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/184861" style="color:red;">http://tyler-zhou.javaeye.com/blog/184861</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先引用一篇别人的文章<br /><span style="color: red">Liferay是基于SOA理念设计的，很容易通过Web Services对外提供服务接口，下面简单介绍一下。<br /><br />Liferay如何对外提供服务？<br /><br />1、在service.xml中编辑，增加一个&lt;entity name="xx" local-service="false" remote-service="true" /><br />2、ant build-service-xxxx (portal-impl/build.xml)<br />3、修改XXServiceImpl, 写入你要对外提供的方法逻辑；<br />4、ant build-service-xxxx （重复2）<br />5、ant build-wsdd-xxxx in portal-impl/build.xml<br />6、ant clean deploy in portal-impl/build.xml<br />这样你就成功发布以了一个服务，在tunnel-web/doc-root/WEB-INF/server-config.wsdd 中查找是否发布成功<br /><br /> 如何调用Liferay发布的服务？smilingleo原创<br /><br />1、新建一个项目（或者打开你要调用服务的项目）<br />2、将Apache AXIS的所有lib文件拷贝到&lt;your-webapp>/WEB-INF/lib下面；<br />3、将portal-client.jar拷贝到上述目录，如果没有，在portal-client/build.xml中ant build-client（注意，这时，服务器要在开启状态，而且上面编写的服务已经成功deploy到服务器）<br />4、编写代码，例如；<br /><br /><br />import java.net.URL;<br /><br />import com.company.portal.service.http.MyUserServiceSoap;<br />import com.company.portal.service.http.MyUserServiceSoapServiceLocator;<br /><br />public class LiferayClient ...{<br /> public static void main(String [] args) ...{<br />  long userId = 54321L;<br />  long companyId = 12345L;<br />  String email = "me@company.com";<br />  String password = "notTellingYou";<br />  <br />  try ...{<br />   MyUserServiceSoapServiceLocator locator = new MyUserServiceSoapServiceLocator();<br />   MyUserServiceSoap soap = locator.getPortal_MyUserService(_getURL(Long.toString(userId), "Portal_MyUserService"));<br />   int isAuthenticated = soap.authenticateByEmailAddress(companyId, email, password);<br />   System.out.println("is user authenticated? " + isAuthenticated);<br />  } catch (Exception e) ...{<br />   System.err.println(e.toString());<br />  }<br />  <br /> }<br /> private static URL _getURL(String remoteUser, String serviceName) throws Exception ...{<br />  String password = "secret";<br />  url = "http://" + remoteUser + ":" + password + "@localhost:8080/tunnel-web/secure/axis/" + serviceName;<br /><br />  return new URL(url);<br /> }<br />}</span><br />这篇文章让我们解决了liferay如何去做webservice服务端,,文中也提到外部程序如何去调用liferay写的服务端,在5.0的版本中liferay的网站提供了client用到的所有的包,当然了这个包中不包括你自已开发的webservice.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/184861#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/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>Mon, 21 Apr 2008 11:51:25 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/184861</link>
        <guid>http://tyler-zhou.javaeye.com/blog/184861</guid>
      </item>
      <item>
        <title>liferay4.4.2中调用webservice接口（一）</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/182160" style="color:red;">http://tyler-zhou.javaeye.com/blog/182160</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          因为下个项目要用到在liferay中调用远程的.net webservce，为了评估这个工作的开发的难度和可行性，这几天一直在搞这个，现在有了点成果拿出来和大家一起分享一下。<br />   liferay调用webservice,有两种方法一种是用liferay提供的方法，一种是用普通JAVA调用方法，先说第二种。<br />   我们没有必要自已亲自去写这些方法，我们可以用axis或xfire服务引擎，而且都有现成的插件可以用，axis可以去apache官网去下载（Axis2_Codegen_Wizard_1.3.0），这个插件是要用LINK方式来安装的，建目录{home}/axis2/eclipse/plugins，然后把这个插件丢进去，目录放那里都可以，但是elispse/plugins是必须的，然后在{eclipse home}/links下面建一个文件，随便命名，里面写上path={home}/axis2,然后删除{eclipse home}/configuration下面文件（config.ini除外）重启，然后在liferay-ext-src里面建上一个包专门放生成的代码，通过wsdl文件（客户方提供网址下载）自动生成代码，编译，可能会报找不到一些相关的包，去插件安装的目录lib下找到相关的包，丢到ext/lib/global下面刷新elipse然后再编译就OK了,然后打成jar包放到ext/lib/development下面，这是因为在开发过程中别的包会依赖于这个，发布的时候要把这些包都丢到WEB-INF/lib下面。xfire也有插件，在xfire官网很容易就可以找到eclipse-plugin,按照他的方式（update）安装,不过我怎么也显示不出来，明明在plugin manage里面可以看得到这个插件可是就是显示不出来，什么招都使了就是不能显示，不知道什么原因，后来我是用myeclipse里面的webservice clent来做的，他就是用的xfire引擎。这个和axis操作方式基本上一样的。因为是做可行性分析，所以对这axis和xfire都做了测试，结果是每次访问webservice,xfire基本上要比axis速度快上200ms，同一个远程的webservice。<br />   第二种方法还在研究当中，先说一下自已的基本思想，通过liferay现有的ESB，mule或者servicemix来调用webservice，liferay调用mule基本就是通过HTTP这个类来调用的，这个我在前面的JBPM上面讲到过，基本上就想和他调用JBPM一样来操作，只不过一个发往的地址不同而已，今天简单的用mule测了一下，结果失败，具体的实施过程中肯定还会遇到很多的问题，下周继续，等有了成果会在我blog上面贴出来，如果有朋友对liferay调用webservice有更好的办法，希望能告知一下，本人感激不尽。还有就是，每个portlet下面都有一个http包，下面的类应该就是webservice用来，具体怎么用的一点也不知道，希望有朋友能告诉我一下。<br />   本人MSN:tyler@chinaclick.com.cn
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/182160#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>Sat, 12 Apr 2008 21:18:20 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/182160</link>
        <guid>http://tyler-zhou.javaeye.com/blog/182160</guid>
      </item>
      <item>
        <title>textarea按格式显示在页面上</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/174040" style="color:red;">http://tyler-zhou.javaeye.com/blog/174040</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是在网上找的方法,怕忘记所以记下来,textarea录入时带有格式,录入数据库不必处理,如果显示时仍放在textarea,没有问题,但是如果直接打在页面上格式就没了,在打在页面上之前调用下面的方法<br />	public static String zhuanyi(String sp,String sp1,String sp2)     <br />	{   <br />		String   sTemp   =   sp;   <br />		String   str   ="";   <br />		if(sp==null||sp.equals(""))   <br />		{   <br />			return   str;   <br />		}   <br />		try   <br />		{   <br />			int   iIndex=sTemp.indexOf(sp1);   <br />			int   iStar   =   0;   <br />			while(iIndex!=-1)   <br />			{   <br />				String   s1=   sTemp.substring(iStar,iIndex);   <br />				if(iIndex&lt;sTemp.length())   <br />				{   <br />					sTemp = sTemp.substring(iIndex+1,sTemp.length());   <br />					s1 = s1+sp2;   <br />					str = str+s1;   <br />					iIndex = sTemp.indexOf(sp1);   <br />				}   <br />			}   <br />			str = str+sTemp;   <br />		}   <br />		catch(Exception   e)   <br />		{   <br />	<br />		}   <br />		return   str;   <br />	}<br />用了一下蛮好使,所以记下来,经备后用.SP要转的字符串,SP1"\n",SP2"&lt;br>"
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/174040#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 11:55:31 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/174040</link>
        <guid>http://tyler-zhou.javaeye.com/blog/174040</guid>
      </item>
      <item>
        <title>大连liferay之行</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/173175" style="color:red;">http://tyler-zhou.javaeye.com/blog/173175</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上周五去了大连参加liferay在中国的第一次用户交流会,地点在沙河口区高尔夫酒店三楼会议室,到会的用户并没有我想的这么多,可能和liferay进入中国的时间有关吧,去年十月在大连成立合资公司,liferay公司还是很重视的,liferay CEO AND CIO都去了,还有他们的两位工程师,并且很有幸能和他们的CIO合了一张影,也看到了温兵先生,我学习liferay可是看着温先生的BLOG来学习的,并且在大会上温先生学展示了自已的产品真是让人敬佩,大会结束本来很想和温先生有下交流的,可是温先生一直忙着和大连liferay交流了,有机会一定向温先生多多请教.<br />    在大会上有一个提问的阶段,不过由于时间有限,只不过提问了几个问题,而且大多是一些更像是liferay发展方面的问题,比如:"liferay以后计划往那方面发展?liferay的企业集成如何更好的服务中国用户?",当然也有一些类似于构架方面的问题,构架对我来说太深,理解起来还是有些困难的.现在我只是把自已在大会上了解的来这里分享给大家.<br />    如何解决了portlet 一对多,多对多之间的通信?liferay已经解决了此类问题,但是这需要IBM公司的援权发布,预计会在5.0之后的版本解决这个问题.<br />    liferay的社区导入导出数据总是不全如权限,imageid?liferay在5.0版本已经解决了这个问题,本月底会发布5.0.<br />    liferay的角色权限如何和JBPM的用户角机能够结何起来?目前liferay的权限和JBPM的权限是分开的,他们是通过ESB来调用的,我们会在后面把JBPM的权限融合到lifery中,不过这个过程可能需要六到十二周.<br />    我们总觉得liferay运行速度很慢?我们liferay提供了很多提高速度的方法,如文件system.peroites里,有几个地方改设置,(他当时举了几个地方,具体的值我不记得了,其中一个有个地方在开发时值为false,liferay的任何东西不进驻内存,发布的时候要改成true),有很多人用的是双核CPU,却从来不知道把JVM设成双线程(说来惭愧我一直都不知道).<br />    有时候因为客户的变动要改一个小小的功能,我们就觉得在liferay上面要改的东西太多了,比传统的开发要复杂的多,有时候甚至不得不外包出去?改变liferay有三种方法,一种是硬编码,一种是继承原来的类,改ext-struts文件来重写原来的跳转,另外一种是写一个自已的方法,然后用spring-ext来印射,我们推荐大家使用第三种.<br />    liferay在邮件时随便输入一个邮件地址居然都能成功,是不是安全性不够?liferay提供了五种登陆验证方式,有四种单点验证,在5.0中会加入SUN公司的另外两种验证方法,并且这是SUN公司主动提出来的.(当时介绍了每种验证方法使用,对安全认证方面我不在行,所以听的很晕),你也可以用自已的验证方法连接自已的验证服务器,也是改下面system.peroites下面一个值(具体的地方我又忘了,报歉),让他指向自已的类.<br />    lifray建议大家开发不再使用EXT开发方式,那是4.2之前的,现在建议大家使用plaugin的开发方法,可以很方便的开发layout,theme,portlet.<br />    还有其他的一些是关于虚拟主机方面和lifray5.0版本会有的一引起新功能的作用,如文章的工作流的审核,社区的先择性导入等等,我就不写了,如果有兴趣的朋友可以留言我,一定会知无不言.其实在大会上CIO并没有讲这么多东西,都是趁CIO休息的时候追着问的,不过这位美藉华人的CIO很热情,全都回答了我的问题.<br />    最后告诉大家,在四月下旬liferay会在大连有个培训,培训内容包括liferay应用和开发两个方面.有兴趣的朋友可以和liferay大连公司联系,希望 liferay能在中国推广成功.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/173175#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Mar 2008 21:32:52 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/173175</link>
        <guid>http://tyler-zhou.javaeye.com/blog/173175</guid>
      </item>
      <item>
        <title>liferay工作流开发（JBPM乱码）</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/170492" style="color:red;">http://tyler-zhou.javaeye.com/blog/170492</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          省过配置直奔主题，如果你第一次开发工作流或者没有用过JBPM，见意你先去下载JBPM，他里面有一个和JBOSS绑好的service，启动，先感受一下工作流，这个过程网上有很多的文档，我这里就省过，这个对你在liferay中开发工作流很重要。<br />   JBPM-WEB不能导出到ext工程里，这个很郁闷，在liferay源码中开发，他eclipse完全把这些文件当作是普通的文件，报错提示什么也没有，错了也不知道，我的做法是先在外面建一个普通的WEB工程，然后把JBPM-WEB下面的src拷到我面的WEB工程里然后把要的包导进来，这样开发起来就舒服多了，其他的工作和JBPM普通的开发一样了，先写一个工作流文件，你也可以装上jbpm-designer插件来画图，然后把工作流文件贴到workflow新增工作流的输入框里，保存就生成了一个工作流了，如果你要写上actionHandler就在外面的web工程里写好再把文件贴到liferay里面来，保存发布就可以了。<br />    正常情况下是生成instance然后在触发一些事件，而我这几天开发的是在liferay原有的日志文章的工作流，在文章增加的时候生成一个事例，这样属于反向驱动工作流，liferay里面本身是封了所有JBPM的API的，只能通过他给的接口来操作工作流，他所提供的操作API全在com.liferay.portlet.workflow.service.impl这个包下面，一共四个，应该能满足我们的操作，他自已定了WorkflowTask，WorkflowInstance，WorkflowDefinition，WorkflowToken这几个和JBPM提供的ProcessDefinition ，ProcessInstance ，Token ，Task是没有关系的，不要受他表面的迷惑。<br />    JBPM在输入中文的时候会出现乱码，解决方案是com.liferay.util.Http <br />556行改:<br />   method.addRequestHeader(<br />    "Content-Type", "application/x-www-form-urlencoded; charset=utf-8");<br />645行改:<br />return new String(URLtoByteArray(location, cookies, parts, post),"UTF-8");<br />打包放在mule-web和jbpm-web下面，ROOT/WEB-INF下面要不要换就看你本身liferay操作是不是乱码。还有在eclipse下面启动，操作工作流会报SocketTimeOutException，不管他，刷新就OK，用tomcat启动是没有这个问题的。<br />      最后我有个郁闷的地方，在写实现ActionHandler类的时候，在里面操作一些持久化操作的时候，总是报权限不足，明明是同一个用户在别的portlet中操作这个持久化操作就可以成功，到这工作流里面也操作这个持久化的操作他就会报权限错误，郁闷。希望有经验的朋友不吝赐教。谢谢！！
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/170492#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 13:09:09 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/170492</link>
        <guid>http://tyler-zhou.javaeye.com/blog/170492</guid>
      </item>
      <item>
        <title>liferay搜索机制</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/168406" style="color:red;">http://tyler-zhou.javaeye.com/blog/168406</a>&nbsp;
          发表时间: 2008年03月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          liferay搜索用的是lucene搜索引擎,lucene需要先建立索引然后再搜索,建立索引会在{user}/liferay/lucene下面保存着,拿日志文章来说他是在建新增一个文章的时候建立的索引,4.3.3版本以前只要建立一个文章他就会建立一个索引,到了4.3.3以后增加文章时有一个复先框是可以选择是否要加索引的,具体看com.liferay.portlet.journal.util.Indexer这个类,你可以看到他建了那些字段,当然这些操作都是在文章审批通过的情况下才会做,4.3.3以前的版本每次启动后会自动的在{user}/liferay/lucene下面的文件里增加索引,而到了4.3.3以后每次启动会删除下面的文件,不过不用担心在4.3.3以后的版本中liferay提供了重新批量增加所有索引,在admin->admin->servece->index里面,执行一下OK,十几分钟后就会在{user}/liferay/lucene生成所有的索引,这个时间是要视你数据库和机器所定,最好启动前把liferay整个文件夹删掉,不然有时候会报一个IOException.如果你用的是4.3.2之前的版本,并且增加日志,blog等数据时,用的不是一台web服务器,那可麻烦就大了,你就会发现搜索功能不好使了,除非你能把两台服务器上的索引文件合二为一.接着刚才的说,索引建立好后,就是搜索了,还拿日志内容搜索为例,com.liferay.portal.service.impl.CompanyLocalServiceImpl.search()查出索引,com.liferay.portlet.journalcontentsearch.util.ContentHits.recordHits()方法会进行一次过滤,因为有些文章是没有显示在网页上的,这个是根据journalcontentsearch这张表来过滤的,如果你想把他也显示出来,可以根据journalarticle这个portlet的做法,都发往view_article_content.jsp这个来显示.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/168406#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Mar 2008 16:46:35 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/168406</link>
        <guid>http://tyler-zhou.javaeye.com/blog/168406</guid>
      </item>
      <item>
        <title>liferay权限关于defaults权限的问题</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/165222" style="color:red;">http://tyler-zhou.javaeye.com/blog/165222</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          权限配置文件中:<br />&lt;community-defaults><br />	&lt;action-key>VIEW&lt;/action-key><br />&lt;/community-defaults><br />&lt;guest-defaults><br />	&lt;action-key>VIEW&lt;/action-key><br />&lt;/guest-defaults><br />访客和成员默认有了view权限,事实是否如此呢?回答:"不是".前几天客户反应新增加的产品访客看不见,只有把权限更新一下才能看得见,每一个都要更新无法接受,仔细跟进ProductCategoryPermission.contains(permissionChecker, categoryEntry, ActionKeys.VIEW)这个方法发现,PermissionCheckerImpl.hasPermission这个方法中先调用<br />Boolean value = PermissionCacheUtil.hasPermission(<br />			user.getUserId(), groupId, name, primKey, actionId);先看一下内存文件里有没有记录(c:/{user}/liferay),如果你是第一次刚启动他返回肯定是null,然后是<br />value = new Boolean(<br />	hasPermissionImpl(groupId, name, primKey, actionId));最关键的就是这个方法了,如果你是访客会调用hasGuestPermission,最终会调用PermissionServiceUtil.hasUserPermissions(<br />				defaultUserId, guestGroup.getGroupId(), actionId, resourceIds,<br />				bag);<br />代码部分就说到这,感觉太多了说不完,他操作流程是先找到resourcecode这个表,取得CODEID,然后再找resource这个表,取得RESOURCEID,最后才去找permission_这个表,找到permissionid后,再去用userId和permissionid去数据库里取得是否有权限,最后再把结果存到缓存文件里,以后再做这个权限验证他就不会走相同的路了,这一点是要注意的.<br />这样就出现了一个问题,产品可能有几万条,只是其中的几条不给访客看,每一个都要设置的话那就是要人命了,于是在ProductCategoryPermission.contains方法加上<br />try{		<br />ResourceServiceUtil.getResource(<br />		companyId, CategoryEntry.class.getName(), ResourceImpl.SCOPE_INDIVIDUAL, String.valueOf(category.getCategoryId()));<br />}catch (NoSuchResourceException nsre) {<br />return true;<br />}刚加的实例在resource这个表里是肯定没有的,getResource方法会报一个NoSuchResourceException ,报了就返回true,如果不报错就接着向下走,走liferay那一套,ResourceImpl.SCOPE_INDIVIDUAL这个值是设定范围的,在取resourcecode这个表会用到,有四个值可选,感觉好像只会用到SCOPE_INDIVIDUAL.<br />OK,到这里就结束了,再调用view验证时候,他就会先找这个是否存在表中,不存在就返回true.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/165222#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 17:33:11 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/165222</link>
        <guid>http://tyler-zhou.javaeye.com/blog/165222</guid>
      </item>
      <item>
        <title>liferay工作流java.lang.OutOfMemoryError解决</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/165198" style="color:red;">http://tyler-zhou.javaeye.com/blog/165198</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工作流配置好后,操作的时候可能会报jaas.config文件找不到和java.lang.OutOfMemoryError错误,我把bin/catalina.sh最大内存调了很高了,还是报这个错,搞了一天搞不好,没办法在liferay官网求助,有人回:如果你用的eclipse记得把eclipse的jvm也调高,晕倒,我一直是用myEclipse来启动的,赶紧打开myEclipse配置application servers/tomcat5/jdk,开发前我已在这里设过<br />-Xms128m -Xmx512m <br />-Dfile.encoding=GBK <br />-Duser.timezone=GMT <br />-Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config,改成1024,还顺代把jaas.comfig文件找不到的问题也一路解决了.希望大家不会犯和我一样的错误.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/165198#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 16:37:29 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/165198</link>
        <guid>http://tyler-zhou.javaeye.com/blog/165198</guid>
      </item>
      <item>
        <title>lieray工作流jbpm配置补充(很重要)</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/164363" style="color:red;">http://tyler-zhou.javaeye.com/blog/164363</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          接着我上面的一篇,如果你选择用servicemix-web 中间件,你可能会报"15:20:47,701 ERROR [EditDefinitionAction:77] com.liferay.portal.kernel.jbi.WorkflowComponentException: java.lang.NullPointerException<br />com.liferay.portal.kernel.jbi.WorkflowComponentException: java.lang.NullPointerException<br />at com.liferay.portlet.workflow.service.impl.WorkflowComponentServiceImpl.getDefinition(WorkflowComponentServiceImpl.java:113)<br />"这样的错误,这是本身lifray的BUG,现在基本上都建议大家用mule-web,在lifray配置中jbi.workflow.url默认就是mule了,如果你报的"com.liferay.documentlibrary.DuplicateFileException"这个是因为在C:\Documents and Settings\User\liferay文件夹删了,这个文件夹里面具体是在liferay\jackrabbit\workspace\home\data下面有很多.node.xml的文件,其中一个.node.xml文件里面有{}0.xml把这一行删了也可以,最简单的方法是把整个lifray文件删了,出现在这个错误的要本原因和上面那个错误原因是一样的,表面上看是WorkflowComponentServiceImpl类出了问题,其实是HTTP.URLtoByteArray()方法,client.executeMethod(hostConfig, method, state);在这里会依次调用http://localhost:8080/servicemix-web/workflow和http://localhost:8082/jbpm-web/servlet在jbpm包中servlet会调用WorkflowComponentImpl.process(HttpServletRequest req),问题就在这个方法里,req取不出来String cmd = ParamUtil.getString(req, "cmd");所以就会发现每次返回的都是同样的值,HTTP.URLtoByteArray()方法<br />if ((parts != null) && (parts.size() > 0)) {<br />					List nvpList = new ArrayList();<br /><br />					Iterator itr = parts.entrySet().iterator();<br /><br />					while (itr.hasNext()) {<br />						Map.Entry entry = (Map.Entry)itr.next();<br /><br />						String key = (String)entry.getKey();<br />						String value = (String)entry.getValue();<br /><br />						if (value != null) {<br />							nvpList.add(new NameValuePair(key, value));<br />						}<br />					}<br /><br />					NameValuePair[] nvpArray = (NameValuePair[])nvpList.toArray(<br />						new NameValuePair[nvpList.size()]);<br /><br />					PostMethod postMethod = (PostMethod)method;<br /><br />					postMethod.setRequestBody(nvpArray);<br />				}<br />这里给request正确的赋了值,可是为什么到了process()什么也没了,找了一两天也没有找出为什么,后来在官网的论坛上看到说servicemix有缺陷,建议使用mule-web,有兴趣的朋友可以找一下为什么会出现这样的问题.<br />最后总结一句话:"花了五天的时间,就发现了这个,要重头来过,被BOSS吼了,郁闷啊!!!<img src="/images/smiles/icon_cry.gif"/><img src="/images/smiles/icon_cry.gif"/>"
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/164363#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 21:56:54 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/164363</link>
        <guid>http://tyler-zhou.javaeye.com/blog/164363</guid>
      </item>
      <item>
        <title>liferay工作流jbpm配置</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/163928" style="color:red;">http://tyler-zhou.javaeye.com/blog/163928</a>&nbsp;
          发表时间: 2008年02月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先引用网上流传的最多的一篇文章:<br /><span style="color: brown">1、首先下载 Liferay Portal Professional 4.2.1 (Bundled with Tomcat for JDK 5.0) <br /><br />2、使用其默认的 HSQL 数据库，即不去更改其数据库配置。<br /><br />3、下载 liferay-portal-servicemix-4.2.1.war 和 iferay-portal-jbpm-4.2.1.war <br />http://www.liferay.com/web/guest/downloads<br /><br />4、把下载的这两个包分别更名为jbpm-web.war 和 servicemix-web.war<br /><br />5、把 jbpm-web.war 和 servicemix-web.war 拷贝到 Tomcat 的 webapps 目录中<br /><br />6、把 webapps\jbpm-web\WEB-INF\sql  目录中的 hsqldb.create.jbpm.3.1.sql 文件更名为 jbpm.script  ，并把它放入 tomcat 的 bin 目录。<br /><br />7、运行 Tomcat 的 startup.bat<br /><br />8、打开 http://localhost:8080/ ，并使用 test@liferay.com 用户登录 （密码为 test）<br /><br />9、增加  workflow portlet 项，选择其中的 definitions 标签，选择 add 按钮。<br /><br />10、在  text area 中输入工作流定义，如：<br /><br />1<br /> 2&lt;?xml version="1.0" encoding="UTF-8"?><br /> 3<br /> 4&lt;process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="Example Process"><br /> 5    &lt;start-state name="start"><br /> 6        &lt;task><br /> 7            &lt;assignment class="com.liferay.jbpm.handler.IdentityAssignmentHandler" ><br /> 8                &lt;companyId>liferay.com&lt;/companyId><br /> 9                &lt;type>user&lt;/type><br />10                &lt;name>test@liferay.com&lt;/name><br />11            &lt;/assignment><br />12            &lt;controller><br />13                &lt;variable name="text:color" /><br />14                &lt;variable name="text:size" /><br />15            &lt;/controller><br />16        &lt;/task><br />17        &lt;transition name="to_t" to="t"/><br />18<br />19    &lt;/start-state><br />20<br />21    &lt;task-node name="t"><br />22        &lt;task name="t" ><br />23            &lt;controller ><br />24                &lt;variable name="text:color" access="read" /><br />25                &lt;variable name="text:size"  access="read"/><br />26            &lt;/controller><br />27            &lt;assignment class="com.liferay.jbpm.handler.IdentityAssignmentHandler" ><br />28                &lt;companyId>liferay.com&lt;/companyId><br />29                &lt;type>user&lt;/type><br />30                &lt;name>test@liferay.com&lt;/name><br />31            &lt;/assignment><br />32        &lt;/task><br />33        &lt;transition name="to_end" to='end' /><br />34    &lt;/task-node><br />35    &lt;end-state name="end">&lt;/end-state><br />36&lt;/process-definition><br /><br />11、提交此示例，则生成一个工作流程。<br /><br />12、在  tasks view ，选择 "manage" 来执行此 tasks 。</span><br /><br />如果你照着这个做,我敢说99%的人都不能成功,我也是这99%中的一个,折腾了三天啊<img src="/images/smiles/icon_cry.gif"/><img src="/images/smiles/icon_cry.gif"/>不知道流了多少泪,不过还是要感谢这个作者.下面说我自已的:<br /><br />liferay集成了jbpm工作流,他是可以先择通过两种组件来调用JBPM的,servicemix和mule,你自已先一种吧.<br />1．Liferay官方网站下载liferay-portal-jbpm-web-4.3.2.war，liferay-portal-servicemix-web-4.3.2.war或者liferay-portal-muel-web-4.3.2.war.(我用的是4.3.2,你下自已用的版本,不能错)<br />2．三个包都放到/webapps下面,liferay启动后会自动的解压，或者用WINRAR也可以解压。<br />3．webapps\ROOT\WEB-INF\classes\portal-ext.properties增加jbi.workflow.url=http://localhost:8080/servicemix-web/workflow或jbi.workflow.url=http://localhost:8080/mule-web/workflow注意端口号要和自已的相同。<br />4．如果要修改端口号那么还要修改webapps\mule-web\WEB-INF\mule-config.xml下&lt;property name="url" value="http://localhost:8082/jbpm-web/servlet" />端口号；webapps\servicemix-web\WEB-INF\applicationContext.xml下&lt;property name="url" value="http://localhost:8082/jbpm-web/servlet" />端口号。<br />5．webapps\jbpm-web\WEB-INF\classes\hibernate.cfg.xml,先择自已用到的数据库类型并配置， webapps\jbpm-web\WEB-INF\sql下面有各种数据库脚本，选择自已的导入库中。<br />OK,到这步才算是配置完成,下面就是开发了,http://www.zxbc.cn/html/javajc/0511075189170.html这是一个讲开的文章,讲的不错,我还在开发中,等开发完了会把自已的开发心得写上.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/163928#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Feb 2008 15:35:21 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/163928</link>
        <guid>http://tyler-zhou.javaeye.com/blog/163928</guid>
      </item>
      <item>
        <title>liferay新增权限(二)</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/162275" style="color:red;">http://tyler-zhou.javaeye.com/blog/162275</a>&nbsp;
          发表时间: 2008年02月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          接着(一)讲,在做持久化的时候会在新增的portlet包下面有一个service包(参考自动生成持久化代码那篇文章),增加一个名为permission的包,增加orderPermission.java,内容如下:<br /><br />	public static void check(<br />			PermissionChecker permissionChecker, long plid, long categoryId,<br />			String actionId)<br />		throws PortalException, SystemException, Exception {<br /><br />		if (!contains(permissionChecker, plid, categoryId, actionId)) {<br />			throw new PrincipalException();<br />		}<br />	}<br /><br />	public static void check(<br />			PermissionChecker permissionChecker, long categoryId,<br />			String actionId)<br />		throws PortalException, SystemException, Exception  {<br /><br />		if (!contains(permissionChecker, categoryId, actionId)) {<br />			throw new PrincipalException();<br />		}<br />	}<br /><br />	public static void check(<br />			PermissionChecker permissionChecker, CategoryEntry category,<br />			String actionId)<br />		throws PortalException, SystemException {<br /><br />		if (!contains(permissionChecker, category, actionId)) {<br />			throw new PrincipalException();<br />		}<br />	}<br />	<br />	public static boolean contains(<br />			PermissionChecker permissionChecker, long pld, long categoryId,<br />			String actionId)<br />		throws PortalException, SystemException, Exception  {<br /><br />		if (categoryId == ProductCategoryUtil.DEFAULT_PARENT_CATEGORY_ID) {<br />			return PortletPermissionUtil.contains(<br />				permissionChecker, pld, "PROTLET_NAME", actionId);<br />		}<br />		else {<br />			return contains(permissionChecker, categoryId, actionId);<br />		}<br />	}<br /><br />	public static boolean contains(<br />			PermissionChecker permissionChecker, long categoryId,<br />			String actionId)<br />		throws PortalException, SystemException, Exception {<br /><br />		CategoryEntry category =<br />			CategoryEntryServiceUtil.findByPrimaryKey(categoryId);<br /><br />		return contains(permissionChecker, category, actionId);<br />	}<br /><br />	public static boolean contains(<br />			PermissionChecker permissionChecker, CategoryEntry category,<br />			String actionId)<br />		throws PortalException, SystemException {<br /><br />		return permissionChecker.hasPermission(<br />			category.getGroupId(), CategoryEntry.class.getName(),<br />			category.getCategoryId(), actionId);<br />	}<br />一个check对应一个contains,两个用在不同的场合,check用在后台持久化操作时候会抛出一个权限不足的错误,而contains用在JSP只是用来验证权限的.其实可以看出最后都是调用permissionChecker.hasPermission方法的,四个参数:1社区ID,2元素class名,3主键,4所操作的权限(要和order.xml中定义的权限名相同).还有一个PortletPermissionUtil.contains方法,这个是用来验证当前portlet操作权限的,他有四个参数:1permissionChecker,2当前layout.getPlid(),3portlet名,4所操作权限.<br />至于里面的参数的获得可以参照一下liferay原码中的shopping card,这个里面有这些参数的获得方法.有这个权限后,就可以把权限控制到每一个元素上.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/162275#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, 14 Feb 2008 17:00:29 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/162275</link>
        <guid>http://tyler-zhou.javaeye.com/blog/162275</guid>
      </item>
      <item>
        <title>liferay新增权限(一)</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/162261" style="color:red;">http://tyler-zhou.javaeye.com/blog/162261</a>&nbsp;
          发表时间: 2008年02月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          liferay的很大一的一个特色就是权限,他的权限的确很棒,可以说帅的掉渣.首先在ext-impl/classes/下建一个文件夹resource-actions/default-ext.xml,假如我们要对数据库的order这个表做权限,那么我们再建一个order.xml,在default-ext.xml包含这个order.xml这个文件,如下:<br />&lt;?xml version="1.0"?><br />&lt;resource-action-mapping><br />	&lt;resource file="resource-actions/order.xml" /><br />所有新建的对象的权限文件都要包含在这里<br />&lt;/resource-action-mapping><br />重点是order.xml这个文件:<br />&lt;?xml version="1.0"?><br /><br />&lt;resource-action-mapping><br />&lt;!--设置portlet权限--><br />	&lt;portlet-resource><br />		&lt;portlet-name>所属portlet名称&lt;/portlet-name><br />		&lt;supports><br />			&lt;action-key>ADD_PRODUCT&lt;/action-key><br />			&lt;action-key>UPDATE&lt;/action-key><br />			&lt;action-key>PERMISSIONS&lt;/action-key><br />			&lt;action-key>VIEW&lt;/action-key><br />			&lt;action-key>DELETE&lt;/action-key><br />&lt;!--这里我们定义了五种权限,看,加,删,增,权限设置--><br />		&lt;/supports><br />		&lt;community-defaults><br />&lt;!--设置成员默认所有的权限--><br />			&lt;action-key>VIEW&lt;/action-key><br />		&lt;/community-defaults><br />		&lt;guest-defaults><br />&lt;!--设置访客默认所有的权限--><br />			&lt;action-key>VIEW&lt;/action-key><br />		&lt;/guest-defaults><br />		&lt;guest-unsupported><br />&lt;!--设置访客默认所没有的权限--><br />			&lt;action-key>ADD_CATEGORY&lt;/action-key><br />			&lt;action-key>UPDATE&lt;/action-key><br />			&lt;action-key>PERMISSIONS&lt;/action-key><br />			&lt;action-key>DELETE&lt;/action-key><br />		&lt;/guest-unsupported><br />	&lt;/portlet-resource><br />&lt;!--设置model权限--><br />	&lt;model-resource><br />&lt;!--元素对应的class--><br />		&lt;model-name>com.ext.portlet.order.model.orderEntry&lt;/model-name><br />		&lt;portlet-ref><br />			&lt;portlet-name>所属portlet名称&lt;/portlet-name><br />		&lt;/portlet-ref><br />		&lt;supports><br />			&lt;action-key>ADD_PRODUCT&lt;/action-key><br />			&lt;action-key>DELETE&lt;/action-key><br />			&lt;action-key>PERMISSIONS&lt;/action-key><br />			&lt;action-key>UPDATE&lt;/action-key><br />			&lt;action-key>VIEW&lt;/action-key><br />		&lt;/supports><br />		&lt;community-defaults><br />			&lt;action-key>VIEW&lt;/action-key><br />		&lt;/community-defaults><br />		&lt;guest-defaults><br />			&lt;action-key>VIEW&lt;/action-key><br />		&lt;/guest-defaults><br />		&lt;guest-unsupported><br />			&lt;action-key>ADD_PRODUCT&lt;/action-key><br />			&lt;action-key>DELETE&lt;/action-key><br />			&lt;action-key>PERMISSIONS&lt;/action-key><br />			&lt;action-key>UPDATE&lt;/action-key><br />		&lt;/guest-unsupported><br />	&lt;/model-resource><br />&lt;/resource-action-mapping><br />然后在ext-impl/classes/portal-ext.properties中加上<br />resource.actions.configs=resource-actions/default.xml,resource-actions/default-ext.xml<br />OK权限设置完成了一半了.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/162261#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/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>Thu, 14 Feb 2008 16:28:36 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/162261</link>
        <guid>http://tyler-zhou.javaeye.com/blog/162261</guid>
      </item>
      <item>
        <title>liferay持久化代码的自动生成</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/162242" style="color:red;">http://tyler-zhou.javaeye.com/blog/162242</a>&nbsp;
          发表时间: 2008年02月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          liferay对数据库的操作他有自已的一套写法,我们可以用service.xml来自动生成这些代码, 这样就省了不少力气.在ext-impl包的classes下面service.xml写上数据库表字段如下:<br />&lt;?xml version="1.0"?><br />&lt;!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 4.3.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_4_3_0.dtd"><br /><br />&lt;service-builder root-dir=".." package-path="com.ext.portlet">这个是路径一般和开发的portlet在一个包下<br />	&lt;portlet name="mail" short-name="mail" /><br />	&lt;entity name="MailEntry" local-service="false" remote-service="true" persistence-class="com.ext.portlet.mail.service.persistence.MailEntryPersistence" table="*****"><br /><br />		&lt;!-- PK fields --><br /><br />		&lt;column name="mailId" type="long" primary="true" /><br /><br />		&lt;!-- Audit fields --><br /><br />		&lt;column name="groupId" type="long" /><br />		&lt;column name="createDate" type="Date" /><br /><br />		&lt;!-- Other fields --><br />		&lt;column name="name" type="String" /><br /><br />                  column name这个值是要和表中的字段名一样,会自动全变成大写.<br /><br />		&lt;!-- Order --><br /><br />		&lt;order by="asc"><br />			&lt;order-column name="createDate" case-sensitive="false" /><br />		&lt;/order>排序设置.<br /><br />		&lt;!-- Finder methods --><br /><br />		&lt;finder name="groupId" return-type="Collection"><br />			&lt;finder-column name="groupId" /><br />		&lt;/finder><br />                  增加的查找,删除的方法,默认情况下他会生成一些常用的方法,如:主键查找,查找所有,删除.你可以根据自已的需要来增加一些方法,包括多个字段的组合查找.<br />	&lt;/entity><br />	&lt;exceptions><br />		&lt;exception>EntryName&lt;/exception><br />	&lt;/exceptions><br />&lt;/service-builder><br />OK,这个文件写好了以后,build-service这个文件,然后你就会发现在你的ext-impl包下面指定的地方多了两个文件夹,一个service,一个model.impl,service下面会有三个文件夹,如果有权限设置也是在这里的.然后在ext-service这个包下面也会多一个包,这个包下面有两个包,一个model,一个service.ext-impl/classes/META-INF/里面的hbm.xml,spring.xml,hints.xml会自动的加上相关的代码.<br />然后要修改其中的三个文件,ext-service/新建包名/service/***EntryService.java和***EntryServiceUtil.java,***EntryService.java这个是个接口,你可以把你要用到的一些持久化的方法(ext-impl/新建包名/service/***Entrypersistence.java中有所有的方法)写到这里,***EntryServiceUtil.java这里写上这些静态方法(在action中操作的时候就是调用这个类),最后一个要修改的是ext-impl/新建包名/service/impl/***EntryServiceImpl.java因为他实现了,***EntryService这个接口所以把他的实现方法写这里就好了.<br /><br />以上我说的可能比较粗糙,其实自动生成这些文件后,修改那三个文件时,如果您不知道怎么改可以参照liferay的源码,他的目录层次和这个是一样的,在blog和journalArtlice里面相对应的三个文件就可以了,基本上是一看就明白了.最后一点自动生成spring.xml中bean id="com.ext.portlet.包名.service.persistence.***EntryPersistenceImpl 对应的class值,这个值每次总是个错的,不晓得为什么,要手动的改一下.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/162242#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>Thu, 14 Feb 2008 15:24:24 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/162242</link>
        <guid>http://tyler-zhou.javaeye.com/blog/162242</guid>
      </item>
      <item>
        <title>liferay中vm中如何调用java类代码</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/159216" style="color:red;">http://tyler-zhou.javaeye.com/blog/159216</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在liferay的init.vm和GUEST社区中自带的模板中经常能看到liferay中JAVA类的方法,一直想找到他是如何把这些类给导进来的,终于功夫不负有心人, com.liferay.portal.velocity.VelocityVariables类中你会发现所有的在vm中能看到的类都在这里做了定义,但是他写的类有限如果我们想调一个自已写的很困难,因为我目前还不是很清楚liferay的启动的机制,他是在那里执行的这些代码,所以我们没办法来重写他,如果直接在上面来改,然后打包觉得好像动作又大了点,有点杀鸡用牛刀.还有在这个类中insertHelperUtilities方法中把vc.put("serviceLocator", ServiceLocator.getInstance());这个也放进来了,用这个我们可以生成自已的类,用findService方法可以获得到持久化的类,但这个方法不是万能的,你这个持久化的类必须要符合liferay持久化机制.liferay本身有一套持久化机制的,自已定义的时候也要符合他的,可以用service.xml自动生成这些持久化类,然后自已在修改一下就OK.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/159216#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 23:34:43 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/159216</link>
        <guid>http://tyler-zhou.javaeye.com/blog/159216</guid>
      </item>
      <item>
        <title>杀千刀的PortletPreferences</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/159210" style="color:red;">http://tyler-zhou.javaeye.com/blog/159210</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这几天忙的像个鬼一样,好久没有更新blogs了,今天遇到了一个问题想骂娘,所以写出来希望大家遇到这样的问题有点帮助,开发portlet一般init.jsp一般都有:<br />PortletPreferences prefs = renderRequest.getPreferences();<br /><br />String portletResource = ParamUtil.getString(request, "portletResource");<br /><br /><br />if (Validator.isNotNull(portletResource)) {<br />	prefs = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource, true, true);<br />}<br />然后在view.jsp和configuration.jsp中都include这个init.jsp,在配置页面打开后修改了配置,然后在ConfigurationAction中处理,processAction中<br />PortletPreferences prefs =<br />				PortletPreferencesFactoryUtil.getPortletSetup(<br />					req, portletResource, true, true);或者在renderAction中res.getPreferences()也可以得到,偶遇到的问题就是,同样的init.jsp在配置页和view取得值居然不一样,而且各不相干,好像是两个portlet一样,以前也写了不少,没有出现过这样的问题,仔细查了Portletpreferences的类型,取得的方法,对了又对也没发现问题出在那里,然后又到了数据库找到了这几条数据,果然他们取得是两个不同的数据,不停的找,郁闷啊,一下午过去了,后来终于发现portletResource这什值,居然是"",无语了,死活也想不明白为什么在view的时候这个值是空,这个值也没有看到liferay是在那里放到request中去的,本身现在对lifery 整个的运行机制也不是很清,没办法啊,为了解决问题后来只好在init.jsp中取的方法也改成portletResource = portletDisplay.getId();就可以了,虽然解决了问题,可是心理还是不爽,问题的根本原因还是没有找到.<br /><br /><br />开发lifery这个东西,有时候不能太相信自已,我就遇到过,比如说清一下缓存,重启一下服务,登陆和注销后再看一下(PortalUtil.getPortletGroupId(request))这个方法有时候在登陆状态和注销状态取得的值都是不一样的,照道理同一个portlet不应该会出现这样的问题,所以说遇到这样的问题郁闷啊.
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/159210#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 22:44:41 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/159210</link>
        <guid>http://tyler-zhou.javaeye.com/blog/159210</guid>
      </item>
      <item>
        <title>liferay录入中文乱码问题</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/156833" style="color:red;">http://tyler-zhou.javaeye.com/blog/156833</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚配置好后的liferay启动后,只要是操作数据库的就会发现输入中文是乱码,解决方案如下:<br />	修改portal-ejb/classes/system.properties文件，以适应中文环境<br />    #user.country=US<br />    user.country=CN<br />    #user.language=en<br />    user.language=zh_CN<br />    #user.timezone=GMT<br />    user.timezone=GMT+8
          <br/>
          <span style="color:red;">
            <a href="http://tyler-zhou.javaeye.com/blog/156833#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/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>Thu, 17 Jan 2008 10:51:03 +0800</pubDate>
        <link>http://tyler-zhou.javaeye.com/blog/156833</link>
        <guid>http://tyler-zhou.javaeye.com/blog/156833</guid>
      </item>
      <item>
        <title>liferay开发环境配置说明</title>
        <author>Tyler_Zhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tyler-zhou.javaeye.com">Tyler_Zhou</a>&nbsp;
          链接：<a href="http://tyler-zhou.javaeye.com/blog/156770" style="color:red;">http://tyler-zhou.javaeye.com/blog/156770</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目接近尾声了,客户突然提出了很多的功能性的开发,郁闷死为了赶上进度,从明天开始就要进行地狱式的开发了,在这期间我会把自已所有的心得全写上来,以前的开发环境被我做测试搞的乱七八糟,没办法只能重新配置了,关于配置在网上已经有很多了,自已偷了个赖就找了一篇写的比较好的比较完整的配置文档给COPY了过来,希望别人不会找我麻烦.先给说下<br />在后面的开发主要方向是日志文章,全文搜索,产品开发,权限四块.下面部分就是COPY过来的文档,我用的是4.3.2版本,要用ant1.7,数据库是oracle10G,驱动是10G.14最新的驱动,.12的会报错,控制台中文乱码,网上已经有很多的解决方法了,数据也会出现中文乱码问题(这个问题是客户方帮助解决了,然后重打了portal-impl.jar换掉了原来的就可以了,一直没问过他改的那里,改天问一下知道了告诉大伙),liferay-portlet.xml和portlet-custom.xml这两个增加portlet必用的配置他讲的不够好,其他的基本和他下面说的一样了,这个文章也的很长大家只要看自已需要的部分就可以了,我个人认为:<br /><br /><br />1.  文档说明<br />本文基于Tomcat开发Portlet的部分根据LifeRay官方的Quick Start文档中“Writing a simple JSP Portlet”章节的内容试验精简而成，依据的文档版本是RC1，日期2006-06-15。对Liferay自身代码的编译、调试环境则参考了原Liferay 3.6.1版本官方文档的“User Guide”对应章节。因为本文档对说明文字进行了一些简化，以及官方文档有可能在您读到本文时又有更新，因此仍建议参考官方文档原文，以明确一些细节的意义。但官方文档也存在一些错误，这里书写的内容对本文指明的各软件的特定版本号是已经试验成功的，因此也建议在读官方文档的时候同时参考本文。 <br /><br /> <br /><br />按照本文的步骤完成后，能够建立一个在Windows下的Eclipse工具中开发兼容LifeRay的Portlet组件的基本环境，或者建立一个在Windows下的Eclipse工具对Liferay自身的源代码进行编译、调试、改进的环境。按照你的需要，不一定要同时配置这两种环境，具体说明可参照对应章节开头的说明文字。当然，你也可以把两种环境都配置起来，通过试验来找到适合自己的方法。如果希望采取命令行的方式进行更多的开发环境定制，以及在Linux环境下进行开发等，那么可以再继续参考官方文档的Developer Guide中的有关章节。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />2.  基本环境配置<br />本节安装配置Liferay有关开发必须的一些软件，这些软件在后面章节都会用到，因此本节的内容是不可跳过的。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />2.1  准备必须的软件，并进行环境参数配置<br />安装如下软件： <br /><br />J2SDK 1.4.1 （虽然官方文档推荐使用1.4.2版本，但是使用1.4.2版本的话，在LifeRay的部分功能中会出现中文乱码问题；而到LifeRay 4.0为止，还没有做到与Java 1.5的完全兼容）；（转载者注：本人使用Liferay Portal 4.3.0版 可以与JDK1.6兼容） <br />Jikes 1.21 （官方文档声称这个软件不是必装的，可以使用J2SDK中的标准编译器代替，但是实际试验中，使用标准编译器会出现一些奇怪的问题，而且Jikes给出的编译错误信息也更为丰富，推荐安装使用；Jikes 1.22及以上版本是仅兼容Java 1.5的，无法与1.4版本的J2SDK一起使用，因此不要使用这些版本）；（转载者注：必须安装Jikes，因为在Liferay的配置文件中使用的编译器就是Jikes） <br />Apache Ant 1.6.5 （对Ant的版本倒是没有特殊要求，只是因为我使用的是Ant 1.6.5，所以我就这么注明了）； （转载者注：在Eclipse 3.3.0版中自带Ant 1.7.0版） <br /> <br /><br />J2SDK下载后是exe格式的安装文件，而Jikes和Ant都是zip压缩包，直接解压即可。这样我安装完三个软件分别到如下三个目录： <br /><br />C:\j2sdk1.4.1_07 <br />C:\jikes-1.21 <br />C:\apache-ant-1.6.5 <br /> <br /><br />接着在系统中设定环境变量，右键点击“我的电脑”，选择“属性”，再选择“高级”－》“环境变量”，在“系统变量”中修改或者加入： <br /><br />JAVA_HOME C:\j2sdk1.4.1_07 <br />JIKES_HOME C:\jikes-1.21 <br />ANT_HOME C:\apache-ant-1.6.5 <br />如果系统中设置了CLASSPATH环境变量，则去除之，以防止冲突 <br />给path环境变量加入 %ANT_HOME%\bin;%JAVA_HOME%\bin;%JIKES_HOME%\bin <br /> <br /><br />之后重启系统，使环境变量生效。 <br /><br />（转载者注：可以不改变其他环境变量。只需要把下载到的Jikes.exe放到JDK的bin文件夹下即可。）<br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />2.2  下载LifeRay程序包<br />本文直接使用了发布版本的4.0的源代码和二进制包，当然也可以利用Subversion接口直接访问LifeRay在Sourceforge上的库使用最新的源代码版本，不过下面的试验只是基于发布版本的代码包完成的，共计需要下载： <br /><br />liferay-portal-src-4.0.0.zip LifeRay 4.0 正式版的源代码包； <br />liferay-portal-tomcat-4.0.0.zip LifeRay 4.0 正式版的Tomcat二进制绑定包，提供测试新Portlet的执行环境（如果只打算编译调试Liferay自身的代码，而不打算开发新的独立Portlet组件，则可以不下载这个包）； <br /> <br /><br />以上文件包可以在LifeRay官方网站的连接或者Sourceforge上下载到。 <br /><br /> <br /><br />将liferay-portal-src-4.0.0.zip解压到D:\liferay\portal 目录下备用。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />2.3  安装和配置基本的Eclipse运行环境<br />在Eclipse官方网站下载最新版本的Eclipse IDE环境。我将之解压到了C:\j2sdk1.4.1_07\eclipse 目录下，双击eclipse.exe文件运行之； <br /><br />File->Switch Workspace，输入d:\liferay，点击OK确认； <br />File->New->Project->Java Project，输入项目名称为“portal”，保持默认的“create new project in workspace”，选择“Finish”结束。 <br />如果上一步成功，那么已经可以在左侧栏看到源代码的目录结构了；并且右键点击项目的根目录，选“Properties”，选“Java Build Path”的“Libraries”标签，应该能够看到所有需要的jar格式库文件在里面了； <br />Window->Show View->Ant，在新出现的Ant标签栏点击加号，选择项目源码根目录上的build.xml文件； <br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />3.  基于Tomcat开发Portlet<br />本节通过配置一个基于Liferay的Tomcat绑定二进制包建立一个扩展开发Liferay的环境，这个环境特别适用于对新的Portlet组件进行调试和开发。这个方法几乎不会修改Liferay自身的代码，所有的改动都是在扩展环境里完成，可以在Liferay升级时比较容易地实现扩展了的功能的迁移。 <br /><br /> <br /><br />但这个方法也有一个缺点，就是开发的Portlet如果不执行deploy步骤，就不能在Liferay里启用。因此在开发和调试Portlet的过程中，一般还是在Liferay以外的环境中开发调试好，之后移植到此扩展开发环境中，与Liferay联调，成功后部署应用。具体工作中，可以与后面“改进和调试Liferay自身代码”一节中调试Portlet的方法稍作比较，选择适合自己情况的方法。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />3.1  配置扩展开发环境<br />为了方便进行自己的修改和定制开发，同时又能与Liferay的更新保持兼容，我们使用单独的目录来放置自己的修改，这样在Liferay发布新版本时，可以直接升级Liferay部署，而不会与我们的修改相冲突。具体地，我使用了d:\liferay\ext 目录来放置所有的扩展（包括JSP、class文件及依赖库等）。 <br /><br /> <br /><br />首先要在d:\liferay\portal 目录下建立一个名为“release.${username}.properties”的配置文件，其中${username}就是当前Windows登陆的用户名，可以通过“开始菜单－》运行－》cmd.exe”后显示的默认路径看到，跟在“Documents and Settings”字样后面的就是当前登陆的用户名。这样，我的配置文件的名称是release.administrator.properties 。文件的内容只写一行： <br /><br />lp.ext.dir={Liferay}\ext<br /><br /> <br /><br />其中“{Liferay}”指的是Liferay源代码存放的上级目录，比如我写的这一行就是： <br /><br />lp.ext.dir=d:\liferay\ext<br /><br /> <br /><br />回到上一节建立好的Eclipse中的Ant视图中，双击展开根节点Portal，应该可以看到很多Ant任务，顺序执行 clean, start, build-ext 。屏幕下方的命令行窗口会跳跃大堆大堆的文字提示信息，如果一切正确，那么其中不应该有红色的错误信息（绝大多数此处可能出现的错误都是配置文件不正确所引起的）。一切正常的话，那么d:\liferay\ext 目录下应该生成了很多东西了。 <br /><br />（转载者注：一种错误有可能是Jikes缺少，其余基本上是路径配置问题）<br /><br /> <br /><br />我们将前面准备好的与Tomcat绑定的Liferay Professional版本的压缩包解压到d:\liferay\ext\servers\tomcat 目录下，并且在d:\liferay\ext 目录下建立一个名为app.server.{username}.properties的文件，在我这也就是app.server.administrator.properties ，文件内容写如下两行： <br /><br />lp.ext.dir={Liferay}\ext<br />app.server.type=tomcat<br /><br /> <br /><br />在我这也就是： <br /><br />lp.ext.dir=d:\liferay\ext<br />app.server.type=tomcat<br /><br /> <br /><br />然后仿照前面在Eclipse里建立新的Java工程的方法，建立一个新的Java项目，指向d:\liferay\ext 目录，也就是说，在输入Java项目的项目名称时，输入“ext”而不是前面输入“portal”。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />3.2  添加插件支持<br />为了能够在基于Tomcat的Liferay Porfessional版本的运行环境上实现我们编写的插件的调试，需要给Eclipse环境添加一个借助Tomcat服务器开展调试的插件，也就是Sysdeo这个插件，可以到 http://www.sysdeo.com/eclipse/tomcatplugin 下载，我下载的是tomcatPluginV31.zip文件（将下载的这个zip文件包解压，拷贝到Eclipse安装目录的plugins目录下，比如我这里就是拷贝到了C:\j2sdk1.4.1_07\eclipse\plugins\ 目录下。关闭并且重启Eclipse，如果插件安装成功，那么在界面的左上角应该可以看到Tomcat的图标（转载者注：一只小猫，另一只小猫身上带着一个红叉）。 <br /><br /> <br /><br />现在我们来配置Sysdeo插件的参数，在Eclipse里“Windows->Preferences”，选择“Tomcat”标签，选择“Version 5.x”版本，然后修改参数“Tomcat Home”为“{Liferay}\ext\servers\tomcat”，在我这里也就是“D:\liferay\ext\servers\tomcat ”；修改参数“Configuration File”为“{Liferay}\ext\servers\tomcat\conf\server.xml”，在我这里也就是“D:\liferay\ext\servers\tomcat\conf\server.xml”。 <br /><br /> <br /><br />接着我们要继续给Tomcat执行的JVM虚拟机增加运行参数，启用JAAS支持以及扩大默认内存占用量，也就是展开“Tomcat”标签，选择“JVM Settings”，在“Append to JVM Parameters”选择“Add”，先添加 <br /><br />-Djava.security.auth.login.config=d:\liferay/ext/servers/tomcat/conf/jaas.config<br /><br /> <br /><br />再添加 <br /><br />-Xmx512m<br /><br /> <br /><br />还要在这里修改Tomcat运行所使用的虚拟机，要注意这里必须指定一个JDK附带的虚拟机而不可以指向JRE附带的虚拟机环境，否则Tomcat在运行过程中会出现错误。如果这里的下拉选项没有出现与JDK中虚拟机有关的选项，那么我们要首先手动建立一个，我们需要到Java标签下的“Installed JREs”，选择“Add”，“JRE home directory”选择“C:\j2sdk1.4.1_07”，给这个JRE环境起个名字，比如“J2SDK1.4.1_07”，之后点Ok保存设置，再重新开启“Window->Preferences”对话框，到Tomcat的“JVM Settings”项选择刚才建立的“J2SDK1.4.1_07”这个JRE就可以了。 <br /><br /> <br /><br />这样，只要再配置好Liferay的数据库连接参数，就可以通过点击Eclipse里面的Tomcat图标启动Tomcat服务器了。 （转载者注：可以通过浏览器测试。地址http://localhost:8080）<br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />3.3  配置数据库和执行Liferay<br />这里选择了使用MySql数据库，到MySql官方网站下载<br /><br />MySql在Windows下的可执行包mysql-5.0.21-win32.zip、<br /><br />MySql的JDBC驱动程序mysql-connector-java-3.1.12.zip、<br /><br />MySql管理工具mysql-administrator-1.1.9-win.msi、<br /><br />MySql数据查询工具mysql-query-browser-1.1.20-win.msi、<br /><br />MySql数据建模工具mysql-workbench-1.0.6-beta-win32.msi。 <br /><br /> <br /><br />除JDBC驱动外，其他几个包都可以双击执行安装向导完成。安装完毕后，使用MySql数据查询工具Query Browser连接数据库，选择“File->Open Script”载入D:\liferay\ext\sql\create 目录下的create-mysql.sql 文件，点击“Execute”按钮执行。刷新会发现得到了新的数据库实例lportal。 <br /><br /> <br /><br />使用MySql管理工具administrator，以root用户连接数据库，点“User Administration”，在左下方用户帐号列表一栏点击右键，建立新用户liferay，输入密码sql606，点击“Schema Privileges”标签，点击lportal数据库，把除了grant权限外的所有权限都给liferay这个用户，点击“Apply changes”按钮保存这个新账户。这样完成了数据导入以及建立MySql数据库用户的过程。 <br /><br /> <br /><br />编辑D:\liferay\ext\servers\tomcat\conf\Catalina\localhost 目录下的ROOT.xml文件，将其中的 <br /><br />&lt;Resource<br />                name="jdbc/LiferayPool"<br />                auth="Container"<br />                type="javax.sql.DataSource"<br />                driverClassName="org.hsqldb.jdbcDriver"<br />                url="jdbc:hsqldb:test"<br />                username="sa"<br />                password=""<br />                maxActive="20"<br />        /><br /><br />替换为 <br /><br />&lt;Resource<br />        name="jdbc/LiferayPool"<br />        auth="Container"<br />        type="javax.sql.DataSource"<br />        driverClassName="com.mysql.jdbc.Driver"<br />        url="jdbc:mysql://localhost/lportal?useUnicode=true&amp;characterEncoding=UTF-8"<br />        username="liferay"<br />        password="sql606"<br />        maxActive="100"<br />        maxIdle="30"<br />        maxWait="10000"<br />    /><br /><br />请注意，这里如果按照官方文档的说法设置会出现错误，官方文档将数据库url中的“&”错误地写成了“&”，会造成Tomcat启动失败。 <br /><br /> <br /><br />再解压MySql的JDBC驱动程序mysql-connector-java-3.1.12.zip 中的mysql-connector-java-3.1.12-bin.jar 文件，复制到D:\liferay\ext\servers\tomcat\common\lib 目录下，使得Liferay能够找到MySql的JDBC驱动。 <br /><br /> <br /><br />这样数据库有关的内容已经全部配置完成，可以点击Eclipse里面的Tomcat图标启动Liferay了，如果没有出现错误，那么已经可以用浏览器访问http://localhost:8080 访问到Liferay Professional版本的Tomcat服务。 <br /><br /> <br /><br />这里要注意，Sysdeo插件与Liferay的Tomcat绑定二进制包默认指定的Hypersonic数据库驱动有冲突，所以我们在本节使用了MySql数据库。如果一定要使用Hypersonic数据库的话，就不能通过Sysdeo插件启动Tomcat，而需要直接执行D:\liferay\ext\servers\tomcat\bin 目录下的startup.bat来启动。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />3.4  完成一个最简单的JSP的Portlet<br />我们通过完成一个最简单的类似Hello World那样的JSP Portlet来展示Portlet的基本组成部分，更复杂的功能或者基于Structs等框架的Portlet请参见后续文档。 <br /><br /> <br /><br />在D:\liferay\ext\ext-web\docroot\html\portlet\ext 目录建立一个新的文件夹myjspportlet 。接着打开D:\liferay\ext\ext-web\docroot\WEB-INF 文件夹下的portlet-ext.xml 文件进行编辑，加入对这个即将建立的新Portlet的描述，如下： <br /><br />&lt;portlet><br />  &lt;portlet-name>EXT_2&lt;/portlet-name><br />  &lt;display-name>My JSPPortlet&lt;/display-name><br />  &lt;portlet-class>com.liferay.portlet.JSPPortlet&lt;/portlet-class><br />  &lt;init-param><br />    &lt;name>view-jsp&lt;/name><br />    &lt;value>/portlet/ext/myjspportlet/view.jsp&lt;/value><br />  &lt;/init-param><br />  &lt;expiration-cache>300&lt;/expiration-cache><br />  &lt;supports><br />    &lt;mime-type>text/html&lt;/mime-type><br />  &lt;/supports><br />  &lt;portlet-info><br />    &lt;title>My JSP Portlet&lt;/title><br />  &lt;/portlet-info><br />  &lt;security-role-ref><br />    &lt;role-name>Power User&lt;/role-name><br />  &lt;/security-role-ref><br />  &lt;security-role-ref><br />    &lt;role-name>User&lt;/role-name><br />  &lt;/security-role-ref><br />&lt;/portlet><br /><br />其中各项的含义为： <br /><br />portlet-name 描述此Portlet的规定名称，这个名称必须是唯一不重复的。 <br />display-name 记录此Portlet在Portal中的显示名称，在将Portlet加入到Portal中时如果看到了这个名字，那么就可以找到现在编写的这个Portlet组件，此名称不必是唯一的。 <br />portlet-class 描述与此Portlet对应的Java类的完整路径。 <br />init-param 通过name/value对的形式指定此Portlet初始化时的参数。 <br />expiration-cache 定义Portlet输出缓存的超时时间，以秒为单位，超出这里指定的时间后就认为Portlet的输出已经超时了，如果这里是-1则说明输出永远不超时。 <br />supports 包括所支持的MIME格式，同时定义对一种特定的MIME格式，此Portlet所支持的模式，所有的Portlet都必须支持View模式。 <br />portlet-info 定义Portlet有关的信息。 <br />security-role-ref 包含Web应用与系统角色之间的映射，在Liferay中，这里表示什么样的角色有权限访问此Portlet。（一般来讲，Power User有权个人化Portal，而User无权进行个人化） <br /><br /><br /> <br /><br />现在我们已经完成了对Portlet的描述，现在我们建立此Portlet的JSP页面，到刚才创建的myjspportlet目录下，建立一个名为init.jsp的文件，加入如下两行： <br /><br />&lt;%@ include file="/html/common/init.jsp" %><br />&lt;portlet:defineObjects /><br /> <br /><br />这两行导入了每个Portlet都要包含的公共class文件以及公共变量，如果需要导入此Portlet专用的类或者进行此Portlet专用的变量的初始化，那么可以仿照common/init.jsp 文件中的写法写在myjspportlet目录下的init.jsp文件中。 <br /><br /> <br /><br />再添加一个名为view.jsp的文件，此文件将包含Portlet要输出的内容，再文件中写入“Hello [your name here]!”。Portal能够找到并且执行这个JSP文件是因为我们在portlet-ext.xml文件中的init-param标签指定了view-jsp参数的值是/ext/myjspportlet/view.jsp ，这个JSP文件就被作为默认的JSP页面被显示了。 <br /><br /> <br /><br />最后，我们需要在D:\liferay\ext\ext-ejb\classes\content 目录下的Language-ext.properties 文件中加入下面这行，才能在Portal中加入我们创建的这个Portlet： <br /><br />javax.portlet.title.EXT_2=My JSP Portlet<br /><br /> <br /><br />因为我们已经创建了扩展开发环境，因此我们可以通过Ant脚本来向Portal添加我们新创建的这个Portlet。在Eclipse的Ant视图中，导入D:\liferay\ext 目录下的build.xml文件，之后执行deploy [default]这个Ant任务，就可以完成新Portlet的发布。当这个任务执行完毕，启动Tomcat，登陆系统，就可以在“添加内容”功能中找到我们新创建的Portlet了。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />4.  改进和调试Liferay自身代码<br />本节将建立一个编译、调试Liferay自身代码的环境。如果希望参与Liferay社区对Liferay Portal的改进开发、提交补丁等，则需要按照本节的说明配置开发环境。 <br /><br /> <br /><br />此外，本节也能建立一种开发和调试Portlet组件的环境，依赖于Orion服务器的热部署特性，能够实现对Portlet组件的实时调试。但是，由于本节的调试环境是一个完整的J2EE环境，因此也是比基于Tomcat的方法更为沉重庞大的选择，也说不上简洁高效。具体做Portlet开发时还要根据自己工作的具体状况和对J2EE的熟悉程度选择一种Portlet开发环境。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />4.1  安装Orion服务器<br />Liferay官方在开发时使用的就是Orion服务器，因此虽然可以使用其他的J2EE Server配置开发环境，我们还是选择了Orion。而且Orion服务器对开发者和非商业应用提供一个免费使用的授权，同时文档支持和应用程序的热部署功能也不错，还是值得推荐的。 <br /><br /> <br /><br />首先到Orion的官方网站http://www.orionserver.com 下载Orion服务器的二进制文件，我选择的是2.0.6版本，那会是一个zip压缩包。将这个压缩包中的内容解压到C:\j2sdk1.4.1_07\orion 目录下。这时进入这个目录，使用“java -jar orion.jar”指令应该能够在http://localhost 上运行起来了。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />4.2  在Eclipse中配置Orion<br />在Eclipse中通过“Run->Debug..”菜单进入Debug环境设置对话框。在“Java Application”下面有个“orion”标签，我们需要修改这个标签下面的参数。 <br /><br /> <br /><br />“Main”标签下的“Project”项需要改为“Portal”，原来写的是“ext”，其他的选项保持默认的即可，也即“Main class”一项仍保持为“com.evermind.server.ApplicationServer”。 <br /><br /> <br /><br />“Arguments”标签下，开始Eclipse会报错，说“${ORION_HOME}”变量没有定义，我们点击“Program arguments”栏目下的“Variables”按钮，在新弹出的对话框中点击“Edit Variables...”按钮，点击“New”，“Name”项输入“ORION_HOME”，“Value”项输入“C:\j2sdk1.4.1_07\orion”，点击3次Ok关闭对话框。这样“Program arguments”栏仍保持为“-config ${ORION_HOME}/config/server.xml -userThreads”；“VM arguments”还保持为“-Xbootclasspath/a:${workspace_loc}\portal\lib\xercesImpl.jar;${workspace_loc}\portal\lib\xml-apis.jar -Xmx512m -Dfile.encoding=UTF-8 -Duser.timezone=GMT”。 <br /><br /> <br /><br />在“Classpath”标签下，将“User Entries”下带环境变量的orion.jar引用路径删除，然后点击“Add External JARs”按钮，重新添加本机上的orion.jar库文件。 <br /><br /> <br /><br />在“JRE”标签，选择“Alternate JRE”，改为“j2sdk1.4.1_07”，如果这里使用纯JRE的运行环境而不是JDK附带的运行环境，很可能会造成Orion运行中的一些编译类的错误。 <br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />4.3  修改Orion配置参数<br />编辑C:\j2sdk1.4.1_07\orion\config\server.xml 文件，在行 <br /><br />&lt;web-site path="./default-web-site.xml" /><br />下面添加行 <br /><br />&lt;web-site path="./web-sites/portal.liferay.com-web.xml" /><br />。 <br /><br /> <br /><br /> <br /><br />并且加入行 <br /><br />&lt;compiler executable="jikes" classpath="C:\j2sdk1.4.1_07/jre/lib/rt.jar" /><br />来启用jikes编译器。其中C:\j2sdk1.4.1_07/jre/lib/rt.jar 指向JDK附带的JRE运行环境库。如果不启用jikes，则会使用sun的JDK附带的编译器，可能与Liferay代码造成冲突，因此建议启用jikes。 <br /><br /> <br /><br /> <br /><br />建立新目录C:\j2sdk1.4.1_07\orion\config\web-sites ，在其中建立文件portal.liferay.com-web.xml ，文件内容如下： <br /><br />&lt;?xml version="1.0" ?><br />&lt;!DOCTYPE web-site PUBLIC "Orion Web-site" "http://www.orionserver.com/dtds/web-site.dtd"><br /><br />&lt;web-site host="[ALL]" port="8080"><br />   