分享

深入理解Weblogic Portal8.1

 smoking_boy 2005-08-24

作者:林海滨 dev2dev IDlinhibin

摘要

本文着重于从理论与应用的角度,对Bea WebLogic Portal8.1做一个介绍和分析,详细介绍JSR168标准,并对Portal基本原理及经常碰到的问题进行讨论。

Portal简介...

什么是Portal?.

什么是Portlet?.

Portal标准...

PortletsServlet的异同?...

相同点...

不同点...

portlet优点...

portletservlet的关系...

portlet无法做到的事情...

Portlets实例...

Portlet生命周期...

Portlet URLs.

如何生成Portlet URL.

如何使用Portlet URL.

portlet模式...

VIEW模式...

EDIT模式...

HELP模式...

portlet窗口状态...

portlet上下文...

PortletRequest

PortletResponse.

Portlet参数...

会话PortletSession.

变量范围定义...

PortletSessionHttpSession的关系...

缓存Cache.

Portlet应用...

标记库...

.

.

.

.

定制的Portlet模式...

不允许的标记...

WebLogic Portal

基础概念--配置篇...

Desktop.

Book.

Page.

基础概念--开发篇...

User Porfile Property Set

User Segment

Content Selector

Campaign.

PlaceHolder

目录结构...

开发步骤...

杂项...

WebLogic Portal原理及应用...

生命周期...

参数传递...

JSR168标准...

WebLogic Portal8.1用法...

Cache机制...

用户认证...

输出机制...

WebLogic Portal设计模式...

Singleton模式...

Factory模式...

Visitor模式...

Facade模式:

State模式:

Observer模式...

Abstract Factory模式...

WebLogic Portal集成...

远程Portlet

集成OA.

单点登录SSO..


Portal简介

什么是Portal?

Portal是一个基于web的应用程序,它主要提供个性化、单点登录、不同来源的内容整合以及存放信息系统的表示层。

什么是Portlet?

Portlet是基于java技术的web组件,它由portlet容器管理、并处理请求,并动态生成输出内容。

Portlet的输出是一个片段,即不是一个完整的页面。

Portal标准

为规范PortalSUN2003年底制定了JSR168,它定义了portlet标准,并给出了一个实现接口。

PortletsServlet的异同?

相同点

基于web应用的java技术

由特定的容器管理

动态生成内容

生命周期由容器进行管理

通过request/reponse进行交互

不同点

portlet只生成片段

portlet并不直接绑定到某一个URL

portlet通过portal进行交互

portlet可以多次在同一个portal页面上同时出现

portlet优点

能访问到用户配置信息

能在不同的域中存储会话:应用程序级到私有级。

portletservlet的关系

前者能调用后者,并且能共享信息,包括:Attributes

portlet容器是servlet容器的扩展

portlet无法做到的事情

设置response的字符集编码

设置http header

获取客户端的request

Portlets实例

如果是在普通的场合下使用,即不是在分布式场合,则每个portal应用就会生成一个portlet实例。而如果是在分布式场合下使用的话,则每个jvm只有一个实例。

Portlet生命周期

Portlet接口的四个方法构成一个完整的生命周期:init, processAction,render,destroy

public void init(PortletConfig config) throws PortletException;

portlet容器调用,在将portlet放入服务区前调用。portlet容器在初始化portlet后,直接调用这个方法。

public void processAction (ActionRequest request, ActionResponse response)

    throws PortletException, java.io.IOException;

portlet容器调用,用来处理action request

public void render (RenderRequest request, RenderResponse response)

    throws PortletException, java.io.IOException;

portlet容器调用,用来生成输出。

public void destroy();

portlet从服务区中删除。

Portlet URLs

如何生成Portlet URL

RenderResponse.createActionURL

RenderResponse.createRenderURL

调用setParametersetParameters可以用来设置参数.

如何使用Portlet URL

开发者不可以对参数进行任何编码,它(编码)是由portlet容器进行的。见下面例子:

       PortletURL url = response.createRenderURL();

       url.setParameter(“customer”,”foo.com”);

       url.setParameter(“show”,”summary”);

       writer.print(“Summary”);

portlet URL可以包含portlet的模式及窗口的状态,见下面例子:

       PortletURL url = response.createActionURL();

       url.setParameter(“paymentMethod”,”creditCardInProfile”);

       url.setWindowState(WindowState.MAXIMIZED);

       writer.print(“

”);

setSecure方法用来设置是否是https

portlet模式

portlet模式用来指示portlet应执行的功能,标准定义了三种:VIEW, EDIT, HELP

VIEW模式

