Portlet API参考实现的秘密
2006-12-14 17:58
309 查看
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。
IMG upload/forum/2003114165017.jpg[/IMG]
图一: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对象,他由一个交织在一起的接口集合组成。因此,不能把他和容器服务分开来考虑。
IMG upload/forum/2003114165335.jpg[/IMG]
图二: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文件的入口点。
IMG upload/forum/2003114165353.jpg[/IMG]
图三: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标签库(只是部分程序代码,请下载全部代码,不然很难理解:译者注):
接下来的代码是例子中的一个简单的JSP 页面(即view.jsp:译者注):
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的超链接,用户可以导航到向前或者向后的五个书签。初始点将被初始化为递交参量,使得用户可以使用浏览器的刷新、后退和前进按钮。
IMG upload/forum/2003114165559.jpg[/IMG]
Bookmark portlet版本四的界面
Portlet复习
象你所看到的那样,portlet规范的参考实现包括两个部分:portal和portlet容器。Portal作为一个简单的运行portlet容器的测试驱动。Portlet容器作为一个能迅速使用到其他portal(比如jetspeed)里的普通组件。
这个portlet实例用到了许多portlet API里的很重要的概念。你可以用所有portlet API和servlet API的特性来扩展这个实例。比方说你可以用一个servlet在新窗口中输出其他有用的信息,如一个打印预览。还可以通过Http会话与portlet进行交互。实际上,因为portlet是一个强大的技术,能用他实现的功能是无穷无尽的。
让我们先来看一下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。
IMG upload/forum/2003114165017.jpg[/IMG]
图一: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对象,他由一个交织在一起的接口集合组成。因此,不能把他和容器服务分开来考虑。
IMG upload/forum/2003114165335.jpg[/IMG]
图二: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文件的入口点。
IMG upload/forum/2003114165353.jpg[/IMG]
图三: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'%> <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 特性,它增加了:
动作处理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的超链接,用户可以导航到向前或者向后的五个书签。初始点将被初始化为递交参量,使得用户可以使用浏览器的刷新、后退和前进按钮。
IMG upload/forum/2003114165559.jpg[/IMG]
Bookmark portlet版本四的界面
Portlet复习
象你所看到的那样,portlet规范的参考实现包括两个部分:portal和portlet容器。Portal作为一个简单的运行portlet容器的测试驱动。Portlet容器作为一个能迅速使用到其他portal(比如jetspeed)里的普通组件。
这个portlet实例用到了许多portlet API里的很重要的概念。你可以用所有portlet API和servlet API的特性来扩展这个实例。比方说你可以用一个servlet在新窗口中输出其他有用的信息,如一个打印预览。还可以通过Http会话与portlet进行交互。实际上,因为portlet是一个强大的技术,能用他实现的功能是无穷无尽的。
相关文章推荐
- Portlet API参考实现的秘密
- Portlet API参考实现的秘密(转载)
- 认证鉴权与API权限控制在微服务架构中的设计与实现 参考文件目录
- [Portal参考手册]Portlet核心API
- [Portal参考手册]Portlet核心API
- Java Portlet规范的参考实现-Pluto项目介绍(1)
- [Portal参考手册]Portlet核心API
- [Portal参考手册]Portlet核心API
- Java高并发秒杀API之web层实现(三)
- Microsoft API 和参考目录
- 在基于WebSphere JSF 1.2 Portlet Bridge的JSF Portlet中实现文件下载
- 在web Portal中实现可脱拽Portlet的方法
- 对于谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
- FME Server 2010 - Web服务API参考 url
- Google Map API使用详解(十七)——实现自定义叠加层
- 使用百度天气API实现自己的天气预报
- C#调用API实现程序间相互控制(附源码)
- 重温WIN32 API ------ C++日志类的实现
- python调用API实现智能回复机器人
- Nancy之实现API的功能