JSR168PORTLET标准必备资料.docx
《JSR168PORTLET标准必备资料.docx》由会员分享,可在线阅读,更多相关《JSR168PORTLET标准必备资料.docx(45页珍藏版)》请在冰豆网上搜索。
JSR168PORTLET标准必备资料
JSR168PORLET标准手册汉化整理
PLT.1.1序言参考jini
许多大型企业的网站,渐渐采用了portalserver作为开发的基础.至于什么是portal呢,中文翻译为"门户网站"。
有人可能想..天杀的..门户网站不是就像yahoo,pchome,yam等等。
不过,我们现在讨论的portalserver,不是那么地简单,基本上yahoo,pchome,yam那些只能称为搜索引擎的门户网站。
如果你从来沒有用过portalserver或是似懂非懂..大家可以连结到MyNetscape或MyYahoo去注册一个帐号。
因为MyNetscape的样式比较好看,所以我接下来就以MyNetscape为介绍的范例。
如果你第一次接触到portal,你会惊讶的发现...哇..为何一个网站里面充满了这么多小窗口.我们称这些小窗口叫做"portlet",而且每个小窗口都存在着独立的信息与内容,可以放到最大化,缩小,还原,关闭等等。
当你登陆之后,可以选择及调整自己portlet的配置,也可以设置自己喜爱的风格与样式,更可以设置每个portlet的资料配置。
这种以客户为上帝的系统,就是我们将要介绍的portal。
PLT.2.1什么是Portal(门户)?
Portal的组成可以分为三部份
(1)PortalServer
(2)PortletContainer(3)Portlet
1)PortalServer的定义是
一个Portal(门户网站)就是指一个Web-based的系统,通常都会提供个人化设置、单一登陆、以及由各种不同来源或不同网站取得各式各样的信息,并且将这些信息放在网页之中组合而成的呈现平台,门户网站会有精巧的个人化设置去提供定制的网页,当不同等级的使用者来浏览该页面将获得不同的信息内容。
2)PortletContainer的定义是
portletcontainer是提供portlets执行的环境,包含了许多portlets并且管理他们的生命周期,他也会永远保存着portlets的喜好设置,一个portletcontainer接收到来自portal的请求后,接着将这个请求传递给存在container的portlet执行。
portletcontainer没有义务去组合portlets产生的信息內容,这个工作必须由portal来处理。
portal和portletcontainer可以放在一起视为同一个系统的组件,或者分开成为两个独立的组件。
PLT.2.2什么是Portlet?
一个Portlet是以Java技术为技术的Web组件,由PortletContainer所管理,专门处理客户的request以及产生各种动态的信息内容。
Portlets为可插式(pluggable)的客户界面组件,提供呈现层成为一个信息系统。
这些由portlet产生的内容也被称为片段(fragment),而片段是具有一些规则的Markup(HTML、XHTML、WML),而且可以和其他的片段组合而成一个复杂的文件。
而Portlet中的内容正常来说是与其他Portlet的内容聚合而成为一个Portal网页。
而Portlet的生命周期是被PortletContainer所管理控制的。
客户端和portlets的互动是由portal通过典型的request/response方式实现,正常来说,客户会和portlets所产生的内容互动,举例来说,根据下一步的连接或者是确认送出的表单,结果portal将会接收到portlet的动作,将这个处理状况转向到目标portlet。
这些portlet内容的产生可能会因为不同的使用者而有不同的变化,完全是根据客户对于这个portlet的设置。
PLT.2.3portlet与servlet的关系?
Portlet和Servlet算是兄弟有那么一点点相似却又有那么一点点不同,因为Servlet和Portlet不尽然相同,所以研究小組決定将portlets定义成为一个新的组件,因此定义了portlets一个新的并且明确的界面与行为。
为了尽可能与现有的servlet结合达到重复使用的目的,portlet的规范利用了servlet的规范,许多观念都很相似的,结合portlets、servlets及jsp在同一个网站系统中,我们称为portletapplication。
在同一个portletapplication中,他们将分享同一个classloader,context及session。
1)Portlet和Servlet的相似之处
@portlets也是Java技术的web组件
@portlets也是有特定的container在管理
@portlets可以动态产生各种内容
@portlets的生命周期由container所管理
@portlets和客户端的互动是通过request/response的机制
2)Portlet和Servlet也有一些不同
@portlets只产生markup信息片段,不是完整的网页文件。
而Portal会将所有的Portletmarkup信息片段放到一个完整的Portal网页。
@portlets不会和URL有直接的关系
@客户端必须通过portal系统才能和portlets互动
@portlets有一些定义好的request处理,actionrequest以及renderrequest。
@portlets默认定义portletmodes及窗口状态可以指出在网页中该portlet的哪个功能正在执行及现在的状态。
@portlets可以在同一个portal网页之中存在多个。
3)Portlet有一些附加的功能是Servlet所没有的
@Portlets能够存取及储存永久配置文件及定制资料。
@portlets可以存取使用者数据
@portlets具有URL的重写功能在文件中去动态建立连结,允许portalserver不用去知道如何在网页的片段之中建立连结及动作。
@portlets可以储存临时性的数据在portletsession之中,拥有两个不同的范围:
application-widescope及portletprivatescope。
4)Portlet不具有一些功能,但是Servlet却有提供
@servlet具有设置输出的文字编码(charactersetencoding)方式
@servlet可以设置HTTP输出的header
@servlet才能够接收客户对于portal发出的URL请求
PLT.3.1从Portlets到Servlets/JSPs的关联
Portlets可以调用servlets,JSPs和JSPs标签库来产生内容。
一个portlet可以使用请求发送者来调用servlets和JSPs,就像servlet使用调用其它servlets和JSPs一样。
为了使portlets和servlets之间整合得天衣无缝,Portlet规范允许调用更多的servlet对象。
当servlet或JSP在portlet中被调用时,传给servlet或JSP的request是以portletrequest为基础的。
同样,传给servlet或JSP的response是以portletresponse为基础的。
被包括的servletrequest可使用portletrequest的Attributes设置。
portlet和被包括的servle或JSP分享同一个的输出流。
portlet会话中的Attributes设置可以来自于servlet会话,反之亦然。
PLT.3.2Servlet容器和Portlet容器的关系
portlet容器是servlet容器的扩展,所以一个portlet容器可以构建于一个已存在的servlet容器之上或者可能实现servlet容器的全部功能。
无论portlet容器如何实现,它的运行环境总是假定它支持Servlet2.3规范。
PLT.4.1ElementsofaPortalPage(Portal页面的结构)
一个portlet能产生标记片段。
portal通常在portlet产生的标记片段中加上标题,控制按钮及其它修饰。
这个新的标记片段称为portlet窗口。
然后portal合并这些portlet窗口为一个完整的文档,即portal页面
修饰和控件
标题portlet片段
portlet窗口
portal页面
PLT.4.2PortalPageCreation参考kojilin
portlets在portletcontainer内执行,portletcontainer接收portlets产生的内容。
通常portletcontainer将这些内容提交给portalserver,portalserver从这些内容建立portalpage然后将它传给客户端。
(参考SpecFigure4-2)
PLT.4.3PortalPageRequestSequence
使用者经由客户端设备(例如浏览器)存取portal,portal根据接收到的request决定哪些portlets需要被执行以满足需求。
portal通过portletcontainer呼叫portlets,然后由portlets产生的片段建立portalpage,再传回客户端呈现给使用者。
PLT.5ThePortletInterface
Portletinterface是PortletAPI中主要的抽象接口,所有的portlet不是直接操作这个接口,就是继承了
这个接口类。
PortletAPI包含GenericPortlet类,此类提供了一些预设的功能;开发人员应该继承、直接或间接地拓展
GenericPortlet类,以写出自己的portlet。
PLT.5.1NumberofPortletInstances
PortletContainer如何产生portletinstances是被布署描述(deploymentdescriptor)中portlet的
定义所控制的。
在没有分布式的环境中(默认情况),portletcontainer必须实例化一个并且只能使用一个portlet物件来对应一个portlet定义。
另一方面,在某种情况下,portlet在web.xml部署描述文件中被部署为分布式环境下的portlet应用程序的一部份。
那么,在同一虚拟机(VM)中,同一部署描述文件内,同一portlet定义下,一个portlet容器只能实例该portlet一次。
PLT.5.2PortletLifeCycle
一个portlet有着良好的生命周期管理,定义了怎样装载,实例化和初始化,怎样握持来自客户端的请求及怎样送出服务。
这个portlet生命周期由portlet接口的init,processAction,render和destroy方法来表达。
PLT.5.2.1LoadingandInstantiation
portletcontainer负责载入和实例化portlet。
当portletcontainer运行portletapplication或者
延迟至portlet需要服务使用者请求时,portlet就会被载入和实例化。
在Webapplication下的portletapplication中,portletcontainer用来载入portlet的ClassLoader
和Servletcontainer的ClassLoder是相同的。
载入portletclass后,portletclass就被实例化。
PLT.5.2.2Initialization
portlet物件实例化后,portletcontainer还必须初始化portlet,以调用portlet去处理客户端要求。
Protlet经由初始化完成初始高代价的资源(例如在背景扫行的连结),和执行其他只要执行一次的初始工作。
portletcontainer呼叫Portlet接口中init方法来初始化portlet,init方法中portlet的定义由拓展PortletConfig接口的物件来提供。
此configuration物件可取出定义在部署描述的初始化参数(initializationparameter)及ResourceBundle。
此configuration物件亦提供存取描述portletruntime环境的上下文(context)物件。
要了解PortletConfig接口的详细信息,请参考PLT.6PortletConfig章节。
要了解PortletContex接口的详细信息,请参考PLT.10PortletContext章节。
PLT.5.2.2.1ErrorConditionsonInitialization
在portlet初始化期间,portlet物件可能会丟出UnavailableException或PortletException异常。
此时,portletcontainer不能把portlet物件置入已启动的服务,并且portletcontainer必需释放这个
portlet物件。
destory方法不能被呼叫,因为初始化被认为执行失败。
发生failure后,portletcontainer会尝试着重新实例化及初始化portlet。
这个异常处理的规则是:
由一个
UnavailableException指定一个不能执行的最小时间,当此异常发生时,portletcontainer必需等到指定时间过去
后才产生并且初始化一个新的portlet物件。
在初始化过程中所丟出的RuntimeException异常,必需当作PortletException来处理。
PLT.5.2.2.2ToolsConsideration待续
PLT.6PortletConfig
PortletConfig物件,提供了在初始化一个portlet时所需要的信息。
同时可以通过此物件取得portletcontext和提供portlettitle-bar信息的resourcebundle。
译者注:
这里提到的“信息”指的是title,short-title,keyword。
PLT.6.1InitializationParameters
通过PortletConfig这个interface所提供的getInitParameterNames和getInitParameter这两个方
法,可以得知在portlets部署描述文件中所定义的portlet初始参数及初始值。
dummyName
dummyValue
PLT.6.2PortletResourceBundle
在Portlets的部署描述文件中,可以设定portlet的基本信息如portlettitle-bar的名称及portlet在portal中的分类名称。
为了显示这些信息,PortletSpec.定义了一些resourceelements让title,short-title,keyword可以根据Locale来显示。
(seethePLT.21.10ResourceBundlesSection)
在portlets部署描述文件中,这些resourceelements可以直接放在portlet的定义中,亦或是写在
resourcebundle(*.properties)里。
以下是一个定义portlet信息的例子:
…
StockQuotePortletStock
finance,stockmarket
…
假如这些信息的定义是写在resourcebundle中的话,此时这个portlet必须提供一个resourcebundle
的名字。
示例如下:
…
com.foo.myApp.QuotePortlet
…
假如portlet定义提供了一个resourcebundle的话,portlet-container则必须通过ResourceBundle
来lookup这些设定值。
假如rootresourcebundle没有设定这些信息,且同时这些信息是写在的话,portletcontainer必须把他们都设到rootresourcebundle里。
TCKPORTLET:
SPEC:
24提到:
假如使用ResourceBundle资源文件来定义,则Portletcontainer必须先lookup在ResourceBundle里定义的信息。
若是ResourceBundle没有这些信息,或是没有使用ResourceBundle来定,则portletcontainer必须lookup写在定义文件里的信息。
假如ResourceBundle和定义文件里都没有定义这些信息,则portletcontainer必须以空字符串来回
传。
假如在定义portlet时,没有定义resourcebundle,而是把信息定义在部署定义文件中,此时portlet
container则必须产生一个ResourceBundle,并且把这些信息放进来。
而使用的key值必须遵照PLT.21.10ResourceBundlesSection所定义的。
GenericPortlet的rendermethod在取得portlet的title名称时,就是使用PortletConfig的
ResourceBundle物件,通过相关的ResourceBundle设定或是直接写在portlet部署描述文件中的资料而来。
PLT.7PortletURLs
Portlet也许会在自己的内容里出现URLlink,同时这个URLlink是参考到自己本身。
比如说,当User在操作一个portlet里面的URL时(也就是说点选一个链接或是submit一张表单)。
对portal而言,此时是一个新的请求,而这个请求的目标就是那一个portlet。
那些URLs就称作为portletURLs。
PLT.7PortletURL
PortletAPI定义了一个PortletURL的接口。
Portlets必须用这个PortletURL物件来产生portletURLs。
在产生PortletURL的同时,PortletURL也会呼叫RenderResponse接口定义的两个方法:
createActionURL和createRenderURL。
createActionURL用来生成actionURLs。
createRenderURL用来生成renderURLs。
由于一些portal/portlet-containers在实际操作时可能会附加一些querystring在urllink上,以期提供这些container所需要的一些内部状态的参数等等,所以portlet开发者不应指定表单的传送方法为HTTPGET。
ex:
WebLogic会对urllink加上一些参数的例子。
http:
//localhost:
7001/my.portal?
_nfpb=true&_pageLabel=book_33
一个renderURL是对某些特殊类型actionURLS的一种优化。
在renderportletURL的过程中Portal/portlet-container不允许调用目标portlet的processAction方法。
Portal/portlet-container必须确保当在建构renderURL时所设定的参数,也能变成是在请求这个portlet时的参数。
RenderURLsshouldnotbeusedfortasksthatarenotidempotentfromtheportletperspective。
点击render过的URL发出的请求,portlet所产生的结果有可能会因为错误状况,缓存失效,外部资料的改变等等,而有所影响。
RenderURLs不应放在form表单里,因为portal/portlet-container有可能因此而忽略form表单的参数。
Portlets可以通过PortletURL所提供的setParameter和setParameters两个方法,对PortletURL物件设定一些应用程序的特殊参数。
setParameter这个方法必须把以前所设定的同名参数给取代掉。
所有portlet所加到PortletURL物件上的参数都必须为该portlet的可用请求参数。
Portlet开发者必须注意到renderrequest的请求参数并非在产生PortletURL时就被使用到。
portlet-container必须把加到portletURL物件上的参数名和值以“x-www-form-urlencoded“方式编码。
在这些参数名和值被添加到portletUR物件上之前,portlet开发人员不可以编码它们。
如果protal/portlet-container