用来生成当前portlet状态的标签内容,可能包含一个或多个screen。开发者必须重载GenericPortlet.doView()方法。此模式是所有的portlet都必须实现的。

EDIT模式

用来编辑portlet模式。必须重载GenericPortlet.doEdit()方法。此模式并不要求实现。

HELP模式

提供有关portlet的信息。重载GenericPortlet.doHelp()方法。此模式并不要求实现。

此外,还可以创建自定义的模式。定制的portlet必须重载GenericPortlet.doDispatch()方法

在描述文件中指明所支持的模式,元素是,见下例子:

      

       text/html

       edit

       help

      

portlet窗口状态

窗口状态可以用来指示当前页面的有效空间, portlet可以根据窗口状态来进行不同的输出。

内置状态分为三种:NORMALMAXIMIZEDMINIMIZED,此外还可以自定义状态。

portlet上下文

PortletContext实现,必须与ServletContext一致。

主要方法:getPortalInfogetPropertygetPropertyNamesgetSupportedPortletModesgetSupportedWindowStates

PortletRequest

PortletRequest有两个子类:

       ActionRequest

       RenderRequest

主要方法:

getParameter返回指定名称参数的第一个值

getParameterNames返回指定名称参数数组名称

getParameterValues 返回指定名称参数的值数组

getParameterMap

portlet容器不会将request的参数传播到外面,除非portletprocessAction中,调用了ActionRequest.setRenderParameter。不同portlet之间的request是不可见的。

Attributes可以与JSPServlet共享,它用来在普通API无法应用的场合。

Propertiesportlet容器指定,用来获取http的某些特性, 包括:content-length, content-type, accept-language等等。前缀为“javax.portlet.”的属性及参数是保留名称。

PortletRequest的生命周期

仅在processAction方法或render调用期间。

PortletResponse

PortletResponse有两个子类:

       ActionResponse

       RenderResponse

PortletResponse的主要方法:

setProperty

addProperty

encodeURL

sendRedirect

ActionResponse接口

       允许重定向、设置参数、改变窗口状态及模式。

       setRenderParameter

RenderResponse接口

       允许设置标题、内容。

       setContentType

       getPortletOutputStream

       getWriter

生命周期:在processAction方法或render调用期间。

Portlet参数

Portlet通过参数来获取各种属性,接口是:PortletPreferences

Portlet只能在processAction调用的时候修改参数。

本地化参数

根据ResourceBundle类进行实现。

命名规则:’javax.portlet.preference.description.

验证:

实现:PreferencesValidator,并且必须以线程安全的模式实现,它在JVM中必须是单子的。

当有验证器与参数关联时,PortletPreferences.store()必须调用验证器的validate()方法。

参数的修改必须是原子性。

会话PortletSession

变量范围定义

一是应用程序级别APPLICATION_SCOPE

二是Portlet级别PORTLET_SCOPE

APPLICATION_SCOPE必须采用前缀表示法来进行属性的存取。

当使用PortletSessionUtil类进行属性的访问时,对PORTLET_SCOPE的变量不用采取前缀,建议用取这种方法。

PortletSessionHttpSession的关系

PortletSessionHttpSession中的属性必须是互相可见的。

PORTLET_SCOPE属性必须加上前缀,两种session必须一致。

APPLICATION_SCOPE的属性名称必须是一致的。

javax.portlet.”前缀的属性名称是保留的,开发者不能使用。

缓存Cache

 超时缓存,不要求实现。

      

              300

      

使用RenderResponse设置属性可以改变缓存EXPIRATION_CACHE,如果设置为0则不使用缓存,设置为-1则缓存永不过时。在描述文件中没有定义,但程序中设置了的话,会被忽略。

Portlet应用

Portlet应用是一个web应用,并且可以用于不同的portlet容器中。

Portlet应用与web应用的关系:由servlet容器管理所有的组件、资料(除portlet外)。

Portlet应用与PortletContext的关系:由容器实现一对一。

目录结果:

/WEB-INF/portlet.xml

/WEB-INF/classes

/WEB-INF/lib

ClassLoader:与servlet同样。

标记库

<%@ taglib uri=”http://java./portlet” prefix=”portlet” %>

defineObjects定义了以下几个变量:

       RenderRequest

       RenderResponse

       PortletConfig

actionURL用来创建URL,定义了以下几个变量:

       String windowState

       String portletMode

       String var

       String secure

20

namespace定义了当前portlet的一个唯一值,用于输出时确保名称的唯一性,例如javascript函数名。

param用来加入到URL中,必须在actionURL的内部定义。

例如:myParam value=someValue/>

