选择显示字体大小

portlet api参考实现的秘密

译者:holexp

概要
    在stefan hepper和stephan hesmer的portlet系列文章的第二部分中,作者把着笔点从portlet api的基础概要介绍转移到了portlet api的参考实现(ri reference implementation也就是pluto)的细节描述。作者还提供了一系列portlet的实例来说明怎样扩展portlet api的标准函数。
企业portal提供商使用可插的用户接口组件(portlets)向信息系统提供表示层。不幸的是,以前的提供商都只定义了自己的portlet api,在整个行业之中互不相容。为了标准化整个行业进程,java团体发布了java规范要求(jsr)168:portlet规范。
    这篇系列文章的第一部分介绍了jsp 168的细节。第二部分重点放在portlet api的参考实现(ri)上,也就是pluto。此外还提供了一个portlet的实例,读者可以通过这个实例来学习。
    文章第一节描述了ri的体系结构,包括portlet容器的可拆卸性的概念和怎样在其他项目中重用portlet容器。第二节介绍了ri的安装和使用,以及怎样快速配置portlet。其中文章还包括一个逐步深入的实例。
注意:你可以通过文章之后的资源链接下载原代码

pluto的体系结构
    让我们先来看一下pluto的体系结构和一些基本的概念。我们先简要的说明portal的参考实现和portlet容器在整个portal体系结构中的位置。接下来我们在细节方面研究pluto的体系结构。最后,我们看一下在portlet容器里很有趣的:portlet 展开。

关于portal
       pluto一般用来演示portlet api如何工作以及向开发者提供一个测试portlets的实例平台。然而,如果没有驱动来运行和测试portlet容器有点麻烦。pluto的简单portal组件只是架构于portlet容器,它只满足了jsr 168的基本要求。(相比之下,apache的开源项目jetspeed就要专业的多。jetspeed将着重中在了portal本身而非portlet容器之上,并且更多的考虑了其他团体的需求。)
    图一描述了portal的基本体系结构。portal的网络应用程序处理客户端请求,从用户的当前页面得到portlets,之后调用portlet容器以获得每个portlet的内容。portal使用portlet 容器的 invoker api来访问 portlet容器,从 portal看来,portlet 容器的主要接口是支持基于请求的方法调用 portlets。容器用户要想获得portal的相关信息则必须实现portlet容器的provider spi (service provider interface)的callback接口。最终,portlet容器通过portlet api调用所有portlet。



图一:pluto中的一个简单的portal的结构

portlet容器
    
     portlet容器是portlet的运行环境,也是每个portal的组成核心。它需要有关portal本身的信息,且它必须重用自身的公共代码。因此,portlet容器和其他portal组件是完全分离的。这就是说,你可以将独立的portlet容器嵌入任意的portal,只要你满足portlet容器的条件,比方说实现所有的spi。
portlet容器的 invoker api,或者叫入口点,扮演了portlet容器的主调用接口的角色。portlet容器的invoker api将portlet容器的生存周期(init,destroy)和基于请求的调用方法(initpage(),performtitle(),portletservice()等等)结合了起来。因为portlet容器最后调用portlet的方法名有点类似portlet api的主portlet接口,不同的是是否必须要传递portlet定义符。正是因为这个附加的portlet定义符,portlet容器才能正确的调用portlet。
    除了要用api访问portlet容器之外,portal还必须扩展portlet容器定义的spi。因此,ri引入了容器服务:在容器注册过的可拆卸组件提供基础功能并且可扩充。ri包含如下一些容器内的自建服务(前四个必须在运行portlet容器时实现,最后一个是可选的):
             信息提供器:给portlet容器提供portal和portal框架的信息。通过这个接口来获得信息和存储portal信息。这些信息包括导航栏里的url、portlet上下文、portlet模式和窗口状态控制。
        工厂管理器:定义了怎么怎样通过工厂方法来获得一个具体实现。(一个标准的portal应该已经存在一个实现。)
        日志服务:定义了一个日志工具(一个标准的portal应该已经存在一个实现)。
        配置服务:定义了怎么样获得配置参数(一个标准的portal应该已经存在一个实现)。
        属性管理器(可选):属性管理器接口的实现允许处理jsr168规范中定义的属性。
严格的说,portlet对象模型也是spi中的一部分,只是它在spi中占有一个特殊的地位。portlet对象模型处理所有的potlet对象,他由一个交织在一起的接口集合组成。因此,不能把他和容器服务分开来考虑。



图二:portlet容器结构

portlet的部署

   portlet 容器 架构在servlet容器之上并且增强了它的功能。为了实现它,portlet 容器将原始servlet 加入每一个portlet应用程序的war文件中,这一点我们在图三3中有所描述。部署portlet组件时,先取得原始的war文件,然后向其中加入一个新的或者修改原有的web.xml,并且加入一个servlet作为一个调用点来包装每个portlet。之后, portlet的部署器(?这个原文是then the portlet deployment passes the modified war file to the application server deployment)会传递一个修改过的war文件到应用服务器,将其部署到应用服务器系统。在portlet的调用过程中,portlet容器调用添加进去的servlet,作为部署portlet的war文件的入口点。



图三:ri中portlet的部署

