Portal研究

Portal

Portal说明

一个portal应用可通过复杂的个性化配置用户提供定制的内容,而portal页面就是含有不同的portlet为不同的用户生成内容

portlet容器

portlet容器运行portlet,并为portlet提供必要的运行环境

开源portal对比

Jetspeed (2.1.3)
Jetspeed/Tomcat/MySQL 好像性能不错,不过文档不太好,接口粗糙不友好,难于安装和运行。

Liferay Portal
似乎它是Java Portal的第一选择,优点是:漂亮的UI,AJAX以及 JSR 286 Poratl标准,和具体服务器没有绑定,不错的内容管理。

缺点:由于稍微复杂些,性能有点慢,设计上松耦合差,如果你需要整个Portal功能,它还是不错的,但是如果试图定制修剪一些功能组件,就非常困难,Liferay号称从EJB到Spring,由此可见,框架的选择并不能帮助你松耦合,更多是业务设计的松耦合,要从业务角度进行组件模块化设计,而不是从纯技术架构角度进行模块化设计,这两个出发点完全不同。

eXo Portal
eXo将和JBoss门户结合,未来独立发展有些玄乎。

JBoss Portal
它不但可以运行在JBoss 上,也可以运行在Tomcat上,界面直观,文档易懂,性能也不错,但会经常与JBOss自己的产品挂钩,更重要的是,JBOSS自己网站已经更换为magnolia的内容管理系统,为什么他们不用自己的Portal呢?这违背eats its own dog food,自己都不用自己的产品,谁敢用呢?

看来JBoss和eXo强强联合,JBoss-eXo的重点是eXo。

所以,这四种矮个子比较下来,Liferay 和 eXo还是胜出的。

个人点评:其实所谓Portal只是一个诱人的糖果包,试图通过一个Portal产品和标准来解决门户的所有问题,是不切实际的,必然带来Portal软件的复杂性,上述Liferay eXO都号称平台了,哪个平台软件不复杂,复杂容易导致紧耦合,因为开发设计者已经被业务复杂搞得头昏眼花,哪有功夫顾及架构上的松耦合设计呢?

如今Widget的迅速发展,其实一个portlet 就是一个Widget,Widget概念将Portlet从服务器端复杂配置管理转移到浏览器中用JS脚本配置实现,无疑架构思路是正确的,使用Js这样面向界面的DSL语言无疑提高系统松耦合设计,是正确的发展方向。所以,在这个思路下,庞大笨重的Portal大包裹糖果显得失去意义。

Liferay7

环境搭建

准备文件
liferay-portal-tomcat-7.0-ce-ga1-20160331161017956.zip
liferay-portal-src-7.0-ce-ga1-20160331161017956.zip
liferay-plugins-sdk-7.0-ce-ga1-20160331161017956.zip
liferay-ide-eclipse-windows-x64-3.0.0-ga1-201604280251.zip

可以从https://sourceforge.net/projects/lportal/files/下载
如果采用的是JDK7.0及以下的版本,在启动Liferay IDE后会找不到Liferay的相关插件。
注意1:Liferay 7.0的开发需要JDK8的环境。
注意2:Liferay 7.0运行需要的是JDK,而不仅仅是JRE(正常的J2EE软件的运行需要jre就足够)。
不然出现此篇博客的情况:《Liferay7启动报错There is an error in invoking javac.》
注意3:Liferay 7.0的开发SDK不是必须的,属于可选状态。

将以上资源解压在某一个目录里面,最好是根目录,并对上面的文件进行重命名,不然在解压时可能会出错误,说路径太长的情况。

这里写图片描述

传统模式(基于ant或者maven)
传统模式依赖于SDK,和6.2的开发基本上一样。
第一步:进行SDK的目录。找到build.properties文件,将此文件复制一份并重命名为build. username.properties {username}为当前系统的用户名称,我的命名后的文件名为:build.huqiwen.properties,可以打开CMD的控制台查看。

第二步:使用文本编辑器(如notepad++)打开,找到里面的app.server.parent.dir这个变量,将他的值修改为当前的Portal的路径,如我的修改后为:
app.server.parent.dir=I:/liferay7/portal
注意:在windows环境下,路径要将正斜杠修改为反斜杠。

第三步:启动liferay IDE,新建插件工程 New Liferay Plugin Project,如下图所示(如果启动后找不到,请检查当前电脑上使用的是不是JDK8,如果是8以下的JDK会出现找不到的情况):
这里写图片描述

第四步:在上面的向导中输入工程的名称,点击next,选择Liferay MVC,点击下一步,在这里会让选择SDK的目录,选择我们上面输入的SDK解压目录即可。如果这里选择SDK后出现下面的错误:
The app.server.deploy.dir(I:\liferay7\sdk/../bundles/tomcat-8.0.32/webapps) is not valid.

第五步:在创建好的工程里面写相应的代码,完成后使用ant的deploy进行部署即可。

注意:在第一次创建工程的时候会下载大量的jar包,所以需要网络后,看着像卡差不动一样,一般根据网络情况,可能需要5-30分钟左右的时间。

OSGI模块模式(基于Gradle)
Liferay 7.0新增了基于Gradle构建系统的开发,这种是7.0推荐的模式。

第一步:创建liferay Workspace Project,如下图,输入工作区的名称。同一个Eclipse的工作区里面只能创建一个Workspace Project。
这里写图片描述

第二步:点击完成即可,此过程需要下载jar包,速度会比较慢,根据网络情况而定。下载的是gradle的zip包,具体是下载到当前用户目录下面的.gradle目录下面。

注意:如果网络比较慢,可以下载我下载好的目录,然后解压到自己的用户下面的目录里面,一般是在C盘(系统盘),用户–当前系统的登录用户名下面,可以找到一个.gradle的目录,将下面的下载后解压到里面,重新创建Liferay Workspace即可。
百度云分享地址:链接:http://pan.baidu.com/s/1pKFQf71 密码:r5jx

第三步:工作区创建好后如下图所示,如果下面是空的,没有下面的modules、configs等,说明是创建失败了,一般是由于网络问题,可能是gradle的包下载出错引起的。
第四步:在菜单中点击New Liferay Module Project,在Project Template Name那里选择mvcportlet,如果是要创建数据库,选择servicebuilder,其他几种模式是OSGI的开发,后面再说明。
这里写图片描述

第五步:在下一步中输入组件名称和包路径,然后点击完成。此时会在上面工作区里面的modules里面看到我们刚才新建的Portlet插件工程。

第六步:在这个工程里面主要有两个目录,src/main/java和src/main/resource,前面是来放java代码,后面是来放JSP和一些资源文件等。

第七步:写完代码我们现在可以将页面视图切换到Liferay Workspace,默认就已经切换,如果没有进行些切换,在右边找到Gradle Tasks,如下图,找到我们创建的工程,然后点击下面的build,双击里面deploy,将会对我们当前的工程进行打包部署。
这里写图片描述


注意:这里点击deploy正常就应该部署到Liferay tomcat里面,但是此时没有部署到Liferay tomcat里面。需要做如下修改,在上面的工作区里面找到gradle.properties文件,打开在里面添加如下的配置,后面的是liferay Tomcat所在的目录,不然只会将生成的jar包在上面工作区里面的module里面,需要手动的将jar包复制到deploy里面部署。
liferay.workspace.home.dir=I:/liferay7/portal
第八步:如果现在我们要在这个Portlet里面访问Liferay里面的其他API,比如JournalArticle的相关API,需要在上面的portlet工程里面的build.gradle,添加相应的依赖。
在dependencies里面添加:
compile group: “com.liferay”, name: “com.liferay.journal.api”, version: “2.0.0”
这个添加是com.liferay.journal.api的依赖,熟悉maven的一眼就看出来,前面是定义的作用域,第二部署是group,第三部分是name,第四部分是版本号。
现在的IDE有一个问题,为添加依赖后不会自动刷新jar包,需要在项目上点击右键–>gradle–>refresh Gradel Project,执行之后会从远程仓库下载jar包,此时在我们的工程里面就可以使用相应的jar包了。

开发环境的搭建与简单介绍就到这里。

创建部署一个portlet

Liferay 7开发环境的搭建可以参考上一篇博客:《Liferay7.0开发学习(一):开发环境搭建》
第一步:按着上篇博客的内容,搭建好环境:在做Liferay 7的开发时,需要先创建一个Liferay Workspace Project。

第二步:创建Portlet插件工程,选择New Liferay Module Project。如下图所示:
这里写图片描述

在这里我们看到Project Template Name,里面有多个选项,这些选项各是什么意思呢?
1、Activator、service、servicewrapper,这些是OSGI的相关内容,后面找一篇博客单独详细说明。
2、Portlet:创建了个Portlet工程,这里创建的原生Portlet,Portlet类继承自GenericPortlet(这个类是portlet标准提供的),实现的是原生标准。我们一般也不使用,一般在Liferay开始中使用下面的mvcportlet。
3、mvcportlet:这个创建出来的是一个Liferay的Portlet,和上面的区别是Portlet类继承自MVCPortlet,MVCportlet本身继承自LiferayPortlet,LiferayPortlet继承自GenericPortlet。所以mvcportlet这个是Liferay在原生的基础上做一些封装,让我们有些开发更方便。
4、servicebuilder:创建一个数据库服务模块。和之前版本的ServiceBuilder一样。比如我们现在有一个数据库表叫做学生管理,需要有一个学生表,则创建一个servicebuilder,在这里使用xml生成此表的持久化层代码和业务层代码。

