成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探秘企業門戶開發:Java Portlet入門

原創
開發 后端
簡單來說,門戶就是一個iGoogle或是myYahoo!這樣的現代化頁面。門戶的實現基于Java Portlet技術,而這個技術也可以實現企業門戶以及其他商業或個人網站。如果你在從事企業級開發而不了解Portlet,那么可以先從這篇Portlet入門著手。

【51CTO精選譯文】當你訪問iGoogle或是myYahoo!一類的門戶時,是否會對這種個性化門戶界面的實現方式感到好奇呢?實現這種“組件式”門戶的技術叫做Portlet。隨著Portlet相關規范的統一,這種技術現在也被用于企業內部網站(企業門戶)以及其他商業或個人網站。下面,我們將進行一次簡短的Portlet入門介紹與教程。

#t#

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所示。

Yahoo門戶:門戶自定義讓門戶記住用戶的參數設置 
圖 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容器示例。

Apache Jetspeed門戶:包括一個日歷Portlet 
圖 2 Apache Jetspeed門戶:包括一個日歷Portlet

用戶可以拖動日歷Portlet的位置,如圖3所示。

移動日歷Portlet 
圖 3 移動日歷Portlet

#p#

開發一個Portlet

下面這部分將介紹如何進行簡單的Portlet開發。首先創建一個標準的Java項目,然后創建一個portlet.xml文件,在這個文件中定義哪些Portlet對哪些容器有效,以及在實例化時需要使用哪些類,但這個文件并沒有定義如何注冊和識別Portlet。

圖4顯示了一個示例Portlet項目的目錄結構。

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> 
  26.  

從上面的內容可以看出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.      
  11.   < bean id="quickEntitySearchController"   
  12.     class="com.portlet.controller.QuickSearchController"   
  13.     parent="basePageController">   
  14.     < property name="sessionForm">< value>true< /value>< /property>   
  15.  
  16.     < !-- Keep command object throughout session --> 
  17.     < property name="commandName" value="commandObject"/> 
  18.     < property name="commandClass"   
  19.       value="com.portlet.command.commandObject"/> 
  20.     < property name="formView">< value>quick.search< /value>< /property> 
  21.     < property name="successView">< value>quick.search< /value>< /property> 
  22.     < property name="bindOnNewForm">< value>true< /value>< /property>       
  23.     < property name="quickServiceClient" ref="quickServiceClient"/> 
  24.   < /bean>     
  25.      
  26.   < bean id="portletModeParameterHandlerMapping" class="  
  27.     org.springframework.web.portlet.handler.  
  28.     PortletModeParameterHandlerMapping"> 
  29.     < property name="order" value="10"/> 
  30.     < property name="interceptors"> 
  31.       < list> 
  32.         < ref bean="parameterMappingInterceptor" /> 
  33.       < /list> 
  34.     < /property> 
  35.  
  36.     < property name="portletModeParameterMap"> 
  37.       < map> 
  38.         < entry key="view"> 
  39.           < map> 
  40.             < entry key="basePageAction"> 
  41.               < ref bean="quickSearchController"/> 
  42.             < /entry> 
  43.           < /map> 
  44.         < /entry> 
  45.       < /map> 
  46.     < /property> 
  47.   < /bean> 
  48.      
  49.   < bean id="portletModeHandlerMapping" class=  
  50.     "org.springframework.web.portlet.handler.PortletModeHandlerMapping"> 
  51.     < property name="interceptors"> 
  52.       < list> 
  53.         < ref bean="parameterMappingInterceptor" /> 
  54.       < /list> 
  55.     < /property> 
  56.     < property name="portletModeMap"> 
  57.       < map> 
  58.         < entry key="view">< ref bean="quickSearchController"/>< /entry> 
  59.       < /map> 
  60.     < /property> 
  61.   < /bean> 
  62. < /beans> 
  63.  

接下來就是編寫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.               
  15.    // logic to get the data and put it in the commandObject   
  16.    // should be here...  
  17.               
  18.    String view = getFormView();  
  19.    model.put("commandObject", commandObject);  
  20.    ModelAndView mav = new ModelAndView(view, model);  
  21.    return mav;    
  22. }  
  23. @Override 
  24. public void onSubmitAction (final ActionRequest request,   
  25.   final ActionResponse response, final Object command,  
  26.   final BindException bindException) throws Exception   
  27. {  
  28.    logger.info ("Inside onSubmitAction");  
  29.    // Set the form bean into session so that it will be available   
  30.    CommandObject commandObject = (CommandObject)command;  
  31.    logger.info("Command Object :"+ToStringBuilder.reflectionToString(  
  32.       commandObject));  
  33.    request.getPortletSession ().setAttribute ("command_obj",   
  34.       command,PortletSession.APPLICATION_SCOPE);  
  35. }  
  36.  

在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> 
  11.  

注意這個Portlet并沒有指出它在屏幕上的布局,是否可以調整大小,寬度和高度應該保持多少為佳,這些屬性都由Portlet容器來進行控制的。

為了讓Portlet可以真正運行,你還需要編譯并部署它。在編譯時,創建一個標準的Java war文件(一般使用Ant或Maven創建),部署時將war文件放到托管Portlet容器的應用服務器上。當Portlet配置好,且在Portlet容器中注冊后,就要借助portlet.xml文件查找哪些容器中可以使用哪些Portlet了。例如,在Vignette Portal中,你可以通過搜索找到需要的Portlet,然后將其添加到門戶中,如圖5和圖6所示。

在Vignette中添加一個Portlet 
圖 5 在Vignette中添加一個Portlet

在Vignette中搜索Portlet 
圖 6 在Vignette中搜索Portlet

添加Portlet到Portlet容器后,你還可以設置它們的位置、布局和屬性,例如,你可以設置默認的寬度和位置,以及是否可以最小化和移動位置等。

圖7顯示了Vignette示例頁面有三個Portlet,當用戶登錄到門戶后默認就看到這三個Portlet。

在Vignette調整Portlet布局 
圖 7 在Vignette調整Portlet布局

圖8顯示了eXo JBoss Portlet容器默認的布局,當然你也可以在此基礎上重新調整,以符合你特殊需要。

eXo JBoss 中可選的Portlet容器默認布局 
圖 8  eXo JBoss 中可選的Portlet容器默認布局

通過Portlet容器可以很容易地改變整個網站的外觀,風格,只需要改變Portlet的布局、皮膚或UI主題即可。

小結

本文介紹了門戶和Portlet的入門基礎知識,并提供了一個簡單的實例,對如何創建和部署Portlet做了簡要說明。目前既有開源的也有商業化的門戶產品,不管采用哪種產品,基于門戶的開發將使程序員的重心轉移到業務邏輯上。門戶技術還處于不斷發展中,未來幾年有可能出現新的門戶技術,如果你正從事企業級開發,那么從現在開始關注門戶技術吧!

原文:An Introduction to Java Enterprise Portals and Portlet Development

作者:Vlad Kofman

責任編輯:yangsai 來源: 51CTO.com
相關推薦

2011-12-20 09:24:15

2012-02-13 09:52:00

Linux企業

2012-02-13 10:07:52

Linux服務器

2009-11-23 20:10:31

ibmdwPortlet

2009-08-25 13:48:01

Java EE架構企業級應用

2025-01-10 09:47:43

blockSDKiOS

2011-11-15 19:14:05

SAPNetWeaverOpenText

2011-12-13 10:06:11

2012-05-07 09:45:46

VMware

2011-12-20 11:05:29

JBoss企業門戶紅帽

2010-08-09 08:48:46

File APIWeb

2011-03-10 09:07:47

liferayportlet

2009-06-17 10:56:19

JBoss門戶Enterprise門

2010-02-26 17:54:54

python

2009-11-06 16:10:54

ClosureJavaScript開Google

2012-05-04 10:16:51

vmware虛擬化View VDI

2010-08-27 10:41:41

iPhone核心應用程序

2015-03-31 15:33:57

開放實驗室探秘企業ICT解決方案華為

2013-04-17 10:06:55

Google GlasMirror API

2011-06-28 10:42:38

Windows 8開發部門DevX
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天综合久久 | 中文字幕在线欧美 | 久久久91精品国产一区二区三区 | 欧美一区二区在线观看 | 日韩一区二区免费视频 | 久久免费看 | www.av在线 | 国产一区 | 欧美日韩亚洲一区 | 粉嫩av在线 | 黄色片视频网站 | 久久久久久久久91 | 久久精品中文字幕 | 亚洲高清视频在线观看 | av大片| 久久激情视频 | 亚洲欧美视频 | 国产精品毛片一区二区在线看 | 粉嫩在线| 国产一级特黄真人毛片 | 国产偷自视频区视频 | 亚洲91精品 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 一级黄色片在线看 | 综合色导航 | 亚洲视频免费在线看 | 国产目拍亚洲精品99久久精品 | 亚洲免费视频一区 | 久久精品一级 | 欧美综合在线观看 | 成人免费激情视频 | 欧美一区在线视频 | 色狠狠桃花综合 | 中文字幕亚洲精品 | 欧美久久一区 | 亚洲精品在线免费观看视频 | 精品一级 | 亚洲精品久久久蜜桃网站 | 亚洲在线视频 | 国产精品免费观看视频 | 91精品国产综合久久香蕉麻豆 |