定制的Portlet模式

about, config, edit_defaults, priview, print

不允许的标记

基于HTML:base, body, iframe, frame, frameset, head, html, title

基于XHTML:base, body, iframe, head, html, title

不太兼容的标记:link,meta,style

Portlet标准虽不复杂,但其在整个portal应用中不过是冰山一角。实际上,实现一个portal是一个非常庞大的工程,它几乎等同于一个IDE的开发,Bea WebLogic在这方面可以说是业界的先锋,其IDE环境workshop,已完全集成了Portal的开发,达到了可视化目的,这也是下一节所要详述的。

WebLogic Portal

其实Bea WebLogic Portal7.0就已是一个十分成熟的门户框架, Portal8.1更是一个出色的产品,它与workshop开发环境的无缝集成,使开发者的解决方案速度大大地加快,从某种意义上来说,只要会配置portal,可以不用写一行代码就可以实现一个门户应用。那么就让我们来看看如何配置Weblogic

首先来看看Portal的基本概念:

基础概念--配置篇

Desktop

       Portal桌面,每个portal可以具有多个桌面。

       一个桌面可以具有多个书册

Book

       书册,等同于传统软件界面的tab,是由desktop包容的。

书册是可以嵌套的,即一个书册中可以再嵌入另一个书册

一个书册可以包含多个页面。

Page

       页面,每个book可以包含多个页面。

一个页面可以包含多个portlet

基础概念--开发篇

User Porfile Property Set

用户配置属性集,用来存储用户信息。

User Segment

用户分段,用来分用户划分等级,应用程序可以根据等级进行不同的逻辑处理,例如可以实现网上购物的用户等级划分

Content Selector

内容选择符

Campaign

活动,用来定义门户事件逻辑处理。

PlaceHolder

占位符,是web网页上的一个表示空间,可以存放文字、图片或shockware等信息。

目录结构

compaigns

framework

       markup

              layout:布局,用来安排网页的表现形式

              lookandfeel:外观

              menu:菜单

              shell:外壳

              theme:主题

       skeletons骨架,此目录一般包括种jsp资源,包括header.jsp/footer.jsp等。

       skins,外观,即网页的表现形式

portlets存放portlets的目录

visitorTools用户访问工具,利用此工具可以定义portal的外观、布局。

导航菜单

       Multi Level Menu多层菜单,即类似于windows菜单系统。

       Single Levle Menu单层菜单

作用域

       desktop::lookandfee::shell::book::page::portlet

开发步骤

1.         使用configuration wizard建立一个portal domain

2.         新建一个portal application

3.         在应用中新建一个portal project

4.         在项目中新一个portal

5.         在项目中新建一个portlet

6.         portal中,插入新建的portlet

杂项

Portal8.1还具有如下特性:

实现了jsr168标准。

支持用户自定义桌面、外观。

你可以在如下路径中找到相关标准接口:

%weblogic81%portallib etuixsystemextsystemportlet.jar

portlet包含器的位置是:

%weblogic81%portallib etuixwebportlet-container.jar

此外,对于WebLogic Portal,最重要的包莫过于:

%weblogic81%portallib etuixsystem etuix_system.jar

WebLogic Portal原理及应用

生命周期

WebLogic Portal使用了流行的单入口方法实现portal,在web.xml文件中,你会看到类似如下的两个servlet

AppManagerServlet=com.bea.netuix.servlets.manager.PortalServlet

PortletServlet=com.bea.netuix.servlets.manager.PortletServlet

对于任何扩展名为portal的访问,都会由PortalServlet进行解释,这种熟悉的解决是否令你想起了strutsaxis?在bea portal中,对struts的支持已是相当完善的了,不过,还有更好的框架,那就是page flow

PortletServlet继承了UIServlet,而后者则继承了Servlet,这样一来,你就可以猜到它的生命周期了吧。

内部流程:

PortalServlet.service

       UIServlet.service

              Lifecycle.run

                     ControlTreeWalker.walk

                            JspRenderer.beginRender

                            JspRenderer.endRender

参数传递

调用portlet时,可能会传递一些参数进去,例如对于信息发布系统,在同一页面可能需要显示多个栏目的新闻,即在同一个page中可能调用同一个portlet的多个实例,此时,传递参数是实现这个方案的关键。

对于传统的jsp来说,是通过include中来传递参数。而对于portlet来说,JSR168已指定的一个标准,此外,Weblogic Portal也提供了一个实现方案。详细描述见下:

