Portlet API参考实现的秘密(转载)

概要
?在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。

按此在新窗口浏览图片screen.width-430)this.width=screen.width-430" align=center border=0>
?
图一: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对象,他由一个交织在一起的接口集合组成。因此,不能把他和容器服务分开来考虑。
?
按此在新窗口浏览图片screen.width-430)this.width=screen.width-430" align=center border=0>

图二: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文件的入口点。
?
按此在新窗口浏览图片screen.width-430)this.width=screen.width-430" align=center border=0>

图三: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服务器页面(jsp)JavaServer?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="false"?%>
<%@?page?import="javax.portlet.*"%>
<%@?page?import="java.util.*"%>
<%@?taglib?uri='/WEB-INF/tld/portlet.tld'?prefix='portlet'%>


Hello,

I?am?the?bookmark?portlet.



Current?Portlet?Mode:?<%=portletRequest.getPortletMode()%>

Current?Window?State:?<%=portletRequest.getWindowState()%>



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

按此在新窗口浏览图片screen.width-430)this.width=screen.width-430" align=center border=0>
?
?Bookmark?portlet版本四的界面

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值