第三步:点击一下步,在这里输入我们的Portlet类的名称和包名,如下图
这里写图片描述

第四步:点击finish,完成工程的创建,现在在我们的Liferay Workpace里面的Moudles里面找到我们刚才创建的工程。如下图,src/main/java里面是后台处理类,在resource里面放的是语言国际化文件和对应的JSP。
这里写图片描述

第五步:现在我们做一个操作,从后台传值到JSP,在StudyPortlet里面,我们重写doview类,代码截图如下:
这里写图片描述

在VIEW JSP的代码如下,可以使用java小代码和EL表达式进行取值。
这里写图片描述
第六步:完成之后,在eclipse里面的Gradle Tasks里面点击deploy进行部署。
这里写图片描述

第七步:我们点击了deploy,但是发现其实并没有真正的部署。这个原因在上篇博客里面也说过,默认情况下是打了个jar包在当前工作区下面的bundles\osgi\modules下面生成了相应的jar包,我们可以将此jar包复制到liferay的deploy目录下面进行部署。
自动部署:修改当前worksapce下面的gradle.properties文件,在里面添加
liferay.workspace.home.dir=E:/WorkCode/liferay7/portal
上面的路径为Liferay 7 Portal的路径,注意路径要修改为反斜杠。此时再执行deploy就自动的部署到了Liferay Portal里面。

第八步:进入Liferay 7,使用管理员登录,点击添加–>应用程序–>示例,在这里将我们的portlet拖到界面上。
这里写图片描述
止此一个简单的示例就完成了。

技巧:
我们发现上面这个部署有点小麻烦,改点JSP的内容甚至都需要点击deploy重新进行。
可以在module上面点击右键,Run As–>Run on server–>选择Liferay 7 tomcat,点击完成。这样就实现了一个热部署发布,我们现在修改JSP的内容,修改后刷新页面就可以看到变化。而不再执行Gradle Task的deploy。

错误

Eclipse安装Liferay插件错误

deploy部署错误

Liferay6.2安装

资源准备

以下资源内容可以在Liferay的官方网站下载,1-3在http://www.liferay.com/downloads/liferay-portal/available-releases下载,Liferay IDE在http://www.liferay.com/downloads/liferay-projects/liferay-ide处下载。

1.  liferay-plugins-sdk-6.1.1(Plugins SDK)
2.  liferay-portal-6.1.1-ce-ga2(Bundled with Tomcat)
3.  liferay-portal-src-6.1.1-ce-ga2(Portal Source,可选)
4.  liferay IDE 1.6
5.  Java SDK(开发Java程序当然要安装,请配置好环境变量)

如果是Liferay 6.2.0 6.2.1的请参考:《Liferay 6开发学习(二十三):Liferay 6.2开发环境准备》
如果是使用6.2.5 GA6的版本,请参考文章《Liferay6.2.5GA6开发环境搭建》
请将以上资源解压,推荐在某一个盘下面建立一个Liferay的目录,将IDE、SDK、Liferay-portal-6.1.1-ce-ga2和源码后解压后放到这个目录下面。

配置SDK

打开Liferay IDE,Window–>Preferences–>Liferay–>Installed Plugin SDK,点击右边的Add…按钮,选择Liferay plugins SDK的解压目录,如下图所示,点击OK,完成SDK的配置。

配置Liferay运行环境(以Tomcat为例)

打开Liferay IDE,Window–>Preferences–>Server–>Runtime Environment,点击右边Add…,在弹出的服务器选择里面选择Liferay,Inc–>Liferay v6.1 CE (Tomcat 7),请在“Create a new location server”打上勾。
点击Next,选择liferay-portal-6.1.1-ce-ga2的解压目录,如下图:

点击Finish完成Tomcat的配置;或者点击“Next”,此步骤可以在Liferay source location处选择Liferay的源码,或者跳过,推荐关联一下Liferay的源码,其他的两个可选,点击Finish完成Tomca的配置。

运行Liferay

经过上面的三步,在Liferay IDE(Eclipse 4.2)的下方的server面板处,可以看到Liferay 6.1 CE Server,现在点击运行。稍等片刻,待Tomcat启动完成后,打开浏览器输入http://localhost:8080/,在Liferay第一次运行的时候会出现一个配置向导(此功能为Liferay 6.1开始新增)。

可以在此配置Liferay门户名称、使用语言、管理员的姓名、电子邮件,数据库的连接信息(先在数据库里面建立数据库lportal)等内容。如上图所示,如果出现“数据库连接不能建立。请检查您的连接设置。”请检查数据库是否已经建立,或者数据库名、帐号、密码等信息是否正确。
静心等待Liferay的初始化,可能需要几分钟时间,当Liferay初始化完成后,会自动跳转到配置保存成功的页面。
根据Liferay的提示进行密码设置、密码提示问题设置等,然后跳转到Liferay的主页。

Liferay IDE的其他配置

设置工作区编码
Liferay的开发环境我们需要工程的编码为UTF-8,新安装的Eclipse的默认编码为GBK,修改方式为WindowàPreferencesàGeneralàWorkspace,在这下面的Text file encoding处选择other,UTF-8。点击OK保存。
代码提示、控制台缓冲区的大小
可以参考前面的一篇博客:MyEclipse/Eclipse的一些技巧
中文字体偏小
可以参考之前一篇博客:解决eclipse3.7中文字体小

Liferay的大概使用介绍

在四的基础上,在右上角可以看到有一个访问,点击可以看到有控制面板、我的公共主页、我的个人主页、Liferay(这里显示的是在配置向导处设置的门户名称)。这几个内容是什么意思呢?
控制面板:这个算是liferay的后台管理。
我的公共主页:其他人可以看到的自己的页面内容,一般放置的如个人博客等展示给其他人看的内容。
我的个人主页:个人主页的东西是只有自己可以看到,其他人看不到的,一般放置自己的日程,收集的站点,常用的小工具等等内容,是自己的私有空间。
在控制面板里面主要分为个人信息、站点设置、门户设置、服务器信息等。如果是一般权限的用户只能看到个人信息。一般开发的管理功能的页面均放置在此控制面板处,后面介绍如何将自己开发的Portlet,放置在这里。
现在回到“我的公共页面”或者“我的个人主页”。依次介绍一下顶部左边各按钮的作用。
编辑控制:打上勾之后显示portlet的控制按钮,可以勾上和反选看一下效果。如果勾上仍然没有出现portlet的控制按钮,而说明当前登录的用户没有此portlet的控制权限。
管理:管理里面有页面、页面布局、站点页面、站点内容四个菜单。页面和站点页点功能类似,差别只在于点进去后的默认位置不同;站点内容和后台的控制面板处站点的内容一样。页面布局是调整当前页面使用什么样的布局,如一栏,两栏,三栏等这些内容。
添加:点击添加显示的是可以添加的portlet,默认的只有几个,点击更多,可以看到所有的有权限的portlet(不同的登录用户,根据权限的不同看到的portlet不同)。可以添加一些看看效果。
上页内容只是Liferay的一些大概介绍,不熟悉的可以随便点点,熟悉一下相关内容。

其他

1、可以尝试修改一个Liferay里面的eclipse.ini的里面的JVM内存配置,可以提高eclipse的响应,我将里面的-Xms和-Xmx均调到了768M。

2、可以修改一下Eclipse的代码提示等,参看http://www.huqiwen.com/2012/06/25/some-skill-about-myeclipse-eclipse/

3、Liferay的学习可以多看看Liferay官方网站的文档和WIKI,虽然质量不是很可,但也可以学到不少内容。
http://www.liferay.com/documentation/liferay-portal/6.1/development
http://www.liferay.com/community/wiki

Liferay6.2创建portlet工程

使用Liferay的SDK创建一个简单的Portlet,此Portlet不包括业务逻辑、不包括数据库,只有简单的页面展现,用以说明Portlet的开发过程。

创建Portlet工程

1、打开Liferay IDE,File–>New–>Liferay Project

2、为Portlet工程取名为Study,点击完成。或者点击下一步,默认选择Liferay MVC。
补充说明:
Portlet:这个是一般做Liferay开发选择的项目,一般说Liferay插件工程,通常都是指的Portlet工程。他的结构和内容和普通的WEB工程区别不大。
Hook:Liferay的Hook是什么东西呢?这个单词中文可以翻译成钩子。是用于重写或覆盖Liferay的一些默认方法或页面。为开发提供了一种在不直修改Liferay核心源码的情况下修改Liferay核心功能的方法。
Ext:扩展工程的开发方法是Liferay早期版本推荐的开发方法,在6.x版本之后对ext开发模式逐渐不再推荐,主要使用Portlet的开发方法。扩展开发可以继承Liferay的Portal的大部分接口方法,而Portlet里面可以使用的接口方法均是Services包里面暴露的API。但是和Liferay的核心工程耦合太大,当Liferay的版本升级时对Ext工程的影响太大,基本需要重新修改。所以一般不推荐使用Ext模式。
Layout:布局模板,Liferay的布局是可以定制的,如一个页面中是两栏式还是三栏式,每个栏里面又有几行等等,可以使用此模式进行快速开发。
Theme:主题包。Liferay IDE提供的可以帮助开发人员、设计人员快速开发Liferay主题包的功能,通过此模式提供的向导工具等,为主题包的开发大大的提供了便利。

