Portal简介什么是Portal?Portal是一个基于web的应用程序,它主要提供个性化、单点登录、不同来源的内容整合以及存放信息系统的表示层。 什么是Portlet?Portlet是基于java技术的web组件,它由portlet容器管理、并处理请求,并动态生成输出内容。 Portlet的输出是一个片段,即不是一个完整的页面。 Portal标准为规范Portal,SUN于2003年底制定了JSR168,它定义了portlet标准,并给出了一个实现接口。 Portlets与Servlet的异同?相同点基于web应用的java技术 由特定的容器管理 动态生成内容 生命周期由容器进行管理 通过request/reponse进行交互 不同点portlet只生成片段 portlet并不直接绑定到某一个URL上 portlet通过portal进行交互 portlet可以多次在同一个portal页面上同时出现 portlet优点能访问到用户配置信息 能在不同的域中存储会话:应用程序级到私有级。 portlet与servlet的关系前者能调用后者,并且能共享信息,包括: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 URLRenderResponse.createActionURL RenderResponse.createRenderURL 调用setParameter、setParameters可以用来设置参数. 如何使用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()方法 在描述文件中指明所支持的模式,元素是
portlet窗口状态窗口状态可以用来指示当前页面的有效空间, portlet可以根据窗口状态来进行不同的输出。 内置状态分为三种:NORMAL、MAXIMIZED、MINIMIZED,此外还可以自定义状态。 portlet上下文由PortletContext实现,必须与ServletContext一致。 主要方法:getPortalInfo、getProperty、getPropertyNames、getSupportedPortletModes、getSupportedWindowStates PortletRequestPortletRequest有两个子类: 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调用期间。 PortletResponsePortletResponse有两个子类: 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的变量不用采取前缀,建议用取这种方法。 PortletSession与HttpSession的关系在PortletSession与HttpSession中的属性必须是互相可见的。 PORTLET_SCOPE属性必须加上前缀,两种session必须一致。 APPLICATION_SCOPE的属性名称必须是一致的。 “javax.portlet.”前缀的属性名称是保留的,开发者不能使用。 缓存Cache超时缓存,不要求实现。
使用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同样。 标记库
defineObjects定义了以下几个变量: RenderRequest RenderResponse PortletConfig actionURL用来创建URL,定义了以下几个变量: String windowState String portletMode String var String secure
namespace定义了当前portlet的一个唯一值,用于输出时确保名称的唯一性,例如javascript函数名。 param用来加入到URL中,必须在actionURL的内部定义。 例如:
定制的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的基本概念: 基础概念--配置篇DesktopPortal桌面,每个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进行解释,这种熟悉的解决是否令你想起了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也提供了一个实现方案。详细描述见下: JSR168标准1、在portlet.xml部署文件中进行参数值指定,见下面例子。
2、获取、设置参数:
WebLogic Portal8.1用法1、在portlet窗口中,新建一个Prefenrence,见下图:
2、为Prefenrence指定参数值。见下图:
3、获取、设置Prefenrence 使用Weblogic提供的标记库,包括: 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: ControlLifeCycle及RootLifeCycle内置了多个visitor,用来进行portlet的渲染。 Element:UIControl ConcreteElement: PresentationControl Facade模式:事件服务通过facade模式提供。 类:EventService State模式:类:Event 在不同的状态下实现不同的行为。 Observer模式事件机制使用了Observer模式 Observer:EventListener,接收来自于EventHandle的事件,此事件是本类经过注册的。 Subject:EventHandle,用于分派事件到EventListener Abstract Factory模式Portal大量地使用了抽象工厂模式,原因是由于portal中大量地使用了可配置组件,例如Button、Event、Context等等。 WebLogic Portal集成远程PortletWeblogic 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达到了无缝集成。具体情况请参考: 集成OA利用compoze portlet for weblogic,可以很好地与这Domino、Exchange Server进行交互,但是,使用compoze portlet还有一个限制,那就是那只能集成notes环境,如果你的oa是基于IE的话,那么还需要在服务器端进行开发修改。 单点登录SSOweblogic本身并不提供SSO解决方案,但是由于其良好的架构以及对安全体系技术的支持,很容易利用第三方工具,例如SiteMinder,达到支持SSO功能。当然,你可以自己实现单点登录,但要做的工作就相当多啦,这已不是本文要讨论的范围了。 总结 关于作者: |
|