国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
探秘企業(yè)門戶開發(fā):Java Portlet入門
http://developer.51cto.com/art/200911/161060.htm
 
  • http://developer.51cto.com  2009-11-04 15:54  黃永兵 譯 
    • 簡(jiǎn)單來(lái)說,門戶就是一個(gè)iGoogle或是myYahoo!這樣的現(xiàn)代化頁(yè)面。門戶的實(shí)現(xiàn)基于Java Portlet技術(shù),而這個(gè)技術(shù)也可以實(shí)現(xiàn)企業(yè)門戶以及其他商業(yè)或個(gè)人網(wǎng)站。如果你在從事企業(yè)級(jí)開發(fā)而不了解Portlet,那么可以先從這篇Portlet入門著手。

      【51CTO精選譯文】當(dāng)你訪問iGoogle或是myYahoo!一類的門戶時(shí),是否會(huì)對(duì)這種個(gè)性化門戶界面的實(shí)現(xiàn)方式感到好奇呢?實(shí)現(xiàn)這種“組件式”門戶的技術(shù)叫做Portlet。隨著Portlet相關(guān)規(guī)范的統(tǒng)一,這種技術(shù)現(xiàn)在也被用于企業(yè)內(nèi)部網(wǎng)站(企業(yè)門戶)以及其他商業(yè)或個(gè)人網(wǎng)站。下面,我們將進(jìn)行一次簡(jiǎn)短的Portlet入門介紹與教程。

      Java Portlet的歷史

      自2003年最初的JSR 168規(guī)范發(fā)布以來(lái),Portlet開發(fā)在企業(yè)和開源社區(qū)中都獲得了積極響應(yīng)。2008年6月發(fā)布了JSR 286規(guī)范,標(biāo)志著Portlet開發(fā)技術(shù)已經(jīng)非常成熟。截至目前已經(jīng)有不止20個(gè)開源Portlet容器和門戶產(chǎn)品可用,如SUN的Liferay Portal、eXo Platform和Jakarta Pluto等,也有來(lái)自主流軟件廠商的商業(yè)化產(chǎn)品,如Vignette Portal、IBM WebSphere Portal、Sun OpenPortal和Oracle Portal(以前叫做BEA WebLogic Portal)等。

      Web門戶基礎(chǔ)

      那么,什么是門戶呢?傳統(tǒng)的觀點(diǎn)認(rèn)為Web分為三類:Web網(wǎng)站,搜索引擎和門戶。Web網(wǎng)站一般放置個(gè)人主頁(yè)或公司主頁(yè),而搜索引擎是網(wǎng)絡(luò)爬蟲,它索引個(gè)人和企業(yè)網(wǎng)頁(yè),以便于人們搜索,門戶就象一個(gè)大雜燴,將各種有關(guān)或無(wú)關(guān)的東西全部糅合到一塊(目前許多搜索引擎如Yahoo.com和MSN也是門戶)。隨著門戶的演變,出現(xiàn)了一些新的特征,如保存用戶的參數(shù)設(shè)置和其它自定義信息,用戶也可以配置門戶記住他們的設(shè)置,如背景色,顯示記錄條數(shù)等。支持自定義可以讓不同的用戶擁有個(gè)性化的門戶,每個(gè)人訪問門戶時(shí)界面顯示的內(nèi)容可能完全不一樣,如A看到的是新聞和股票,B看到的是娛樂和天文學(xué)。如圖1所示。

       
      圖 1 Yahoo門戶:門戶自定義讓門戶記住用戶的參數(shù)設(shè)置

      經(jīng)過自定義后,不同種類的信息摻和在一起形成一個(gè)非?,F(xiàn)代化的頁(yè)面,目前最流行的做法是在門戶上放置多個(gè)矩形框,每個(gè)矩形框代表一個(gè)Portlet。Wikipedia將門戶定義為“以統(tǒng)一的方式顯示來(lái)自不同地方的信息”,將Portlet定義為“可插拔的用戶界面組件”。

      門戶的目標(biāo)就是為不同用戶定制顯示不同的Portlet,以滿足用戶個(gè)性化的需求,這樣做可以粘住用戶。經(jīng)過這幾年的發(fā)展,門戶的應(yīng)用已經(jīng)擴(kuò)大到企業(yè)內(nèi)部中去了,包括內(nèi)部門戶,B2B等形式,如企業(yè)財(cái)務(wù)門戶將各種財(cái)務(wù)信息聚合到一起,分別以Portlet形式展示,如投資組合、401K計(jì)劃、信用卡、銀行賬戶等,財(cái)務(wù)部門人員就可以一次性獲得大量的財(cái)務(wù)數(shù)據(jù)。

      企業(yè)門戶和Portlet容器

      那么門戶和Portlet容器是什么關(guān)系呢?簡(jiǎn)答:門戶是Portlet容器的容器。Portlet容器是根據(jù)門戶提供的Portlet標(biāo)準(zhǔn)API實(shí)現(xiàn)的供Portlet運(yùn)行的環(huán)境,依靠這個(gè)環(huán)境,或者說平臺(tái),Portlet可以被實(shí)例化,使用,最終被處理掉(destroyed)。Java Portlet容器不是象Servlet容器那樣標(biāo)準(zhǔn)的獨(dú)立的容器,相反,它是在Java Servlet容器上實(shí)現(xiàn)的,并會(huì)重用Java Servlet的功能。從技術(shù)角度來(lái)說,Portlet容器可以看作是Portlet和門戶之間的接口。

      早期的Web門戶都是采用封閉式開發(fā)的,自家開發(fā)的Portlet只能在一個(gè)特定的Portlet容器中運(yùn)行,不具有很好的兼容性,遇到新項(xiàng)目或需求變化,開發(fā)人員不得不重新修改Portlet代碼。這種情況直到2003年SUN發(fā)布JSR 168規(guī)范后才得到改善,雖說這個(gè)規(guī)范也不完美,但它提供了一個(gè)標(biāo)準(zhǔn)Portlet API,定義了Portlet生命周期和其它重要屬性。即使到了今天,很多Portlet和Portlet容器都仍然遵循JSR 168或2008年發(fā)布的JSR 286規(guī)范,凡遵循這些規(guī)范編寫的Portlet幾乎都有很好的移植性。

      提示:IBM也開發(fā)了自家的WebSphere portal,并且公開了API,IBM的API和SUN的API很類似,但最新的版本中,IBM放棄了自家的API,完全遵循JSR 168和JSR 286規(guī)范了。

      現(xiàn)代Portlet容器可以用來(lái)構(gòu)建企業(yè)內(nèi)部網(wǎng)站(企業(yè)門戶),商業(yè)網(wǎng)站或個(gè)人網(wǎng)站,大多數(shù)都實(shí)現(xiàn)了開箱即用的功能,如國(guó)際化支持,工具和內(nèi)容管理,基于角色的授權(quán),單點(diǎn)登錄(SSO)支持,搜索和標(biāo)簽支持等。圖2顯示了一個(gè)正在運(yùn)行的Portlet容器示例。

       
      圖 2 Apache Jetspeed門戶:包括一個(gè)日歷Portlet

      用戶可以拖動(dòng)日歷Portlet的位置,如圖3所示。

       
      圖 3 移動(dòng)日歷Portlet

      開發(fā)一個(gè)Portlet

      下面這部分將介紹如何進(jìn)行簡(jiǎn)單的Portlet開發(fā)。首先創(chuàng)建一個(gè)標(biāo)準(zhǔn)的Java項(xiàng)目,然后創(chuàng)建一個(gè)portlet.xml文件,在這個(gè)文件中定義哪些Portlet對(duì)哪些容器有效,以及在實(shí)例化時(shí)需要使用哪些類,但這個(gè)文件并沒有定義如何注冊(cè)和識(shí)別Portlet。

      圖4顯示了一個(gè)示例Portlet項(xiàng)目的目錄結(jié)構(gòu)。

       
      圖 4 Portlet項(xiàng)目結(jié)構(gòu)示例

      下面的portlet.xml定義了一個(gè)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.  

      從上面的內(nèi)容可以看出portlet.xml指定contextConfigLocation為Spring類的初始化參數(shù)。

      列表1顯示了完整的contextConfigLocation文件的內(nèi)容。

              
      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.  

      接下來(lái)就是編寫Java代碼實(shí)現(xiàn)控制器,視圖和Portlet處理程序了。視圖是一個(gè)JSP頁(yè)面,控制器和Portlet處理程序是Java類。在控制器和處理程序的幫助下,從不同數(shù)據(jù)源提取數(shù)據(jù),如Web Service,數(shù)據(jù)庫(kù)或feed等,你可以通過命令模式將這些數(shù)據(jù)傳給視圖,運(yùn)輸工具使用commandObject。下面的代碼展示了如何使用Portlet API獲取數(shù)據(jù)并返回給視圖層。

              
      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文件中,你可以象下面這樣檢索數(shù)據(jù):

              
      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.  

      注意這個(gè)Portlet并沒有指出它在屏幕上的布局,是否可以調(diào)整大小,寬度和高度應(yīng)該保持多少為佳,這些屬性都由Portlet容器來(lái)進(jìn)行控制的。

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

       
      圖 5 在Vignette中添加一個(gè)Portlet

       
      圖 6 在Vignette中搜索Portlet

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

      圖7顯示了Vignette示例頁(yè)面有三個(gè)Portlet,當(dāng)用戶登錄到門戶后默認(rèn)就看到這三個(gè)Portlet。

       
      圖 7 在Vignette調(diào)整Portlet布局

      圖8顯示了eXo JBoss Portlet容器默認(rèn)的布局,當(dāng)然你也可以在此基礎(chǔ)上重新調(diào)整,以符合你特殊需要。

       
      圖 8  eXo JBoss 中可選的Portlet容器默認(rèn)布局

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

      小結(jié)

      本文介紹了門戶和Portlet的入門基礎(chǔ)知識(shí),并提供了一個(gè)簡(jiǎn)單的實(shí)例,對(duì)如何創(chuàng)建和部署Portlet做了簡(jiǎn)要說明。目前既有開源的也有商業(yè)化的門戶產(chǎn)品,不管采用哪種產(chǎn)品,基于門戶的開發(fā)將使程序員的重心轉(zhuǎn)移到業(yè)務(wù)邏輯上。門戶技術(shù)還處于不斷發(fā)展中,未來(lái)幾年有可能出現(xiàn)新的門戶技術(shù),如果你正從事企業(yè)級(jí)開發(fā),那么從現(xiàn)在開始關(guān)注門戶技術(shù)吧!

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

      作者:Vlad Kofman

       

      (#)

    本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
    打開APP,閱讀全文并永久保存 查看更多類似文章
    猜你喜歡
    類似文章
    Apache 門戶項(xiàng)目組介紹
    spring學(xué)習(xí)筆記:bean作用域
    [Java][web]利用Spring隨時(shí)隨地獲得Request和Session | IT癮
    『互聯(lián)網(wǎng)架構(gòu)』軟件架構(gòu)
    在EasyJWeb使用spring容器
    spring security3 自定義過濾鏈
    更多類似文章 >>
    生活服務(wù)
    分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
    綁定賬號(hào)成功
    后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
    如果VIP功能使用有故障,
    可點(diǎn)擊這里聯(lián)系客服!

    聯(lián)系客服