Portlet部署

Liferay的开发大量依赖Ant(也可以使用maven),在Liferay的开过程中,编译、代码生成、打包、部署等都是基于Ant完成的。
1、Liferay 的IDE在Liferay的portlet开发模式下,ant面板默认是可见的,如果找不到可以通过Window–>Show View–>Ant(如果没有可以在other里面找到)

2、在ant页板里面,点击Add-buildfiles将Build.xml文件添加进来。

3、点击Study-portlet前面的小三角,在出现的下拉菜单里面,双击deploy,等待Liferay完成部署操作。
如果在此时出现如下错误:
Task cannot continue because ECJ is not installed.
ECJ was automatically installed. Please rerun your task.
原因是ECJ包没有找到,ECJ是什么?ECJ, the Eclipse Compiler for Java, is an open source incremental compiler used by the Eclipse JDT. It is an option for Liferay builds and is in many cases faster than Javac or Jikes. The jar for ECJ is included in Liferay release 4.4.0 and later.http://www.liferay.com/community/wiki/-/wiki/Main/ECJ这是官方解释。大概意思是ECJ是一个编译优化包,可以提升比Javac和JIKES更好的编译速度。要想使编译通过,有两个两个方法:
方法一:禁用ECJ。在Liferay的SDK下面找到build.Administrator.properties,此处中间的Administrator名称不一定是这样的,具体体系名称是根据当前系统的用户名生成的。在里面添加如下内容

javac.compiler=modern
#javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

方法二:将ECJ的包添加到ant的路径里面。ecj.jar包可以在Liferay的工程的源码包\lib\development下面找到。将此包添加到ant的路径里面。Windows–>preferences–>Ant–>Runtime,在右边的Classpath–>Ant Home Entries(Default) –>Add External JARs,将ecj包添加进来。

4、启动Tomcat。此portlet工程会自动部署。

5、打开http://localhost:8080/,登录系统。点击左上角的添加–>更多–>示例,在这里面可以看到我们刚建立的study portlet,点击添加,可以将此portlet添加到页面上。

Portlet工程结构

一个Portlet工程的大概结构如下:

1、src:这里存储Java相关文件包,后面会看到还有一个services包。

2、web.xml:此web.xml和普通的web工程的web.xml文件一样。

3、build.xml,此文件为ant的构建文件,一般不需要修改继承自SDK。

4、Liferay-plugin-package.properties,此文件为包工程的元数据信息文件,一般开发不需要关注。

5、portlet.xml:portlet定义描述文件,这个文件是标准的portlet 2.0(JSR 268)规范的文件。在这里定义的信息为portlet的名称、初始化参数、模式类型、portlet的相关信息、权限等。在此文件里面我们可以看到view-template对应的的是/view.jsp,当我们在Liferay里面添加此portlet后,看到的页面内容就是view.jsp里面的内容。下面的security-rol-ref定义的是哪些角色拥有此portlet的权限。

6、Liferay-portlet.xml:此文件是liferay扩展的portlet的内容,portlet.xml文件里面是标准的Portlet内容,所有的Portal容器的portlet.xml文件描述、结构都是一样的。但liferay基于自身平台的需求,又添加了一个Liferay-portlet.xml来扩展portlet的信息。在这里可以看到角色映射,以及Liferay的一些个性化信息,后面有需要的时候详细说明。

7、liferay-display.xml:在上一个步骤里面我们在添加portlet的时候,看到study这个portlet是位于示例这个目录下面的,此文件就是定义相关的portlet是放置在哪个目录下面显示的。
说明:

在Liferay里面,portlet的名称一般不要重复,portlet.xml,liferay-portlet.xml,lifray-display.xml这三个文件之间的关联就是通过portlet 名称做标识进行关联。

Service Builder

什么是Service Builder?

Service Builder是Liferay IDE(SDK)提供的一种代码生成方案,开发人员只需要编辑一个数据库的实体描述文件,即可根据本XML文件生成Spring层代码、Hibernate层代码、SQL、SQL索引创建文件、Spring和hibernate的配置文件等,可以大提高开发人员的效率。简单说就是根据数据库描述文件,生成service层和持久化层的代码,开发人员只需要关注控制层即可。

Service Builder的使用

1、首先需要有一个Portlet的插件工程,创建方法,参考http://www.huqiwen.com/2012/09/01/liferay-6-1-development-studey-2-create-portlet-project/

2、打开Liferay IDE,点击工具栏中Liferay工具的中间按钮,New Liferay Service Builder,弹出的向导如下,填写相关信息,点击完成。

Plugin Project:将用于哪个工程,如果有多个工程,请看仔细。
Service file:数据库描述文件的文件名,使用向导不可更改(可以手动改,后面详述)
Package path:包名路径,这里是定义基础的包名路径,建议一般规则为:公司域名+portlet+功能模块名
Namespace:命名空间,如果没有指定数据库的表名,则会在前面添加上此命名空间。
Author:作者名,默认读取系统变量。

Include sample entiry in new file:在自动生成的xml文件中是否包含示例,如果是新手,建议打勾。
3、编辑service.xml文件。在liferay IDE里面提供了service的开视化编辑。简单介绍一下主要属性的含义。

Name:实例名称,就是通常的JavaBean的名称。
Local Service:本地服务,一般选中。
Remote Service:远程服务,用于为生成Web Service做支持,如果不需要不要选中。
Human Name:人性化名称。一般留空即可,此处的名字用于生成文档时使用,如果留空使用Name。
Table:数据库名称,如果不填写,使用Name。
Uuid:是否生成一个uuid的字段,具体的根据数据库设计情况而定。可以使用也可以不使用。推荐使用。
Uuid accessor:是否使用uuid存取实体,根据情况而定。可以使用也可以不使用。推荐使用。
Persistence Class:持久化类的名称,推荐留空,让自动生成。
Data source:数据源,一般留空。。
Session Factory:数据库会话工厂,一般留空。
TX Manager:事务管理,一般留空。
Cache enabled:开启缓存,推荐选中。
JSON enabled:开启JSON,生成的代码中包含实体的JSON序列化和反序列化,根据情况而定。如果不使用JSON,请不要勾选。

4、在Columns里面添加字段,填写字段名称,类型等。如果要使用特殊的数据库名称,或者字段有其他需求,请点开Columns,在下面逐个字段上修改。Db Name对应的为数据库的字段名称,其他一般留空即可。

5、Order,查询结果根据哪个字段排序列。

6、Finders:查询方法。service builder默认会生成基本的增删改查方法,如果有一些根据字段查询某些数据,返回的可以是一个实体也可以是一个List。

<finder name="userId" return-type="user">
      <finder-column name="userId" />
 </finder>

这个的意思是生成一个方法叫findyByUserId的方法,传入的参数是userId,返回的类型是User。(这个例子只是为说明,一般如果userId是主键,service builder生成的方法里面,不写此finder,已经包含此方法)
finder-column这里可以填写多个参数,return-type,如果是Collection则返回类型是List。
Finders方法,可以根据实际情况进行填写,对于使用finders仍不能满足的方法,后面详解。

7、点击ant里面servicer-builder按钮,等待Liferay进行代码生成。或者将可视化编辑器切换到Diagram,点击右键,service builder。

Service Builder生成代码的使用。

如果是第一次使用Service Builder,请按如下步骤操作。
1、WEB-INF目录下面找到service目录,点击右键Build Path–>Use as Source Folder。service包里面主要包括生成的代码里面的接口方法,方便我们进行跨工程的代码调用。src里面都 实现包。

2、Service Builder的使用,一般有两种方法。一种是获取一个Service。
CmsArticleLocalService cmsArticleServie = CmsArticleLocalServiceUtil.getService();
然后使用此xxService调用相关方法
一种是直接使用xxLocalServiceUtil调用相关方法。大部分情况下使用xxLocalServiceUtil进行方法调用。

3、创建一个modle实例一般使用如,xxLocalServiceUtil.createXX()方法。

自定义方法

虽然liferay自动生成的代码里面包含了常用方法,足以应付一般场景,但是有些特殊场景需要一些特殊的方法,如何添加自定义方法呢?

1、找到src下面和此service builder相关的的xxx.service.impl包,找到xxxLocalServiceImpl的文件,打开在此类里添加相关的自定义方法。

2、如果是要为modle添加自定义方法,请在xxx.modle.impl包里面的,xxImpl文件里面添加自定义方法。

3、修改完成后,再次执行Service Builder,会将这些方法自动的添加到其他相关接口、类里面。Liferay的Service Builder方法一般只允许修改上述两个类,其他的类一般不要修改,因为修改后如果再次执行service builder会被覆盖掉。

