LifeRAY,liferay技术过时了
我看了Liferay好几天了,所以我分析了Liferay的用户服务代码,因为它需要与其他系统集成。从它的用户服务代码中,我们可以看到Liferay的一些主要设计思想,为以后分析他的架构设计做准备。
点击此处下载lifera 5 . 1 . 1源代码。
NetBeans IDE 6.1
Liferay5.1.1是用NetBeans构建的Ant项目,源代码包解压后可以直接在NetBeans中打开。工程视图如下:
首先简单介绍一下源代码目录(不包括测试目录)。
门户-实施
它包含了所有的服务实现代码,比如基本的用户管理、邮件服务和内容管理(CMS,JSR170)。
门户服务
包括portal-impl的所有服务接口。
门户内核
包括门户/Portlet规范实现(JSR
68/268),以及基础框架管理(Struts,Spring),
有部署、配置、搜索、web服务和持久性的基本实现。
支持-glassfish/tomcat
gsf/tomcat容器支持的实现
实用桥梁
支持一些框架/语言写Portlet。目前,我们可以使用以下语言/框架来编写Portlet:
豆
脚本框架(BSF)
绝妙的
java描述语言
联合打击战斗机
JSP
服务器端编程语言(Professional Hypertext Preprocessor的缩写)
计算机编程语言
红宝石
支杆
网络无障碍倡议
util-java/taglib
Liferay使用的基本工具和标签库的实现
用户分析
目前Liferay项目使用Struts1.2.x
Spring 2.0是作为基本框架编写的。其架构设计思路清晰,是不可多得的学习设计的范例。接下来进入本文——用户服务分析专题。
展开目录portal-service下的源码包com.liferay.portal.service,可以看到* * ****Service的一系列接口。当我们发现什么与用户相关时,我们可以绘制以下依赖图:
从上面两个接口来看,Liferay在用户服务的设计上和EJB3.x是一致的,分为本地接口和远程接口,从代码的注释中也可以得到。在liferay的当前版本(5.1.1)中,图右侧的远程接口中的服务被正确处理并委托给图左侧的本地实现。其他要点请参考图中的说明部分。
用户服务扩展
这与其说是“扩展”,不如说是“修改”。
当门户与其他系统集成时,第一个难题就是用户管理的问题。这里说的用户管理可以简单分为两种:身份认证和账号管理。对于有关认证的问题,您可以使用CAS(Central
认证服务)来实现SSO(单
签到/退),可以参考这里和这里。账户管理是目前最头疼的问题。具体问题描述如下:
例如,如果管理员在门户Liferay中建立了一个帐户,其他系统也应该建立用户帐户;如果用户修改了门户中的密码,该用户在其他系统中的账户密码也要相应修改,否则无效。
溶液分析
结合前面的用户服务分析类图,可以得出以下两种方案:
解决方案1
继承UserLocalServiceImpl类,添加我们需要的函数。
优点:Liferay以后更新了代码,不会影响我们需要的功能,基本没有代码合并的成本。
缺点:要修改Spring的配置文件,UserLocalServiceImpl
Bean的引用被更改为我们的实现Bean配置。
解决方案2
直接修改UserLocalServiceImpl类代码,把需要的功能委托给我们实现。
优点:不需要修改Spring配置文件。
缺点:Liferay以后更新了代码,有一定的代码合并成本。
综上所述,权衡下来。我认为使用溶液
2。因为我认为为将来的升级修改当前代码的合并成本要小于修改配置文件的成本。所以,更多的是“修改”而不是“扩充”
: )
以添加用户为例:
打开com . lifeseray . portal . service . impl . userlocalserviceimpl类,找到addUser方法,并在该方法的末尾添加我们的实现委托:
//unusingspringDI,now,justforsimple。//by88250,Aug29,2008 newsubsystemuserserviceimpl()。registerUser(名字,姓氏,电子邮件地址,昵称,密码1);
这里没有用到Spring的DI,只是为了简单,没有修改配置文件。以后可能会用到Spring。
迪.
下面是我们需要的服务的实现:
/* *要更改模板,选择工具模板*并在编辑器中打开模板. */package com。金fonet。开发商。门户网站。服务。impl导入com。liferay。门户网站。门户异常;导入com。liferay。门户网站。安全。pwd。pwdencryptor导入Java。io。io异常;导入Java。SQL。连接;导入Java。SQL。司机经理;导入Java。SQL。结果集;导入Java。SQL。SQL异常;导入Java。SQL。声明;导入Java。util。伐木。水平;导入Java。util。伐木。记录者;导入组织。阿帕奇。公地。http客户端。http客户端;导入组织。阿帕奇。公地。http客户端。http异常;导入组织。阿帕奇。公地。http客户端。名称值对;导入组织。阿帕奇。公地。http客户端。方法。post方法;导入组织。阿帕奇。公地。伐木。日志;导入组织。阿帕奇。公地。伐木。原木工厂;/* * * Subsystemuserserviceutility .目前,这个类主要用于* updatecoherenceofuseraccountstedinsome子系统(scarab,svn,*和等)。).* @作者88250 DL88250@gmail.com * @版本1。0 .0 .2,Sep2,2008 */publiclasssubsystemuserserviceimpl {//TODOplacesallpropertiesinaconfigurationfile,无硬编码codingprivatefinaltringdriver= com。MySQL。JDBC。驱动程序;privatefinalStringdbURL= JDBC:MySQL://192。168 .128 .122:3306/圣甲虫;privatefinalStringdbUserName= root ;privatefinalStringdbUserPwd= sa ;privateConnectioncon=nullprivateststaticglog=日志工厂。获取日志(subsystemuserserviceimpl。类);privatefinalStringREGISTER _ URL= http://Daniel-desktop:9090/scarab/issues/template/auto register ;/* * *默认构造函数. * @抛出com。liferay。门户网站。portal exception */publicSubsystemUserServiceImpl()throwsPortalException { try { class。对于名称(驱动程序));} catch(ClassNotFoundExceptionex){ log。误差(ex);thrownewPortalException(ex);} }/* * *更改用户的spa swordinal所有子系统.* @ param userName userName * @ paramnewPwdthenewpassword(cleartext)* @ throwsPortalException */publicfoidchangepassword(string userName,StringnewPwd)throwsPortalException { update password(userName,new pwd);}/* * *注册新用户所有子系统.* @ param first name first name * @ param lastName last name * @ paramemailAddressemailadress * @ param screenname username * @ param password user password * @ throwsPortalException */publicfoidregisteruser(string first name,StringemailAddress,StringscreenName,string password)throwsPortalException { addUser(first name,last name,emailAddress,screen name,password);} privatevoidaddUser(string first name,StringlastName,StringemailAddress,StringscreenName,string password)throwsPortalException { httpclienttthttpclient=newHttpClient();PostMethodregisterMethod=newPostMethod(REGISTER _ URL);name value pair[]data={ newname value pair( firstName ,first name),newNameValuePair(lastName ,lastName),newNameValuePair(email ,emailAddress),newNameValuePair(userName ,screenName),newNameValuePair(password ,password),};registerMethod.setRequestBody(数据);请尝试{ int status=http客户端。执行方法(注册方法);日志。信息( autoregisterforsubsystemscarabsucsuccessfully!);} catch(IOExceptionex){ logger。获取记录器(subsystemuserserviceimpl。班级。getname()).日志(级别。严重,空,例如);日志。错误( AutoregisterforsubsystemScarabfaild!,ex);注册方法。释放连接();} } privatevidupdatepassword(string username,StringnewPwd)throwsPortalException { stringnewpwdchemper=pwdencryptor。加密(新密码);//SHAcryptalgorithmtry { con=驱动程序管理器。获取连接(dbURL,dbUserName,dbuser pwd);语句mt=con . create语句(ResultSet .TYPE_SCROLL_INSENSITIVE,ResultSet .CONCUR _可更新);SMT。执行update( update turbine _ USERSETPASSWORD _ VALUE= newPwdCipherText 其中log in _ NAME= userName );SMT。close();con . close();} catch(sqlexception ex){ log。错误( ScarabDatabasemodifyfailed:,ex);thrownewPortalException(ex);生活是一个设计很优秀的门户网站,他有很多设计思路、代码实现是我们值得学习、借鉴的地方。关于用户服务这一块我们就分析到此,在后续的篇章中我将给大家带来更精彩的救生筏代码分析,定制出适合我们自己的门户系统!请大家继续关注我的博客哦:http://blog.csdn.net/DL88250
: )
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。