`
kangsoft
  • 浏览: 72026 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Portlet入门

    博客分类:
  • Java
阅读更多

       当你访问iGoogle或是myYahoo!一类的门户时,是否会对这种个性化门户界面的实现方式感到好奇呢?实现这种“组件式”门户的技术叫做Portlet。随着Portlet相关规范的统一,这种技术现在也被用于企业内部网站(企业门户)以及其他商业或个人网站。下面,我们将进行一次简短的Portlet入门介绍与教程。

  Java Portlet的历史

  自2003年最初的JSR 168规范发布以来,Portlet开发在企业和开源社区中都获得了积极响应。2008年6月发布了JSR 286规范,标志着Portlet开发技术已经非常成熟。截至目前已经有不止20个开源Portlet容器和门户产品可用,如SUN的Liferay Portal、eXo Platform和Jakarta Pluto等,也有来自主流软件厂商的商业化产品,如Vignette Portal、IBM WebSphere Portal、Sun OpenPortal和Oracle Portal(以前叫做BEA WebLogic Portal)等。

  Web门户基础

  那么,什么是门户呢?传统的观点认为Web分为三类:Web网站,搜索引擎和门户。Web网站一般放置个人主页或公司主页,而搜索引擎是网络爬虫,它索引个人和企业网页,以便于人们搜索,门户就象一个大杂烩,将各种有关或无关的东西全部糅合到一块(目前许多搜索引擎如Yahoo.com和MSN也是门户)。随着门户的演变,出现了一些新的特征,如保存用户的参数设置和其它自定义信息,用户也可以配置门户记住他们的设置,如背景色,显示记录条数等。支持自定义可以让不同的用户拥有个性化的门户,每个人访问门户时界面显示的内容可能完全不一样,如A看到的是新闻和股票,B看到的是娱乐和天文学。如图1所示。

 

 

  图 1 Yahoo门户:门户自定义让门户记住用户的参数设置

  经过自定义后,不同种类的信息掺和在一起形成一个非常现代化的页面,目前最流行的做法是在门户上放置多个矩形框,每个矩形框代表一个Portlet。Wikipedia将门户定义为“以统一的方式显示来自不同地方的信息”,将Portlet定义为“可插拔的用户界面组件”。

  门户的目标就是为不同用户定制显示不同的Portlet,以满足用户个性化的需求,这样做可以粘住用户。经过这几年的发展,门户的应用已经扩大到企业内部中去了,包括内部门户,B2B等形式,如企业财务门户将各种财务信息聚合到一起,分别以Portlet形式展示,如投资组合、401K计划、信用卡、银行账户等,财务部门人员就可以一次性获得大量的财务数据。

  企业门户和Portlet容器

  那么门户和Portlet容器是什么关系呢?简答:门户是Portlet容器的容器。Portlet容器是根据门户提供的Portlet标准API实现的供Portlet运行的环境,依靠这个环境,或者说平台,Portlet可以被实例化,使用,最终被处理掉(destroyed)。Java Portlet容器不是象Servlet容器那样标准的独立的容器,相反,它是在Java Servlet容器上实现的,并会重用Java Servlet的功能。从技术角度来说,Portlet容器可以看作是Portlet和门户之间的接口。

  早期的Web门户都是采用封闭式开发的,自家开发的Portlet只能在一个特定的Portlet容器中运行,不具有很好的兼容性,遇到新项目或需求变化,开发人员不得不重新修改Portlet代码。这种情况直到2003年SUN发布JSR 168规范后才得到改善,虽说这个规范也不完美,但它提供了一个标准Portlet API,定义了Portlet生命周期和其它重要属性。即使到了今天,很多Portlet和Portlet容器都仍然遵循JSR 168或2008年发布的JSR 286规范,凡遵循这些规范编写的Portlet几乎都有很好的移植性。

  提示:IBM也开发了自家的WebSphere portal,并且公开了API,IBM的API和SUN的API很类似,但最新的版本中,IBM放弃了自家的API,完全遵循JSR 168和JSR 286规范了。

  现代Portlet容器可以用来构建企业内部网站(企业门户),商业网站或个人网站,大多数都实现了开箱即用的功能,如国际化支持,工具和内容管理,基于角色的授权,单点登录(SSO)支持,搜索和标签支持等。图2显示了一个正在运行的Portlet容器示例。

 

 

  图 2 Apache Jetspeed门户:包括一个日历Portlet

  用户可以拖动日历Portlet的位置,如图3所示。

 

 

  图 3 移动日历Portlet

  开发一个Portlet

  下面这部分将介绍如何进行简单的Portlet开发。首先创建一个标准的Java项目,然后创建一个portlet.xml文件,在这个文件中定义哪些Portlet对哪些容器有效,以及在实例化时需要使用哪些类,但这个文件并没有定义如何注册和识别Portlet。

  图4显示了一个示例Portlet项目的目录结构。

 

 

  图 4 Portlet项目结构示例

  

下面的portlet.xml定义了一个Portlet:

  1. < ?xml version="1.0" encoding="UTF-8"?>
  2. < portlet-app xmlns=
  3. "http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation=
  6. "http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
  7. version="1.0">
  8. < portlet>
  9. < portlet-name>QuickSearch< /portlet-name>
  10. < portlet-class>
  11. org.springframework.web.portlet.DispatcherPortlet
  12. < /portlet-class>
  13. < init-param>
  14. < name>contextConfigLocation< /name>
  15. < value>/WEB-INF/context/portlet/QuickSearchDefinition.xml< /value>
  16. < /init-param>
  17. < supports>
  18. < mime-type>text/html< /mime-type>
  19. < portlet-mode>view< /portlet-mode>
  20. < /supports>
  21. < portlet-info>
  22. < title>Quick Search< /title>
  23. < /portlet-info>
  24. < /portlet>
  25. < /portlet-app>

从上面的内容可以看出portlet.xml指定contextConfigLocation为Spring类的初始化参数。

列表1显示了完整的contextConfigLocation文件的内容。

  1. < ?xml version="1.0" encoding="UTF-8"?>
  2. < beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  8. http://www.springframework.org/schema/aop
  9. http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  10. < bean id="quickEntitySearchController"
  11. class="com.portlet.controller.QuickSearchController"
  12. parent="basePageController">
  13. < property name="sessionForm">< value>true< /value>< /property>
  14. < !-- Keep command object throughout session -->
  15. < property name="commandName" value="commandObject"/>
  16. < property name="commandClass"
  17. value="com.portlet.command.commandObject"/>
  18. < property name="formView">< value>quick.search< /value>< /property>
  19. < property name="successView">< value>quick.search< /value>< /property>
  20. < property name="bindOnNewForm">< value>true< /value>< /property>
  21. < property name="quickServiceClient" ref="quickServiceClient"/>
  22. < /bean>
  23. < bean id="portletModeParameterHandlerMapping" class="
  24. org.springframework.web.portlet.handler.
  25. PortletModeParameterHandlerMapping">
  26. < property name="order" value="10"/>
  27. < property name="interceptors">
  28. < list>
  29. < ref bean="parameterMappingInterceptor" />
  30. < /list>
  31. < /property>
  32. < property name="portletModeParameterMap">
  33. < map>
  34. < entry key="view">
  35. < map>
  36. < entry key="basePageAction">
  37. < ref bean="quickSearchController"/>
  38. < /entry>
  39. < /map>
  40. < /entry>
  41. < /map>
  42. < /property>
  43. < /bean>
  44. < bean id="portletModeHandlerMapping" class=
  45. "org.springframework.web.portlet.handler.PortletModeHandlerMapping">
  46. < property name="interceptors">
  47. < list>
  48. < ref bean="parameterMappingInterceptor" />
  49. < /list>
  50. < /property>
  51. < property name="portletModeMap">
  52. < map>
  53. < entry key="view">< ref bean="quickSearchController"/>< /entry>
  54. < /map>
  55. < /property>
  56. < /bean>
  57. < /beans>

接下来就是编写Java代码实现控制器,视图和Portlet处理程序了。视图是一个JSP页面,控制器和Portlet处理程序是Java类。在控制器和处理程序的帮助下,从不同数据源提取数据,如Web Service,数据库或feed等,你可以通过命令模式将这些数据传给视图,运输工具使用commandObject。下面的代码展示了如何使用Portlet API获取数据并返回给视图层。

  1. @Override
  2. protected ModelAndView handleRenderRequestInternal(
  3. RenderRequest request, RenderResponse response) throws Exception
  4. {
  5. logger.info ("Inside Controller handleRenderRequestInternal");
  6. Map< String, CommandObject> model = new
  7. HashMap< String, CommandObject>();
  8. CommandObject commandObject =
  9. (CommandObject)request.getPortletSession().getAttribute(
  10. CommandObject.COMMAND_NAME,PortletSession.APPLICATION_SCOPE);
  11. if (commandObject == null){
  12. commandObject = new CommandObject();
  13. }
  14. // logic to get the data and put it in the commandObject
  15. // should be here...
  16. String view = getFormView();
  17. model.put("commandObject", commandObject);
  18. ModelAndView mav = new ModelAndView(view, model);
  19. return mav;
  20. }
  21. @Override
  22. public void onSubmitAction (final ActionRequest request,
  23. final ActionResponse response, final Object command,
  24. final BindException bindException) throws Exception
  25. {
  26. logger.info ("Inside onSubmitAction");
  27. // Set the form bean into session so that it will be available
  28. CommandObject commandObject = (CommandObject)command;
  29. logger.info("Command Object :"+ToStringBuilder.reflectionToString(
  30. commandObject));
  31. request.getPortletSession ().setAttribute ("command_obj",
  32. command,PortletSession.APPLICATION_SCOPE);
  33. }

在JSP文件中,你可以象下面这样检索数据:

  1. < form:form action="${formAction}" name="quickProcess"
  2. method="post" commandName="commandObject">
  3. < form:hidden path="p" id="p" />
  4. < c:if test="${commandObject.someList != null}">
  5. < c:forEach items="${commandObject.someList}"
  6. var="listItem" varStatus="loop">
  7. < c:out value="${listItem.name}"/>< br>
  8. < /c:forEach>
  9. < /c:if>
  10. < /form:form>

  注意这个Portlet并没有指出它在屏幕上的布局,是否可以调整大小,宽度和高度应该保持多少为佳,这些属性都由Portlet容器来进行控制的。

  为了让Portlet可以真正运行,你还需要编译并部署它。在编译时,创建一个标准的Java war文件(一般使用Ant或Maven创建),部署时将war文件放到托管Portlet容器的应用服务器上。当Portlet配置好,且在Portlet容器中注册后,就要借助portlet.xml文件查找哪些容器中可以使用哪些Portlet了。例如,在Vignette Portal中,你可以通过搜索找到需要的Portlet,然后将其添加到门户中,如图5和图6所示。

 

 

  图 5 在Vignette中添加一个Portlet

 

 

  图 6 在Vignette中搜索Portlet

  添加Portlet到Portlet容器后,你还可以设置它们的位置、布局和属性,例如,你可以设置默认的宽度和位置,以及是否可以最小化和移动位置等。

  图7显示了Vignette示例页面有三个Portlet,当用户登录到门户后默认就看到这三个Portlet。

 

 

  图 7 在Vignette调整Portlet布局

  图8显示了eXo JBoss Portlet容器默认的布局,当然你也可以在此基础上重新调整,以符合你特殊需要。

 

 

  图 8 eXo JBoss 中可选的Portlet容器默认布局

  通过Portlet容器可以很容易地改变整个网站的外观,风格,只需要改变Portlet的布局、皮肤或UI主题即可。

  小结

  本文介绍了门户和Portlet的入门基础知识,并提供了一个简单的实例,对如何创建和部署Portlet做了简要说明。目前既有开源的也有商业化的门户产品,不管采用哪种产品,基于门户的开发将使程序员的重心转移到业务逻辑上。门户技术还处于不断发展中,未来几年有可能出现新的门户技术,如果你正从事企业级开发,那么从现在开始关注门户技术吧!

 

原链接:http://www.soft6.com/tech/16/169006.html

分享到:
评论
10 楼 gaowenming 2011-01-20  
按照网上一些资料的步骤做的portlet,部署到pluto里面就是不会显示portlet
郁闷。。。。
哪位大虾看看呗
9 楼 wang_fei4321 2010-03-05  
有研究jetspeed2的么,大家研究一下,好像看起来确实不错
8 楼 lnaigg 2010-03-05  
hesy_007 写道
Portlet的入门,建议采用Apache的Jetspeed2,这是JSR的标准实现。而且例子最好是标准的Portlet代码,楼主的例子明显是Spring封装过的Portlet实现,对理解portal没有什么好处。

Portlet的入门,应该用Pluto。
Jetspeed2是个完整门户产品,太复杂。
7 楼 binlaniua 2010-03-04  
楼主你图悲剧了。。 麻烦搞定哦

还有吗 排一下版吗~~
6 楼 cqllang 2010-03-04  
对头,还是把图片处理一下撒
5 楼 fejay 2010-03-04  
图片紧限于百度用户交流使用。
晕死
4 楼 a_nuo 2010-03-04  
看着实在吃力!!
3 楼 hesy_007 2010-03-04  
Portlet的入门,建议采用Apache的Jetspeed2,这是JSR的标准实现。而且例子最好是标准的Portlet代码,楼主的例子明显是Spring封装过的Portlet实现,对理解portal没有什么好处。
2 楼 gundumw100 2010-03-04  
图片能否补上?否则看着吃力
1 楼 超级潜水艇 2010-03-04  
全部图片不能看。楼主打什么飞机

相关推荐

    portlet入门介绍

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

    portlet之开发详解(中文)

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

    JSR168_Portlet开发入门

    JSR-168,全称为Java Specification Request 168,是Java Community Process发布的一个标准,用于定义portlet(portlet是Web应用程序中的可重用组件)的API。这个标准为portlet开发者提供了一种统一的方式,使得...

    portlet详细例子

    开发者会从中学习到如何定义portlet的配置元数据,编写portlet的Java代码(包括服务端的Portlet类和客户端的JSP页面),以及如何处理用户的请求和响应。HelloWorld Portlet可能会简单地在页面上显示一句“Hello, ...

    portlet开发指南

    Portlet开发主要遵循JavaServer Pages (JSP) 规范的JSR 286标准。此标准定义了Portlet的行为、API以及如何与Portlet容器交互。Portlet开发应该考虑与不同版本的J2EE的兼容性问题。 **JSR286的主要新特性** JSR 286...

    portlet开发资料.rar

    在"portlet开发资料.rar"这个压缩包中,包含了关于portlet开发的一系列文档,这些文档可能详细介绍了portlet开发的基础到高级概念,帮助开发者从入门到精通掌握portlet开发。 1. **portlet的概念与作用**: - ...

    IBM portlet开发指南

    JSR286是Java Specification Requests中关于Portlet技术的规范版本2的描述,它定义了Portlet2.0版本。JSR286相较于之前版本引入了新的特性和改进,例如,支持通过Portlet URL传递Portlet Mode和Window State信息,...

    jetspeed 的几个portlet

    这里我们关注的是jetspeed,一个基于Java的开源门户平台,它支持JSR168(portlet规范1.0)和WSRP(Web Services for Remote Portlets)标准。JSR168为portlet开发提供了一套统一的API,使得portlet可以在不同的门户...

    Portlets and Apache Portals

    #### 三、Portlet入门指南 - **编写portlet代码**:开发portlet通常涉及到实现特定接口或继承特定类来处理portlet请求和响应。这部分会介绍如何编写基本的portlet逻辑。 - **portlet部署描述符**:每个portlet都...

    Portelt 入门实例for Liferay

    在这个"Portlet入门实例for Liferay"中,我们将深入探讨Portlet的基本概念、开发流程以及在Liferay中的应用。 1. **Portlet基本概念**: - Portlet是一种轻量级的Web组件,它可以嵌入到门户页面中,提供特定的功能...

    WebSpherePortal新手入门基础课程.pdf

    为了实现Portlet的跨平台兼容性,业界制定了两种主要的Portlet规范:Java Portlet Specification(JSR168)和Web Services for Remote Portlets(WSRP)。JSR168由Java社区进程JCP管理,定义了Portlet开发的标准...

    Apache Pluto Portal 学习文档

    Apache Pluto Portal 是一个开源的portlet容器,它是Java Portlet Specification的实现,允许开发者构建和部署portlet应用程序。本文档主要针对Apache Pluto Portal的学习,适合初学者。Portlet是一种Web应用程序...

    Java最经典的一个初始实例〔备份文件〕

    这个"Java最经典的一个初始实例〔备份文件〕"很可能包含了Java编程的基本概念和常见应用的演示,是初学者入门或复习的重要资源。下面我们将深入探讨Java的一些核心知识点。 首先,Java程序的编写始于一个或多个源...

    liferay快速入门quickstart

    ### Liferay快速入门知识点详解 #### 一、Liferay Portal简介与快速启动 Liferay Portal是一款功能强大且灵活的企业级门户平台,它基于Java技术,遵循JSR-168标准,提供了丰富的特性来满足企业内外部网站的需求。...

    Liferay系列文章 7章 从介绍 到入门

    入门Liferay涉及理解其架构、安装配置、创建和部署Portlet、设置用户权限等方面。开发者可以通过Liferay提供的API和工具,快速构建和扩展门户功能。Liferay的灵活性和可扩展性使其在企业信息化建设中具有广泛的应用...

    Portal入门学习

    ### Portal入门学习知识点详解 #### 一、搭建Portal开发环境 **1. 准备必要的软件:** - **JDK1.5(或以上):** Java Development Kit 是开发 Java 应用程序的基础,本教程推荐使用 JDK1.5 或更高版本。 - **...

    simplest-hello-world-portlet

    构建此示例项目所需的全部是Java 6.0(Java SDK 1.6)或更高版本以及Maven 3.0或更高版本。 该项目旨在部署在JBoss EAP上运行的JBoss Portal Platform 6.1上。 配置Maven 您可以通过两种方式配置Maven:A

    Liferay入门帮助文档(Liferay开发指南)

    总的来说,Liferay入门帮助文档是一个宝贵的资源,它不仅提供了Liferay的基础知识,还详细阐述了如何配置开发环境,创建和部署portlet,以及如何利用Liferay的特性来开发复杂的功能。对于初学者,这份文档提供了一个...

Global site tag (gtag.js) - Google Analytics