JSR168标准

       1、在portlet.xml部署文件中进行参数值指定,见下面例子。

    xsi:schemaLocation="http://java./xml/ns/portlet"

    xmlns="http://java./xml/ns/portlet/portlet-app_1_0.xsd">

      

             

              info

              InfoView

             

                     text/html

                     edit

             

             

                    

             

             

                    

                            showChannelTitle

                            true

                    

             

      

2、获取、设置参数:

<%@taglib uri="http://java./portlet" prefix="portlet"%>

<%@page import="javax.portlet.PortletPreferences"%>

<%

PortletPreferences prefs = renderRequest.getPreferences();  

String showChannelTitle = prefs.getValue("showChannelTitle","true");  

%>

WebLogic Portal8.1用法

       1、在portlet窗口中,新建一个Prefenrence,见下图:

       2、为Prefenrence指定参数值。见下图:

       3、获取、设置Prefenrence

       使用Weblogic提供的标记库,包括:getPreference、getPreferences等。

Cache机制

       Portal使用的是Weblogic的公共Cache机制,在portlet部署中可以独立指定Cache的超时时间。

用户认证

       Portal用户认证,使用是的weblogic的安全机制,参见如下流程:

       com.bea.p13n.security.Authentication.login(p13n_system.jar)

              weblogic.servlet.security.ServletAuthentication.weak(weblogic.jar)

                     weblogic.servlet.security.internal.SecurityModule.checkAuthenticate

       由此,我们可以得出结论,portal用户是基于weblogic平台的用户,它与weblogic控制端的安全用户定义是互相可见的。但是,用户群组及用户角色则portal专有的,与weblogic server的控制端无任何关系。

输出机制

       显然,客户端输出的生命周期与类调用的顺序是一样的,见如下描述:

skeleton.beginRender

layout.beginRender

portlet.beginRender

portlet.endRender

layout.endRender

skeleton.endRender

WebLogic Portal设计模式

Singleton模式

       此模式是得到最广泛应用的,Portal中大量地应用到此模式,例如Debug类便实现了此模式。

Factory模式

       用户属性集中便用到此模式,

       Factory:ProfileFactory

       Object:ProfileWrapper

Visitor模式

       Portal的生命周期中,使用了visitor模式进行客户端的渲染(render)。具体由Lifecycle使用Visitor模式驱动lifecycle通过整个control tree

       vistor:ControlVisitor

       concreteVisitor: ControlLifeCycleRootLifeCycle内置了多个visitor,用来进行portlet的渲染。

       Element:UIControl

       ConcreteElement: PresentationControl

Facade模式:

       事件服务通过facade模式提供。

       类:EventService

State模式:

       类:Event

       在不同的状态下实现不同的行为。

Observer模式

       事件机制使用了Observer模式

       Observer:EventListener,接收来自于EventHandle的事件,此事件是本类经过注册的。

       Subject:EventHandle,用于分派事件到EventListener

Abstract Factory模式

       Portal大量地使用了抽象工厂模式,原因是由于portal中大量地使用了可配置组件,例如ButtonEventContext等等。

WebLogic Portal集成

远程Portlet

       Weblogic Portal8.1支持远程portlet,目前提供了wsrp(Web Services for Remote Portlets)可提供与远程portlet集成。

       wsrp是基于producerconsumer的方式实现的,远程的portlet服务即为procuder,而当前 portal服务器即为consumer

       其框图见下:

       基于weblogic portal的应用,能够不加任何编码或任何第三方软件即可实现单点登录(sso)。前提是必须在使用远程portlet前,在当前portal中登录。

       wsrp是基于web service协议实现的,它已与workshop达到了无缝集成。具体情况请参考:

集成OA

利用compoze portlet for weblogic,可以很好地与这DominoExchange Server进行交互,但是,使用compoze portlet还有一个限制,那就是那只能集成notes环境,如果你的oa是基于IE的话,那么还需要在服务器端进行开发修改。

单点登录SSO

       weblogic本身并不提供SSO解决方案,但是由于其良好的架构以及对安全体系技术的支持,很容易利用第三方工具,例如SiteMinder,达到支持SSO功能。当然,你可以自己实现单点登录,但要做的工作就相当多啦,这已不是本文要讨论的范围了。

总结
由于目前web资源越来越有整合的趋势,故门户建设也已达到势在必行的地步,大中型企业、政府部门的这种需求更是强烈。因此,如何充分利用好portal,实现企业资源的整合,也成了解决方案提供商必须掌握的功课。
portal是一个相当复杂的框架,需要不断的学习与理解,也需要不断的创新。

关于作者:
林海滨
高级软件工程师,系统分析员。
任职于智软(中国)电脑开发有限公司,负责软件架构及系统设计

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多