pluto和wsrp标准

   正像第一部分所描述的那样,jsr 168与远程portlet网络服务(the web services for remote portlets (wsrp))标准紧密结合。几乎同时形成的这两种标准发布了开源实现,实现了在各自的规范中描述必要的功能。作为共有的目标,两种标准努力能够在一起更好的合作。现在,portlet容器可以很好的运行wsrp portlet。
pluto可以在一个portal中运行多个portlet容器。从而pluto的portlet容器可以被初始化多次。更重要的是,可以用不同的方式来初始化它。每一个portlet容器可以使用spi的不同实现。

ri的安装

   你会发现pluto的安装过程非常简单。执行install命令,build目录/build下的install.bat或者install.sh。接下来安装程序会提示你指定tomcat的安装目录。(注意:在ms windows下文件分隔符不是反斜杠。)
在这之后,安装进程会创建ri和所有portlet,安装portlet到指定的tomcat目录。安装完成后请查看文档以确定完成了所有必要的手工设置工作。
现在可以启动tomcat,通过http://localhost:8080/pluto/portal来访问ri了。
就是这么简单!

怎样部署portlet
        
      在pluto中部署portlet和它的安装一样的简单。只要记住你必须首先安装了pluto,它正确的设置了preparerun.properties。这是部署过程所必须的。在命令提示符下转到build目录,输入命令deployportlet.bat , 用portlet war文件做参数,比如:
deployportlet.bat c:\pluto\portlets\bookmark_04\driver\bookmark_04.war

portlet实例
     我们来看一个portlet的例子,bookmark。它充分利用了portlet api并且阐明了我们学到的概念。我们以一个简单的例子开始,我们在每一节一步步扩展这个bookmark portlet,最后我们将几乎用到所有的portlet api,把它做成一个高级的portlet。
bookmark portlet:版本一
第一个bookmark portlet用到了portlet api中如下的一些特性:
        portlet api 接口the portlet api interface
        java服务器页面(jspjavaserver pages (jsp) pages
        portlet api标签库the portlet api tag libraries
        部署描述符deployment descriptors
第一个bookmark portlet的两个jsp页面分别显示和编辑模式。每个jsp页面只是简单的显示了portlet的当前portlet模式和windwos状态。为了显示这些信息,我们用到了portlet api标签库(只是部分程序代码,请下载全部代码,不然很难理解:译者注):

public void doview (renderrequest request,
renderresponse response) throws portletexception, ioexception {
        response.setcontenttype("text/html");        
        string jspname = getportletconfig().getinitparameter("jspview");
portletrequestdispatcher rd =
                getportletcontext().getrequestdispatcher(jspname);
        rd.include(request,response);
    }

接下来的代码是例子中的一个简单的jsp 页面(即view.jsp:译者注):
<%@ page session=&quot;false&quot; %>
<%@ page import=&quot;javax.portlet.*&quot;%>
<%@ page import=&quot;java.util.*&quot;%>
<%@ taglib uri=&#39;/web-inf/tld/portlet.tld&#39; prefix=&#39;portlet&#39;%>
<portlet:defineobjects/>

hello,<br>
i am the bookmark portlet.<br>
<br>
current portlet mode: <%=portletrequest.getportletmode()%><br>
current window state: <%=portletrequest.getwindowstate()%><br>
<br>

bookmark portlet:版本二
        第二个bookmark portlet进一步深入了portlet api 的概念。除了第一例子所使用到的portlet api 特性,它增加了:
&#61548;        动作处理action handling
&#61548;        portlet 参数 portlet preferences
&#61548;        验证参数 a preferences validator
&#61548;        在部署描述符中预定义参数 predefined preferences in the deployment descriptor
在第二个bookmark例子里,两个新的jsp页面替代了版本一中的。首先,edit.jsp允许通过portlet动作添加和删除书签。在这个jsp页面中输入的书签将作为portlet参数存放。其次,view.jsp 以超链接显示出作为portlet参数存放的书签。
bookmark portlet:版本三
        新增用到的特性:
&#61548;        地区性部署描述符 localizable deployment descriptor
&#61548;        资源包resourcebundles
现在部署描述符和jsp页面从资源包里(resourcebundles)获得可显示的字符集,他们都可以支持英文和德文了。
bookmark portlet:版本四
        最终的这个portlet例子通过portlet api传递递交参量(render parameters)示范了导航的概念(the navigational state concept )。在版本四里有七个书签,但默认一页只显示四个,如图四所示。通过点击next和back的超链接,用户可以导航到向前或者向后的五个书签。初始点将被初始化为递交参量,使得用户可以使用浏览器的刷新、后退和前进按钮。



bookmark portlet版本四的界面

portlet复习
  
   象你所看到的那样,portlet规范的参考实现包括两个部分:portal和portlet容器。portal作为一个简单的运行portlet容器的测试驱动。portlet容器作为一个能迅速使用到其他portal(比如jetspeed)里的普通组件。
    这个portlet实例用到了许多portlet api里的很重要的概念。你可以用所有portlet api和servlet api的特性来扩展这个实例。比方说你可以用一个servlet在新窗口中输出其他有用的信息,如一个打印预览。还可以通过http会话与portlet进行交互。实际上,因为portlet是一个强大的技术,能用他实现的功能是无穷无尽的。




 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons