朝鲜偷渡韩国:深入理解Weblogic Portal8.1

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 14:43:52
作者:林海滨 (dev2dev ID:linhibin)
摘要
本文着重于从理论与应用的角度,对Bea WebLogic Portal8.1做一个介绍和分析,详细介绍JSR168标准,并对Portal基本原理及经常碰到的问题进行讨论。
Portal简介...
什么是Portal?.
什么是Portlet?.
Portal标准...
Portlets与Servlet的异同?...
相同点...
不同点...
portlet优点...
portlet与servlet的关系...
portlet无法做到的事情...
Portlets实例...
Portlet生命周期...
Portlet URLs.
如何生成Portlet URL.
如何使用Portlet URL.
portlet模式...
VIEW模式...
EDIT模式...
HELP模式...
portlet窗口状态...
portlet上下文...
PortletRequest
PortletResponse.
Portlet参数...
会话PortletSession.
变量范围定义...
PortletSession与HttpSession的关系...
缓存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是一个基于web的应用程序,它主要提供个性化、单点登录、不同来源的内容整合以及存放信息系统的表示层。
Portlet是基于java技术的web组件,它由portlet容器管理、并处理请求,并动态生成输出内容。
Portlet的输出是一个片段,即不是一个完整的页面。
标准
为规范Portal,SUN于2003年底制定了JSR168,它定义了portlet标准,并给出了一个实现接口。
与Servlet的异同?
基于web应用的java技术
由特定的容器管理
动态生成内容
生命周期由容器进行管理
通过request/reponse进行交互
portlet只生成片段
portlet并不直接绑定到某一个URL上
portlet通过portal进行交互
portlet可以多次在同一个portal页面上同时出现
优点
能访问到用户配置信息
能在不同的域中存储会话:应用程序级到私有级。
与servlet的关系
前者能调用后者,并且能共享信息,包括:Attributes
portlet容器是servlet容器的扩展
无法做到的事情
设置response的字符集编码
设置http header
获取客户端的request
实例
如果是在普通的场合下使用,即不是在分布式场合,则每个portal应用就会生成一个portlet实例。而如果是在分布式场合下使用的话,则每个jvm只有一个实例。
生命周期
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从服务区中删除。
RenderResponse.createActionURL
RenderResponse.createRenderURL
调用setParameter、setParameters可以用来设置参数.
开发者不可以对参数进行任何编码,它(编码)是由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应执行的功能,标准定义了三种:VIEW, EDIT, HELP。
模式
用来生成当前portlet状态的标签内容,可能包含一个或多个screen。开发者必须重载GenericPortlet.doView()方法。此模式是所有的portlet都必须实现的。
模式
用来编辑portlet模式。必须重载GenericPortlet.doEdit()方法。此模式并不要求实现。
模式
提供有关portlet的信息。重载GenericPortlet.doHelp()方法。此模式并不要求实现。
此外,还可以创建自定义的模式。定制的portlet必须重载GenericPortlet.doDispatch()方法
在描述文件中指明所支持的模式,元素是,见下例子:
text/html
edit
help
窗口状态
窗口状态可以用来指示当前页面的有效空间, portlet可以根据窗口状态来进行不同的输出。
内置状态分为三种:NORMAL、MAXIMIZED、MINIMIZED,此外还可以自定义状态。
上下文
由PortletContext实现,必须与ServletContext一致。
主要方法:getPortalInfo、getProperty、getPropertyNames、getSupportedPortletModes、getSupportedWindowStates
PortletRequest有两个子类:
ActionRequest
RenderRequest
主要方法:
getParameter返回指定名称参数的第一个值
getParameterNames返回指定名称参数数组名称
getParameterValues 返回指定名称参数的值数组
getParameterMap
portlet容器不会将request的参数传播到外面,除非portlet在processAction中,调用了ActionRequest.setRenderParameter。不同portlet之间的request是不可见的。
Attributes可以与JSP及Servlet共享,它用来在普通API无法应用的场合。
Properties由portlet容器指定,用来获取http的某些特性, 包括:content-length, content-type, accept-language等等。前缀为“javax.portlet.”的属性及参数是保留名称。
PortletRequest的生命周期
仅在processAction方法或render调用期间。
PortletResponse有两个子类:
ActionResponse
RenderResponse
PortletResponse的主要方法:
setProperty
addProperty
encodeURL
sendRedirect
ActionResponse接口
允许重定向、设置参数、改变窗口状态及模式。
setRenderParameter
RenderResponse接口
允许设置标题、内容。
setContentType
getPortletOutputStream
getWriter
生命周期:在processAction方法或render调用期间。
参数
Portlet通过参数来获取各种属性,接口是:PortletPreferences
Portlet只能在processAction调用的时候修改参数。
本地化参数
根据ResourceBundle类进行实现。
命名规则:’javax.portlet.preference.description.
验证:
实现:PreferencesValidator,并且必须以线程安全的模式实现,它在JVM中必须是单子的。
当有验证器与参数关联时,PortletPreferences.store()必须调用验证器的validate()方法。
参数的修改必须是原子性。
一是应用程序级别APPLICATION_SCOPE,
二是Portlet级别PORTLET_SCOPE。
APPLICATION_SCOPE必须采用前缀表示法来进行属性的存取。
当使用PortletSessionUtil类进行属性的访问时,对PORTLET_SCOPE的变量不用采取前缀,建议用取这种方法。
与HttpSession的关系
在PortletSession与HttpSession中的属性必须是互相可见的。
PORTLET_SCOPE属性必须加上前缀,两种session必须一致。
APPLICATION_SCOPE的属性名称必须是一致的。
“javax.portlet.”前缀的属性名称是保留的,开发者不能使用。
超时缓存,不要求实现。
300
使用RenderResponse设置属性可以改变缓存EXPIRATION_CACHE,如果设置为0则不使用缓存,设置为-1则缓存永不过时。在描述文件中没有定义,但程序中设置了的话,会被忽略。
应用
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.sun.com/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”/>
模式
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的开发,达到了可视化目的,这也是下一节所要详述的。
其实Bea WebLogic Portal7.0就已是一个十分成熟的门户框架, Portal8.1更是一个出色的产品,它与workshop开发环境的无缝集成,使开发者的解决方案速度大大地加快,从某种意义上来说,只要会配置portal,可以不用写一行代码就可以实现一个门户应用。那么就让我们来看看如何配置Weblogic。
首先来看看Portal的基本概念:
配置篇
Portal桌面,每个portal可以具有多个桌面。
一个桌面可以具有多个书册
书册,等同于传统软件界面的tab,是由desktop包容的。
书册是可以嵌套的,即一个书册中可以再嵌入另一个书册
一个书册可以包含多个页面。
页面,每个book可以包含多个页面。
一个页面可以包含多个portlet。
开发篇
用户配置属性集,用来存储用户信息。
用户分段,用来分用户划分等级,应用程序可以根据等级进行不同的逻辑处理,例如可以实现网上购物的用户等级划分
内容选择符
活动,用来定义门户事件逻辑处理。
占位符,是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使用了流行的单入口方法实现portal,在web.xml文件中,你会看到类似如下的两个servlet:
AppManagerServlet=com.bea.netuix.servlets.manager.PortalServlet
PortletServlet=com.bea.netuix.servlets.manager.PortletServlet
对于任何扩展名为portal的访问,都会由PortalServlet进行解释,这种熟悉的解决是否令你想起了struts或axis?在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也提供了一个实现方案。详细描述见下:
标准
1、在portlet.xml部署文件中进行参数值指定,见下面例子。
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet"
xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
info
InfoView
text/html
edit
showChannelTitle
true
2、获取、设置参数:
<%@taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@page import="javax.portlet.PortletPreferences"%>
<%
PortletPreferences prefs = renderRequest.getPreferences();
String showChannelTitle = prefs.getValue("showChannelTitle","true");
%>
用法
1、在portlet窗口中,新建一个Prefenrence,见下图:

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

3、获取、设置Prefenrence
使用Weblogic提供的标记库,包括:getPreference、getPreferences等。
机制
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
设计模式
模式
此模式是得到最广泛应用的,Portal中大量地应用到此模式,例如Debug类便实现了此模式。
模式
用户属性集中便用到此模式,
Factory:ProfileFactory
Object:ProfileWrapper
模式
Portal的生命周期中,使用了visitor模式进行客户端的渲染(render)。具体由Lifecycle使用Visitor模式驱动lifecycle通过整个control tree
vistor:ControlVisitor 、
concreteVisitor: ControlLifeCycle及RootLifeCycle内置了多个visitor,用来进行portlet的渲染。
Element:UIControl
ConcreteElement: PresentationControl
模式:
事件服务通过facade模式提供。
类:EventService
模式:
类:Event
在不同的状态下实现不同的行为。
模式
事件机制使用了Observer模式
Observer:EventListener,接收来自于EventHandle的事件,此事件是本类经过注册的。
Subject:EventHandle,用于分派事件到EventListener
模式
Portal大量地使用了抽象工厂模式,原因是由于portal中大量地使用了可配置组件,例如Button、Event、Context等等。
集成
Weblogic Portal8.1支持远程portlet,目前提供了wsrp包(Web Services for Remote Portlets)可提供与远程portlet集成。
wsrp是基于producer及consumer的方式实现的,远程的portlet服务即为procuder,而当前 portal服务器即为consumer。
其框图见下:

基于weblogic portal的应用,能够不加任何编码或任何第三方软件即可实现单点登录(sso)。前提是必须在使用远程portlet前,在当前portal中登录。
wsrp是基于web service协议实现的,它已与workshop达到了无缝集成。具体情况请参考:
利用compoze portlet for weblogic,可以很好地与这Domino、Exchange Server进行交互,但是,使用compoze portlet还有一个限制,那就是那只能集成notes环境,如果你的oa是基于IE的话,那么还需要在服务器端进行开发修改。
weblogic本身并不提供SSO解决方案,但是由于其良好的架构以及对安全体系技术的支持,很容易利用第三方工具,例如SiteMinder,达到支持SSO功能。当然,你可以自己实现单点登录,但要做的工作就相当多啦,这已不是本文要讨论的范围了。
总结
由于目前web资源越来越有整合的趋势,故门户建设也已达到势在必行的地步,大中型企业、政府部门的这种需求更是强烈。因此,如何充分利用好portal,实现企业资源的整合,也成了解决方案提供商必须掌握的功课。
portal是一个相当复杂的框架,需要不断的学习与理解,也需要不断的创新。
关于作者:
林海滨
高级软件工程师,系统分析员。
任职于智软(中国)电脑开发有限公司,负责软件架构及系统设计