JSR168PORLET标准手册汉化整理本规范汉化资源搜集整理于网上并由我作了些修改和添加,主要为适应大陆的语辞、用语及其他未译之处。由于本人于水平有限,如有错误,请各位高手指正;若有高见,希望不吝言辞,同为中国开源作项献。特此严重感谢翻译此规范的原译者:第一、第二章节台湾省Jini第三章节上海市风之舞第四章~最后章节台湾省kojilinPLT.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)Portlet1)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窗口Portlet内容portal页面PLT.4.2PortalPageCreation参考kojilinportlets在portletcontainer内执行,portletcontainer接收portlets产生的内容。通常portletcontainer将这些内容提交给portalserver,portalserver从这些内容建立portalpage然后将它传给客户端。(参考SpecFigure4-2)PLT.4.3PortalPageRequestSequence使用者经由客户端设备(例如浏览器)存取portal,portal根据接收到的request决定哪些portlets需要被执行以满足需求。portal通过portletcontainer呼叫portlets,然后由portlets产生的片段建立portalpage,再传回客户端呈现给使用者。PLT.5ThePortletInterfacePortletinterface是PortletAPI中主要的抽象接口,所有的portlet不是直接操作这个接口,就是继承了这个接口类。PortletAPI包含GenericPortlet类,此类提供了一些预设的功能;开发人员应该继承、直接或间接地拓展GenericPortlet类,以写出自己的portlet。PLT.5.1NumberofPortletInstancesPortletContainer如何产生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.1LoadingandInstantiationportletcontainer负责载入和实例化portlet。当portletcontainer运行portletapplication或者延迟至portlet需要服务使用者请求时,portlet就会被载入和实例化。在Webapplication下的portletapplication中,portletcontainer用来载入portlet的ClassLoader和Servletcontainer的ClassLoder是相同的。载入portletclass后,portletclass就被实例化。PLT.5.2.2Initializationportlet物件实例化后,portletcontainer还必须初始化portlet,以调用portlet去处理客户端要求。Protlet经由初始化完成初始高代价的资源(例如在背景扫行的连