`

什么是Portlet ?

阅读更多

 

      “Portlets是一种Web组件-就像servlets-是专为将合成页面里的内容聚集在一起而设计的。通常请求一个portal页面会引发多个portlets被调用。每个portlet都会生成标记段,并与别的portlets生成的标记段组合在一起嵌入到portal页面的标记内。(摘自Portlet规范,JSR 168

本文探讨了以下内容:
1.        Portal页面的元素
2.        Portal
是什么?
3.        Portlets
是什么?
4.        
开发“Hello World” Portlet
5.        
Pluto上部署HelloWorld Portlet
6.        
如何创建Portal页面
7.        
结束语
8.        
资源

  Portlet规范将portlet定义为一种基于Java技术的web组件,由处理请求和生成动态内容的portlet容器管理。这段话听起来是不是有些费解?本文将说明portlets是什么以及能用它们做什么。 

图1显示了在访问一个portal服务器时浏览器中页面的样子。

 

  如果仔细查看浏览器里的页面,就会看到页面是由不同的“窗口”组成的。一个窗口用于刷新天气,另一个用于新闻,还有一个用于刷新股价,等等。这里的每一个窗口都代表了一个portlets。如果看得再仔细些,还会发现每个窗口都有一个标题条和一些按钮,包括最小化和最大化按钮。

  在系统里,这些窗口是相互独立开发、各不同的应用。新闻portlet的开发者创建应用并打包成war格式的文件,随后portal服务器的管理员在服务器上部署该war文件并创建页面,接下来每个用户会选择在他的页面里有哪些应用。例如,如果用户对股价不感兴趣而对体育感兴趣,他可以用“体育”窗口替换“股价”窗口。

  Portlet技术需要学习许多新概念,本文不可能全都涵盖,因此本文分为两部分。在第一部分里我们详细说明portals和portlets,并开发一个简单的“Hello World”portlet;在第二部分我们将探讨一些高级主题。

  我们将用Apache的Pluto服务器(Portlet API 1.0规范的参考实现)来测试我们的示例portlets,我们还会花些时间探讨如何安装和使用Pluto服务器。

Portal页面的元素

图2显示了Portal页面的各种元素。



图2 portal页面的元素

  每个portlet页面由一个或多个portlet窗口组成,每个portlet窗口又分为两部分:一个是外观,它决定了portlet窗口的标题条、控制和边界的样式;另一个是portlet段,它由portlet应用填充。

  Portal服务器决定了portal页面的整体观感,像标识、标题条颜色、控制图标等。通过修改几个JSP和css模板文件就可以改变portal的整个观感。我们将在“如何创建portal页面”部分对此做深入讨论。


Portlets是什么?

  与servlets类似,portlets是部署在容器内用来生成动态内容的web组件。从技术角度讲portlet是一个实现了javax.portlet.Portlet接口的类,它被打包成war文件格式部署到portlet容器里。

  Portlets在以下方面与servlets相似:
1.        portlets由特定的容器管理。
2.        portlets生成动态内容。
3.        portlet的生命周期由容器管理。
4.        portlets通过请求/响应模式与web客户端交互。

  Portlets在以下方面与servlets相异:
1.        portlets只能生成标记段,而不是整个文档。
2.        portlets没有可供直接访问的URL地址。不过你还是能够让别人通过URL访问到portlet,你可以把包含该portlet的页面的URL发给他。
3.        portlets不能随意地生成内容,这是因为portlet生成的内容最终要成为portal页面的一部分。如果portal服务器要求的是html/text类型,那么所有的portlets都应生成html/text类型的内容。再比方说,如果portal服务器要求的是WML类型,那么所有的portlets都应生成WML类型的内容。

  portlets还提供了一些附加的功能:
1.        设置参数的持久化存储:portlets提供了一个PortletPreferences对象用来保存用户的设置参数。这些参数被存入一个持久化数据库,这样服务器重启后数据依然有效。开发者不必关心这些数据存储的具体实现机制。
2.        请求处理:portlets提供了更为细粒度的请求处理。对于用户在portlet上动作时向该portlet发出的请求(一种称为活跃期的状态),或者因用户在其它portlet上动作而引发的刷新页面请求,Portal服务器提供了两种不同的回调方法来处理。
3.        Portlet模式:portlets用模式的概念来表示用户在做什么。在使用mail应用的时候,你可能会用它来读信、写信或检查信件――这些都是mail应用的预定功能,Portlets通常以VIEW模式提供这些功能。但还有一些活动,像指定刷新时间或(重新)设置用户名和密码,这些活动允许用户定制应用的行为,因此它们用的是EDIT模式。Mail应用的帮助功能用的是HELP模式。

  如果仔细想想其实这里面并没有什么新东西,它们反而大部分都是普通的业务需求。Portlet规范的作用在于它提供了一个抽象层,这才是它对所有与之相关的人-最终用户、开发者和管理员-的价值所在。

  作为一个开发者,我会将所有与VIEW模式有关的业务逻辑放入doView()方法,将与应用配置有关的业务逻辑放入doEdit()方法,将与帮助有关的逻辑放入doHelp()方法

  这就简化了管理员对portlet应用的访问控制管理,因为他只需改变portlet的访问权限就能决定用户能做什么。例如,如果mail应用的一个用户能够在EDIT模式下设定用户名和密码,那么就可以断定他具有EDIT模式访问权限。

  不妨考虑这样一种情形:我是一个intranet网站的管理员,我的公司买了一个能显示新闻信息的第三方portlet应用,该应用允许用户指定跟踪新闻更新的URL地址,我想借助它为用户显示公司的内部新闻。另一个需求是我不想让用户通过该应用来跟踪任何其它的新闻信息来源。作为管理员,我可以为所有的用户指定一个用于内部新闻更新的URL地址,同时通过改变portlet应用的部署描述符来取消其它人修改该地址的权限。

  由于所有的portlet应用都具有相似的UI界面,因此采用portlets可使网站对最终用户更具吸引力。如果她想阅读任何一个应用的帮助信息,她可以点击帮助按钮;她也知道点击编辑按钮能让她进入应用的配置屏。标准化的用户界面使你的portlet应用更引人。

4.        窗口状态:窗口状态决定了portal页面上留给portlet生成内容的空间。如果点击最大化按钮,portlet将占据整个屏幕,成为用户唯一可用的portlet;而在最小化状态,portlet只显示为标题条。作为开发者应当根据可用空间的大小来定做内容。

5.        用户信息:通常portlets向发出请求的用户提供个性化的内容,为了能更加行之有效,portlets需要访问用户的属性信息,如姓名、email、电话等。Portlet API为此提供了用户属性的概念,开发者能够用标准的方式访问这些属性,并由管理员负责在这些属性与真实的用户信息数据库(通常是LDAP服务器)之间建立映射关系。

  我们将在本文的第二部分深入讨论这些特点-请求处理、用户信息和portlet模式。

开发"Hello World" Portlet

  现在我们就来开发一个简单的HelloWorld portlet。
1.  创建一个名为HelloWorld的web项目,它与通常的servlet项目类似,有一个/WEB-INF/web.xml文件作为项目的部署描述符。

2.  在build path里加入portlet-api-1.0.jar文件,该jar文件是Pluto发行包的一部分。

3.  在Source文件夹中按如下内容创建HelloWorld.java文件: 

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1 public class HelloWorld extends GenericPortlet{
2     protected void doView(RenderRequest request,RenderResponse response) throws
3   PortletException, IOException {
4         response.setContentType("text/html");
5         response.getWriter().println("Hello Portlet");
6     }
7 }
8 



  每个portlet都要实现Portlet接口,该接口为portlet定义了生命周期方法。由于不想覆盖所有这些方法,我们只对GenericPortlet类进行扩展,它是一个实现了Portlet接口的适配器类。GenericPortlet类提供了所有生命周期方法的默认实现,所以我们只需实现我们所需要的方法。

  我们在 HelloWorld portlet里要做的只是显示“Hello Portlet”,所以我们将覆盖GenericPortlet类的doView()方法,该方法以PortletRequest 和 PortletResponse作为参数。在doView()方法中首先调用response.setContentType()以通知portlet容器该portlet将要生成何种类型的内容-如果不这样做就会导致IllegalStateException异常。一旦设置了内容的类型,就可以从response对象中获得PrintWriter并开始写入。

4.  每个portlet应用在/WEB-INF文件夹中都有一个portlet.xml文件,它是portlet应用的部署描述符。按以下内容创建portlet.xml文件:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 <portlet>
 2    <description>HelloWorldDescription</description>
 3    <portlet-name>HelloWorld</portlet-name>
 4    <display-name>Hello World</display-name>
 5    <portlet-class>com.test.HelloWorld</portlet-class>
 6    <expiration-cache>-1</expiration-cache>
 7    <supports>
 8       <mime-type>text/html</mime-type>
 9       <portlet-mode>VIEW</portlet-mode>
10    </supports>
11    <supported-locale>en</supported-locale>
12    <portlet-info>
13       <title>Hello World</title>
14       <short-title>Hello World</short-title>
15       <keywords>Hello,pluto</keywords>
16    </portlet-info>
17 </portlet>
18 

 

  <portlet-name>元素声明了portlet的名字,<portlet-class>元素指定了portlet的全限定类名,<expiration-cache>元素以秒为单位指定了内容超期的时间。这里面有一点需要注意:你在portlet上的某些动作可能会导致内容刷新,这与缓存时间无关。
  <supports>元素指定对于给定的<mime-type>有哪些模式可供支持。在示例中我们假定HelloWorld只能生成text/html类型的内容,且只有view模式可支持该内容类型。如果要增加对其它内容类型的支持,需要添加新的<support>元素并指定支持该MIME类型的模式有哪些。通常portlet对于text/html类型有VIEW、EDIT和HELP模式可供支持,而对于WML MIME类型则只有VIEW模式。
  还可以用<supported-locale>元素来指定portlet支持哪些本地化。<title>元素用来指定portlet的标题。如果要对标题做国际化处理,可以用元素<resource-bundle>指定资源(比例properties文件)的文件名。在这种情况下,容器将根据用户所在的地区从适当的properties文件中选择标题。

5.   每个portlet应用都是一个web应用,因此除了portlet.xml文件之外还需要有web.xml文件。

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1 <web-app>
2    <display-name>Hello World Portlet</display-name>
3    <welcome-file-list
4       <welcome-file>index.jsp</welcome-file>
5    </welcome-file-list>
6 </web-app>
7 



6.   接下来将这些文件进行编译并打包为war文件。你可以自己完成这些工作,或者下载带有build.xml 的示例代码(参见“资源”部分)来创建war文件。
在Pluto上部署HelloWorld Portlet

  Pluto尚处于开发阶段的早期,因此还没有一套易于使用的管理工具。为了能使用Pluto服务器,需要将编译和源代码两个版本都下载。需要注意的是以下说明是针对Windows平台的,Unix用户通过修改斜杠符号和执行sh shell脚本(不是bat批命令文件)会得到类似的结果。

1.  创建一个文件夹,比如C:\PlutoInstallation。
2.  从Pluto的网站下载pluto-1.0.1-rc1.zip和pluto-src-1.0.1-rc1.zip。
3.  将pluto-1.0.1-rc1.zip解压到C:\PlutoInstallation.文件夹,它应被解压到C:\PlutoInstallation\pluto-1.0.1-rc1文件夹下。
4.  执行C:\PlutoInstallation\pluto-1.0.1-rc1\bin\startup.bat启动Pluto,现在可以通过地址http://localhost:8080/pluto/portal访问Pluto服务器。
5.  将pluto-src-1.0.1-rc1.zip解压到C:\PlutoInstallation\PlutoSrc文件夹。
6.  进入C:\PlutoInstallation\PlutoSrc文件夹,执行maven distribute:all.,编译并下载运行常规管理任务所必需的相关资源文件。现在可以将HelloWorldPortlet.war作为portlet进行安装了。
7.  首先将HelloWorldPortlet.war文件拷贝到C:\PlutoInstallation\portlets目录,如果没这个目录就创建它。
8.  将C:\PlutoInstallation\plutosrc\build.properties.sample更名为build.properties。
9.  编辑build.properties,将maven.tomcat.home指向Pluto编译版的安装位置,在本例中应改为maven.tomcat.home=C:/PlutoInstallation/pluto-1.0.1-rc1。
10. 为了安装portlet,进入C:\plutoInstallation\plutosrc\deploy文件夹,执行maven deploy -Ddeploy=c:\PlutoInstallation\portlets\HelloWorldPortlet.war,应能看到“build successful”信息。
11. 在C:\PlutoInstallation\pluto-1.0.1-rc1\webapps文件夹下,应该有一个HelloWorldPortlet文件夹。
12. 现在进入C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\HelloWorld\WEB-INF\ folder文件夹,打开portlet的web.xml文件,你会发现里面自动多了几行,如下所示:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 <servlet>
 2    <servlet-name>HelloWorld</servlet-name>
 3    <display-name>HelloWorld Wrapper</display-name>
 4    <description>Automated generated Portlet Wrapper</description>
 5    <servlet-class>org.apache.pluto.core.PortletServlet</servlet-class>
 6    <init-param>
 7       <param-name>portlet-class</param-name>
 8       <param-value>com.test.HelloWorld</param-value>
 9    </init-param>
10    <init-param>
11       <param-name>portlet-guid</param-name>
12       <param-value>HelloPluto.HelloWorld</param-value>
13    <init-param>
14 </servlet>
15 

 

13.  接下来我们将该portlet加到页面里。进入C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\pluto\WEB-INF\data文件夹,可以看到有两个XML文件:pageregistry.xml和portletentityregistry.xml。
14.  portletentityregistry.xml包含了portlet的定义,在该文件中加入以下几行:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1 <application id="5">
2    <definition-id>HelloWorld</definition-id>
3    <portlet id="1">
4       <definition-id>HelloWorld.HelloWorld</definition-id>
5    </portlet>
6 </application>

  应用的<definition-id>应为web应用所在文件夹的名字,portlet的<definition-id>应与web.xml中生成的portlet-guid相一致。
15.  pageregistry.xml定义了页面中包含了哪些portlets,对该文件做如下改动:

 

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1 <fragment name="p2" type="portlet">
2     <property name="portlet" value="5.1"/>
3 </fragment>
4 


16.  执行shutdown命令和startup命令重启Pluto服务器,返回到地址http://localhost:8080/pluto/portal并点击“Test Link”-此时页面中将出现我们的   HelloWorld portlet。

图3的右侧显示了HelloWorld portlet看上去的样子。
*

图3 portlet的屏幕截图

如何创建Portal页面

图4显示了portal容器如何将分离的portlets组装为页面。


图4 创建Portal页面

  大部分的portal服务器基本上都是部署于应用服务器上的web应用,通过servlet来处理访问portal服务器的请求。查看一下Pluto的安装目录就会发现Pluto不过是一个部署于Tomcat服务器上的一个普通web应用,再看看C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\pluto\WEB-INF\web.xml会发现所有发往Pluto服务器的请求都被映射到org.apache.pluto.portalImpl.Servlet上。

  在本文开始部分“Portal页面的元素”中,我们提到portal页面由两部分组成。一部分是由页面中的portlets生成的内容,另一部分是由portal服务器生成的内容。

  在Pluto里,只要用户发出请求,就会由servlet进行控制,根据用户所请求的页面来确定需要显示的portlets的列表。一旦生成了列表,servlet就将控制转给这些portlets线程并收集由它们生成的内容。

  对于由portal服务器生成的内容(像portal网站的观感及每个portlet的外观和控制之类)则取决于C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\pluto\WEB-INF\aggregation文件夹下的JSP文件。RootFragment.jsp是主JSP文件,它决定了整体的观感和对齐方式;它还包含了Heads以定义在生成的页面中的<HEAD>标签里的内容。TabNavigation.jsp用来选择在banner中该显示什么(默认情况下在banner显示列表中也包扩了pluto.png图片)。TabNavigation.jsp用来确定portal网站的导航方案。这意味着只需改动该文件夹下少量的几个JSP文件,就能改变整个portal网站的观感。

  Pluto根据pageregistry.xml中的设置确定页面中有多少行,并用RowFragment.jsp去填充。ColumnFragment.jsp用来填充每个栏目。PortletFragmentHeader.jsp用来填充每个portlet的页头,像标题条及最大化和最小化控制。footer.jsp用来填充JSP的页脚。如果去看一下portal页面的HTML代码就会发现每个portlet窗口无非都是嵌入<TD>标签的内容块。

结束语

  任何一种新技术要想获得成功都应具备以下条件:首先,它能提升现有技术;其次,它能解决现有技术遇到的普遍问题;再次,它能提供多于一个的抽象层(有人说,每抽象出一层,问题就解决一半)。

  由于portlet与现有的应用服务器架构兼容,这对Portlet API来说是一次发展servlet技术的好机会。你可以从portlet里调用EJB,或者用它启动和参与由应用服务器控制的全局性事务。换句话说,在以商业逻辑为核心的领域里,portlet完全可以做得和servlet一样好。

  Portlets提供了一个抽象层,现在你不必再担心客户端使用了什么样的HTTP方法,也不必自己编写程序去捕获像点击按钮这样的客户端事件。最后但绝不是最次要的一点是,portlets以提供像单次登录、个性化等服务的方式解决了servlets不能解决的大部分问题。

原文地址:http://www.onjava.com/pub/a/onjava/2005/09/14/what-is-a-portlet.html
中文地址:http://www.matrix.org.cn/resource/article/44/44029_Portlet.html
 

分享到:
评论

相关推荐

    JSR168 PORLET标准手册汉化整理.pdf

    ##### 3.1 什么是PORTLET? PORTLET是基于Java技术的一种Web组件,它由PORTLET CONTAINER管理,用于处理用户的请求并生成动态的内容。PORTLET具有以下几个特点: - **可插拔性**:可以轻松插入或移除PORTLET而不...

    Portlets and Apache Portals

    - **什么是portlet?**:portlet是门户中的小部件,可以提供特定的功能或显示特定的内容。portlet是可插拔的,可以根据用户需求动态添加或删除。 - **portlet架构**:portlet架构描述了portlet与门户容器之间的交互...

    portlet源码,portlet Filter

    Portlet是一种在Web应用程序中,特别是企业级门户平台中,用于呈现内容和功能的可重用组件。在Java世界中,portlet技术主要基于JSR 286(Portlet 2.0 API)标准,它定义了portlet如何与门户服务器交互。本篇文章将...

    portal总结

    ##### 2.1 什么是Portlet? Portlet是Portal中的一个组成部分,它是一个小型的、可重用的应用组件,用于在Portal中提供特定的功能或内容。每个Portlet都负责呈现一部分信息或提供一项服务,例如新闻、天气预报或者...

    portlet specification

    ### Portlet Specification (JSR 168)详解 #### 一、概述 《portlet规范》(JSR 168)是为开发者提供的一份关键文档,它定义了portlet的开发标准,使得portlet能够在不同的门户环境中实现一致性和互操作性。这份...

    Portlet标准汉化手册

    什么是Portal(门户)** Portal,中文常译为“门户网站”,是一种基于Web的系统,它提供了个性化设定、单一登录功能,并能整合来自不同源头的多样化信息。Portal的特点在于其能够根据用户的不同角色和需求,展示...

    portlet开发参考手册

    Portlet开发参考手册是针对portlet技术的一份详细指南,它为开发者提供了全面的指导,以帮助他们构建和集成portlet到Web门户中。Portlet是一种可重用的Web组件,它们在门户环境中运行,允许用户自定义门户界面,展示...

    portal 开发指南

    ##### 1.2 什么是Portlet? Portlet是构成Portal的基本单元,可以理解为Portal页面上的小部件或插件。每个Portlet都是独立的功能模块,如天气预报、股票信息等,用户可以根据自己的需求定制显示哪些Portlet。...

    portlet入门介绍

    Portlet入门介绍 在Web开发领域,Portlet是一种特殊的组件,它被设计用来构建可复用、可配置的Web应用程序,通常在Portal环境下运行。Portlet技术为用户提供了一种集中访问多种服务和信息的方式,例如新闻、天气...

    jquery portlet

    **jQuery Portlet 知识详解** `jQuery Portlet` 是基于 jQuery UI 框架实现的一种portlet组件,它主要用于构建可自定义布局、具有拖放功能的Web应用程序界面。Portlet是Web应用中的一个模块化组件,常用于企业级...

    liferay

    ##### 1.3 什么是 Portlet? - **Portlet**:是 Portal 内部的一个可复用组件,负责显示特定的功能或信息。 - **Portlet 与 Servlet 的关系**:Portlet 和 Servlet 都是 Java EE 标准的一部分,但它们有着不同的...

    Manning Portlets and Apache Portals

    #### 2.2 什么是Portlet? - **定义**:解释了Portlet的概念,它是门户中独立的、可重用的组件。 - **分类**:介绍了不同类型的Portlet,如执行型Portlet、内容型Portlet等。 #### 2.3 创建Portlets - **设计模式**...

    Portlet规范介绍.rar

    Portlet是一种Web应用程序组件,主要用于构建企业级的门户系统。Portlet规范定义了这些组件如何在门户环境中交互、渲染和管理用户界面。本篇文章将深入探讨Portlet的概念、功能、工作原理以及相关的技术标准。 ...

    IBM portlet api 和 中文教程

    IBM Portlet API是WebSphere Portal应用开发中的核心组件,它为构建portlet提供了一套标准的接口和类库。Portlet是一种可重用的Web组件,它们可以集成到门户环境中,展示来自不同数据源的信息,并与用户进行交互。...

    PortLet 入门小例子

    Portlet是一种可重用的Web组件,主要用于企业级应用程序,特别是内容管理系统如IBM WebSphere Portal或Liferay Portal中。Portlet允许开发者创建交互式的、个性化的内容小部件,这些小部件可以嵌入到门户页面上,为...

    portlet之开发详解(中文)

    在如今的Web应用中,Portlet技术是一种用于创建动态Web内容组件的Java API,特别是在企业门户应用中十分常见。Portlet可以在 Portal 页面中作为一个独立的窗口区域显示内容,并且可以集成来自不同Web资源的信息。...

    Spring mvc portlet demo

    **Spring MVC Portlet Demo** Spring MVC Portlet是一个用于构建portlet应用程序的框架,它结合了Spring MVC的灵活性和portlet规范的强大功能。在这个demo中,我们将会深入探讨如何利用Spring 3.0 MVC架构来开发...

    Stringbeans3.5 加载外部portlet应用

    在IT行业中,Portlet是一种可重用的Web组件,它可以在门户环境中运行,提供特定的功能或服务。Stringbeans是一个流行的portlet容器,它允许开发者构建和管理portlet应用。本篇文章将详细探讨如何在Stringbeans 3.5...

    Spring Portlet MVC的实例 eclispe project

    Spring Portlet MVC是Spring框架在portlet开发中的应用,它提供了一种用于构建portlet应用程序的模型-视图-控制器(MVC)架构。Eclipse是一款广泛使用的Java集成开发环境(IDE),在这里,我们有一个名为"Spring ...

Global site tag (gtag.js) - Google Analytics