修改字段长度

Liferay自动生成的代,如String字段,默认长度是75。如果有特殊的需求,可以在src/META-INF/portlet-model-hints.xml里面修改相应的字段映射长度。找到相应的实体,字段,如下:

<field name="InfoId" type="String" >
    <hint name="max-length">300</hint>
</field>

这样就可以将InfoId的数据库字段长度定义为300。修改完成重新执行service-builder进行文件生成。

其他技巧

1、一个service.xml文件里面可以有多个实体名。

2、如果要建立多个service.xml文件,可以在WEB-IN目录下面建立一个文件夹,比如叫service-builder用来存储service.xml文件,不同的service.xml执行不同的命名,如User-Service.xml等。手动建立,不必使用向导。

3、如果按照步骤2操作,有多个service.xml文件,则不能执行ant里面的service-builder文件,因为ant只会寻找web-inf目录下面的services.xml文件。所以要在xx-service.xml文件里面切换到Diagram编辑模式,点击右键,build Service,这样会对当前XML文件进行构建。

4、即使使用了2、3的方法,也不要删除web-inf目录下面的service.xml文件,可以保留一份,不然最终部署后的web.xml描述文件里会少生成一些内容,导致插件工程不能正常运行。

5、同一个插件工程中,不同的xx-services.xml文件必须使用不同的包名,一个services.xml里面可以有多个实体,但不同的services.xml里面必须使用不同的包名,否则会导致生成的的spring配置文件出现覆盖情况。

资源国际化

Portlet属性的国际化

在前面创建的Portlet的时候,portlet的名称等都是英文的,在添加portlet的时候,显示的也是英文的,如何将这些信息显示成中文呢?如将下面Study显示成中文。

1、检查portelt.xml的XML文件中的此portlet的信息,是否包含下面的代码,这个是关键,如果没有手动的添加到portlet-info标签的上面。如查在portlet的创建向导里面勾选了“Create resource bundle file”,则会自动生成。

<resource-bundle>content/Language</resource-bundle>

2、工程的src目录下面找到content包,如果没有则创建,如果有则打开。在里面新建Language_zh_CN.properties文件,我们的portlet中文信息写在此文件里面。

3、在此文件中写入“javax.portlet.title=此处写相应的标题文字”,可以直接写中文,eclipse的properties编辑器,会自动的转换成unicode代码。一般我们只写title就可以,如果有特别需求,可以加上javax.portlet.keywords,javax.portlet.short-title等信息。

4、现在重新打包部署此工程,再次添加portlet,即可看到portlet的名称变成了中文。
注意:content/Language这里的内容定义了,我们存放语言文件的目录在content目录下面的Language文件,这里也可以定义成自己喜欢的,只要按照此规则即可。

内容的国际化

上面的国际化是portlet属性信息的国际化,如果是我们想在代码中使用这些国际化信息呢?比如提示语、按钮名称等等。这个地方的方法就和普通的java代码的国际化一样,在上面的语言文件中写入相应的key,在代码中读取即可。
1、如我们要将“参数名称”这个词国际化,则在Language_zh_CN.properties中写入:
propertyName=\u53c2\u6570\u540d\u79f0
后面的是参数名称的unicode码,我们在编辑器中直接写入中文,编辑器会自动转换,如果不能转换可以使用JDK的命令如:
native2ascii -encoding UTF-8 Language_zh_CN.properties.native Language_zh_CN.properties
进行中文编码的转换。

2、在代码中调用:
JSP中:LanguageUtil.get(pageContext,”propertyName”)
JAVA代码中:LanguageUtil.get(portletRequest.getLocale(), “propertyName”)。其中的第一个参数为Local,也可以使用Locale.CHINESE

Liferay Portlet属性国际化的修改

在一中提到的portlet属性的国际化存在一个问题,也就是我们一个语言文件中只能定义一个portlet的属性信息,如果我们在一个插件工程中需要国际化多个portlet的属性信息怎么办?在Liferay的官方论坛、Wiki里面也有不少人讨论此问题,但Liferay的解释就是不支持!在一个资源文件里面只能写一个portlet的属性信息。
个人觉得这一点非常不好,如我的一个插件工程中有十几个portlet,那么难道需要定义十几个语言资源文件或者拆分成十几个Portlet?如果支持下面这样:
javax.portlet.title.MyPortletTitle = My Portlet Title
如果是这样的才是很合理的,Liferay平台里面的Portlet的信息就是这样的形式国际化的,但是插件里面不支持。Liferay平台本身是使用的Strtus resource bundle,所以和我们的不太一样。
既然官方不支持,我们就自己动手改造了,好在Liferay是开源的,我们修改他的源码自己实现就可以了。
方法如下:

1、参考上一篇文章,http://www.huqiwen.com/2012/09/21/liferay-6-1-development-study-5-compile-debug-deploy/,如果编译部署关联Liferay的源码

2、在源码里面找到PortletResourceBundle.java这个类(小提示:可以在eclipse中使用快捷键ctrl+shift+r来快速定位此文件)。找到其中的handleGetObject方法,修改成如下,下面有注释,显示了哪里修改的:

@Override
 protected Object handleGetObject(String key) {
 if (key == null) {
 throw new NullPointerException();
 }
String value = null;

 if (parent != null) {
 try {
 value = parent.getString(key);
 }
 catch (MissingResourceException mre) {
 //hqw 2012.09.09 add begin
 String titlekey = key.concat(StringPool.PERIOD).concat(_portletInfo.getTitle());
 if (Validator.isNotNull(titlekey)) {
 titlekey = titlekey.toLowerCase();
 }
 try {
 value = parent.getString(titlekey);
 } catch (MissingResourceException mre2) {
 }
 //end
 }
 }
if ((value == null) || (value == ResourceBundleUtil.NULL_VALUE)) {
 value = _getJavaxPortletString(key);
 }
if ((value == null) && ResourceBundleThreadLocal.isReplace()) {
 value = ResourceBundleUtil.NULL_VALUE;
 }
return value;
 }

在我debug时,发现liferay只是通过javax.portlet.tiltle这个key值寻找,那我们在给他加上具体的title值就可以了。现在修改后的不但兼容他原来的,而且又支持javax.portlet.title.MyPortletTitle = My Portlet Title。这样的多好
3、现在使用ant进行deploy源码,再次启动tomcat就发现,现在的国际化已经支持我们需要的形式了。

6.数据库修改
修改[liferay-home]/目录,新建文件夹portal-ext.properties,因为该文件的优先级高于默认配置文件,会覆盖原文件中Liferay与HQL链接。文件内容:

#
# MySQL

#
jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://localhost/lportal?
useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=你的用户名
jdbc.default.password=你的密码

MVC Portlet Demo

后台接收参数

新建一个Portlet,命名login
修改代码如下:

public class LoginPortlet extends MVCPortlet {

    @Override
    public void processAction(ActionRequest actionRequest,
            ActionResponse actionResponse) throws IOException, PortletException {
        String value = actionRequest.getParameter("test");

        String test2 = ParamUtil.getString(actionRequest, "test");

        System.out.println(test2 + "------------value:" + value);

    }


    @Override
    public void doView(RenderRequest renderRequest,
            RenderResponse renderResponse) throws IOException, PortletException {
        String value = renderRequest.getParameter("test");

        System.out.println("---------------->:" + value);
        PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher("/html/login/view.jsp");
        dispatcher.include(renderRequest, renderResponse);
    }

}

view的内容:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<form action="<portlet:actionURL/>test" name="<portlet:namespace/>" method="post">
    <table>
        <tr>
            <td>测试参数:</td>
        </tr>
        <tr>
            <td><input type="text" name="<portlet:namespace/>" id="test" value="test1111"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>

与Jetspeed的区别是:Jetspeed不需要命名空间
7.2URL地址跳转
从一个JSP页面导航到另外一个JSP页面:重定向

<portlet:renderURL var="linkToPage">
 <portlet:param name="mvcPath" value="/html/jsp/page1.jsp">
</portlet:renderURL>
<portlet:renderURL  var="linkToJspPageTwo">
<portlet:param name="jspPage" value="/html/jsps/page2.jsp"/>
</portlet:renderURL>

跳转的方式:

<portlet:actionURL var="portletActionURL" name="addEmployee">
</portlet:actionURL>
<portlet:actionURL var="portletActionURL">
<portlet:param name="javax.portlet.action" value="addEmployee"/>
</portlet:actionURL>
<portlet:actionURL var="portletActionURL">
<portlet:param name="<%=ActionRequest.ACTION_NAME%>" value="addEmployee"/>
</portlet:actionURL>

参数:

<portlet:renderURL  var="portletRenerURL">
<portlet:param name="employeeName" value="Meera Prince"/>
</portlet:renderURL>

Emplyee Name: <%=renderRequest.getParameter("employeeName")%><br/>

8.研究Liferay总结
8.1常见架构
通过Liferay统一登陆界面来衔接各业务系统

Liferay的门户网站:
http://pingguw.com/web/guest/index

http://www.liferaychina.com/

需要的步骤:
1、自定义Liferay首页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值