1 2 3 Previous Next 42 Replies Latest reply on Jul 26, 2007 5:29 PM by 702619

    【长篇原创】Liferay Portal二次开发指南

    702619
      OpenDoc版权说明:
      本文档版权归原作者所有。
      在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。
      如需部分或者全文引用,请事先征求作者意见。
      如果本文对您有些许帮助,表达谢意的最好方式,是将您发现的问题和文档改进意见及时反馈给作者。当然,倘若有时间和能力,能为技术群体无偿贡献自己的所学为最好的回馈。



      随着信息化建设的深入,Portal 门户已经成为新型办公环境的一个重要组成部分。 Portal所提供的单点登录、权限控制、个性化定制、内容集成、文件管理等独特的功能, 已经大大占据公众的眼球,并在信息集成和消除信息孤岛方面发挥了重要的左右。
      随着Portal技术的成熟,以MyNestcape、MyYahoo、MSN-Space等为代表大型网站也较多的采用Portal架构来实现个性化的内容聚合和定制,以实现灵活的扩展的服务策略。
      Liferay Portal作为一个开源的Portal项目,利用Hibernate、Struts、Spring等开源框架,实现了JCP JSR168规范中提出的Portal功能,在开源Portal系统中有比较典型的代表性。
      本文从Liferay Portal的架构入手,详细讲解Portal的用户策略、内容布局、桌面和品质的要素,引导读者完成Liferay Portal初步的二次开发,在Liferay Portal上定制自己的Portlet。Liferay Portal程序框架和源码分析不在本文的讨论范围。
        • 1. Re: 【长篇原创】Liferay Portal二次开发指南
          702619
          目录     
          第一部分 Liferay Portal 架构解析
          第一章 Liferay Portal     
          第一节 Portal规范     
          1.1.1 JSR168     
          1.1.2 WSRP     
          第二节 什么是Portal     
          1.2.1 Portal 服务器     
          1.2.2 Portlet容器     
          第三节 什么是Portlet     
          1.3.1 Portlet     
          1.3.2 Portlet与Servlet的关系     
          1.3.3 Portlet的生命周期     
          第四节 Liferay Portal工作原理     
          1.4.1 Portlet 样式以及窗口状态
          1.4.2 Portal页面
          第二章Liferay Portal的使用
          第一节 Liferay Portal安装
          第二节 Liferay Portal的用户策略
          2.2.1 定义用户
          2.2.2 添加用户
          2.2.3 修改用户
          2.2.4 定义用户组     
          2.2.5 新增、重命名用户组     
          2.2.6 修改用户组     
          2.2.7 定义角色     
          2.2.8 新增、重命名角色
          2.2.9 修改用户组角色     
          2.2.10 定义Portlet的角色     
          第三节 Liferay Portal内容和布局
          2.3.1 什么是布局     
          2.3.2 什么是内容     
          2.3.3 内容布局与Portlet的关系     
          2.3.4 选择内容和布局     
          第四节 Liferay Portal的桌面     
          2.4.1 什么是桌面     
          2.4.2 定义个性化的桌面     
          第五节 Liferay Portal的品质     
          2.5.1 什么是品质     30
          2.5.2 品质和Portlet、Portal的关系     
          2.5.3 定义个性化的品质     
          第六节 Liferay Portal的部署描述文件     
          2.6.1 web.xml     
          2.6.2 portlet.xml     
          2.6.3 liferay-Portlet.xml     
          2.6.4 liferay-display.xml     
          2.6.5 liferay-layout-templates.xml     
          2.6.7 liferay-look-and-feel。xml     
          第二部分 Liferay Portal 二次开发     
          第三章 开发自己的Portlet     
          第一节 重要的基类:GenericPortlet     
          第二节 Portlet标签     
          3.2.1 defineObjects标签     
          3.2.2 renderURL标签     
          3.2.3 actionURL标签     
          3.2.4 param标签     
          3.2.5 namespace标签     
          第三节 Portal的对象     
          3.3.1 Request对象
          3.3.2 Response对象     
          3.3.3 PortletConfig对象     
          3.3.4 Session对象     
          3.3.5 Preference对象     
          第四节 编写自己的Portlet类     
          3.4.1 开发环境     
          3.4.2 准备工作     
          3.4.3 HelloWorldPortlet     
          3.4.4 HelloJSPPortlet     
          第五节 修改Web部署描述文件     
          第六节 创建Liferay Portal部署描述文件     
          第三部分 Liferay Portal部署     
          第四章 部署自己的Portlet     
          第一节 手动部署     
          第二节 Ant自动部署     
          第三节 加入Liferay Portal自有列表     
          第四节 普通Java Web应用转化为Portlet应用     
          第四部分 附录     
          第五章 相关资源     
          第一节 资源网站     
          第二节 示例     
          第六章 参考资料     
          后序
          • 2. Re: 【长篇原创】Liferay Portal二次开发指南
            702619
            第一部分 Liferay Portal 架构解析
            本部分主要内容
            Portal 服务器 Portal 容器 Portlet
            第一章 Liferay Portal
            作为一个开源Portal产品,Liferay Portal提供对多个独立系统的内容集成,帮助多个组织实现更有效的合作。与其他商业的Portal产品相比,Liferay Portal有着一系列的优良特性,而且不需要付费。
            第一节 Portal规范
            随着Portal的兴起,越来越多的公司开始涉足Portal产品开发,并组建各自的Portal组件和基于其的产品,比如IBM、BEA、MicroSoft、SAP、Apache等。各个厂商的接口互不兼容,给软件开发商以及开发人员带来诸多不便。
            1.1.1 JSR168
            为此,JCP组织发布了JSR168(Java Specification Request),Portlet Specification V1.0,用来提供不同的Portal和Portlet之间的互通性。只要开发的Portlet遵循JSR168,则就可以在所有遵循JSR168的Portal上部署运行。
            JSR168中定义了Portal的实现规范和接口,并对理想的Portlet进行了详细的规划和描述。
            1.1.2 WSRP
            WSRP是OASIS Web Service for Remote Portlet的缩写。WSRP是Web Service的一种新的商业应用,一种新的标准,主要用来简化Portal对于各种资源或者程序整合的复杂度,可以避免编程带来的整合麻烦和问题。而且Portal管理员可以从海量的WSRP服务中选择需要的功能用以整合到目前所用的Portal中。它有三种角色:
            ①、生产者  提供Portlet
            ②、消费者  使用Portlet
            ③、终端用户  最终用户
            它的特点在于生产者将消费者所需要的信息通过WSRP返回给消费者,这些信息是相对标记片断,例如HTML、XHTML等,可以直接嵌入用户的页面中,而不用像Web Service一样开发用户端接口。
            实现这个规范,Portal可以跟各式各样的数据源打交道,彻底终结信息孤岛的窘境。
            第二节 什么是Portal
            Portal是基于Web的,以“应用整合”和“消除信息孤岛”为最终目的,提供单点登录、内容聚合、个性化门户定制等功能的综合信息系统。
            完整的Portal通常由Portal服务器、Portlet容器、Portlet构成。
            1.2.1 Portal 服务器
            Portal服务器是容纳Portlet容器,支持Portlet呈现的普通或者特殊Web服务器。Portal服务器通常会提供个性化设置、单点登录、内容聚合、信息发布、权限管理等功能,支持各种信息数据来源,并将这些数据信息放在网页中组合而成,提供个性化的内容定制,不同权限的浏览者能够浏览不同的信息内容。通常,Portal提供以下功能:
            单点登录:Portal通常采用ACL、SSL、LDAP等业界标准的安全技术,提供对所有现有应用系统的安全集成,只需在Portal的唯一入口上登录一次,就可以访问所有应用系统和数据。对于安全性要求较高的应用系统,如电子商务平台、交易系统等,通过扩展接口传递用户身份信息,如数字证书信息、数字签名信息等,进行二次身份认证,保证单点登陆的安全性。
            权限控制:系统采用LDAP对用户资源进行统一的管理,同时提供二次开发接口,可以与其他应用系统的用户管理模块对接,并能随相关业务系统实时更新访问权限。通过完善的授权机制及存取控制,用户访问权限控制到字段级别,确保用户只能访问具有权限的应用系统及相关信息。
            内容管理: 实现应用系统之间实时交换信息。采用多种缓存机制,保证内容交换的性能和准确性。采用基于XML的Rich Site Summary (RSS)标准,迅速在各应用系统之间传播最新变化。
            信息发布: 实现信息门户内容的动态维护。动态网站系统可与OA协同办公系统、知识管理系统等集成,网站信息须经OA系统的审批流程流转通过后或知识管理平台设置具有外部共享权限后才可正式发布,真正实现内外信息发布的同步。
            文件管理: 系统实现无缝集成多种数据源,包括:数据库、文档(Office文档、PDF、AutoCAD、甚至ZIP文档)、Web网页、FTP站点等,并对数据按业务要求和职务特点加以分析整理,通过统一Web界面主动推送(Push)至用户的门户桌面,帮助用户做出及时、正确的决策。
            1.2.2 Portlet容器
            Portlet容器提供Portlet执行的环境,包含很多Portlet并管理它们的生命周期,保存Portlet的定制信息。
            一个Portal容器接收到来自Portal的请求后,接着将这个请求传递给存在Portal容器的Portlet 执行。Portlet容器没有义务去组合Portlet 产生的信息內容,这个工作必须由Portal来处理。Portal和 Portal容器可以放在一起视为同一个系统的组件,或者分开成为两个独立的组件。
            Portlet容器是普通Web Servlet容器的扩展,所以一个Portlet容器可以构建于一个已经存在的Servlet容器或者可能实现全部Web Servlet容器的全部功能。无论Portlet容器怎么实现,它的运行环境总是假定它支持Servlet2.3规范。
            通常,Portlet容器扩展自普通的Servlet容器。
            • 3. Re: 【长篇原创】Liferay Portal二次开发指南
              702619
              第三节 什么是Portlet
              Portlet是Portal中最重要的组件,负责在Portal中呈现信息内容,有相应的生命周期。通过自定义Portlet,用户很容易定义个性化的Portal页面。Portlet由Portlet容器负责管理、处理请求并返回动态页面,可以作为Portal的可即插即用的界面组件。
              1.3.1 Portlet
              一个Portlet是以Java技术为技术的Web组件,由Portlet容器所管理,专门处理客户的 信息请求以及产生各种动态的信息内容。Portlet 为可插式的客户界面组件,提供呈现层成为一个信息系统。
              这些由Portlet产生的内容也被称为片段,而片段是具有一些规则的标记( HTML、XHTML、WML ),而且可以和其他的片段组合而成一个复杂的文件。一个或多个 Portlet 的内容聚合而成为一个 Portal 网页。而 Portlet 的生命周期是被 Portlet 容器所管理控制的。
              客户端和Portlet的互动是由Portal通过典型的请求/响应方式实现,正常来说,客户会和Portlet所产生的内容互动,举例来说,根据下一步的连接或者是确认送出的表单,结果 Portal将会接收到Portlet的动作,将这个处理状况转向到目标Portlet。这些Portlet 内容的产生可能会因为不同的使用者而有不同的变化,完全是根据客户对于这个Portlet的设置。
              1.3.2 Portlet与Servlet的关系
              Portlet被定义成为一个新的组件,具有新的明确的界面与行为。为了尽可能与现有的 Servlet 结合达到重复使用的目的,Portlet 的规范利用了 Servlet 的规范,许多观念都很相似的,结合 Portlet、Servlet 及 Jsp 在同一个网站系统中,我们称为Portlet 应用 。在同一个 Portlet 应用 中,他们将分享同一个类加载器(ClassLoader),上下文(Context) 及 Session。
              ①、Portlet 和 Servlet 的相似之处
              @ Portlet 也是 Java 技术的 web 组件
              @ Portlet 也是有特定的 container 在管理
              @ Portlet 可以动态产生各种内容
              @ Portlet 的生命周期由 container 所管理
              @ Portlet 和客户端的互动是通过 request/response 的机制
              ②、Portlet 和 Servlet 也有一些不同
              @ Portlet 只产生 markup 信息片段,不是完整的网页文件。而 Portal 会将所有的 Portlet markup 信息片段放到一个完整的 Portal 网页。
              @ Portlet 不会和 URL 有直接的关系
              @ 客户端必须通过 portal 系统才能和 Portlet 互动
              @ Portlet 有一些定义好的 request 处理,action request 以及 render request。
              @ Portlet 默认定义 Portlet modes 及窗口状态可以指出在网页中该 Portlet 的哪个功能正在执行及现在的 状态。
              @ Portlet 可以在同一个 portal 网页之中存在多个。
              ③、Portlet 有一些附加的功能是 Servlet 所没有的
              @ Portlet 能够存取及储存永久配置文件及定制资料。
              @ Portlet 可以存取使用者数据
              @ Portlet 具有 URL 的重写功能在文件中去动态建立连结,允许 portal server 不用去知道如何在网页的片 段之中建立连结及动作。
              @ Portlet 可以储存临时性的数据在 Portlet session 之中,拥有两个不同的范围 :
              application-wide scope 及 Portlet private scope 。
              ④、Portlet 不具有一些功能, 但是 Servlet 却有提供
              @ Servlet 具有设置输出的文字编码( character set encoding)方式
              @ Servlet可以设置 HTTP 输出的 header
              @ Servlet才能够接收客户对于 portal 发出的 URL 请求
              1.3.3 Portlet的生命周期
              一个Portlet有着良好的生命周期管理,定义了怎样装载,实例化和初始化,怎样响应来自客户端的请求及怎样送出服务。这个Portlet生命周期由Portlet接口的init,processAction,render和destroy方法来表达。
              载入和实例化:Portlet容器负责载入和实例化Portlet。当Portlet容器运行Portlet应用或者延迟到Portlet需要服务使用者的请求时,Portlet就会被载入并实例化。载入Portlet类后,Portlet类随即被实例化。
              初始化:Portlet类实例化后,Portlet容器还需要初始化Portlet。以调用Portlet去响应客户端的请求。Portlet容器呼叫Portlet接口中的init方法初始化Portlet。扩展自PortletConfig的类可以取出定义在部署描述文件中的初始化参数,以及Resource Bundle。
              初始化异常:在 Portlet初始化期间,Portlet可能会丟出 UnavailableException 或 PortletException 异常。此时,Portlet容器不能把 Portlet置入已启动的服务,并且 Portlet容器必需释放这个 Portlet。 destory方法不能被呼叫,因为初始化被认为执行失败。发生 失败后,Portlet容器会尝试着重新实例化及初始化 Portlet。这个异常处理的规则是:由一个UnavailableException 指定一个不能执行的最小时间,当此异常发生时,Portlet容器必需等到指定时间过去后才产生并且初始化一个新的 Portlet。
              在初始化过程中所丟出的 Runtime Exception异常,被当作 PortletException 来处理。
              第四节 Liferay Portal工作原理
              Portal系统根据需要由一个或者多个Portal页面组成,每个Portal页面包含零个或者多个的Portlet。每个Portlet呈现自己的信息内容,以此实现内容聚合。通过定义每个Portlet的可用权限,实现个性化的桌面信息定制。
              • 4. Re: 【长篇原创】Liferay Portal二次开发指南
                702619
                哪里有呢?
                请问,
                • 5. Re: 【长篇原创】Liferay Portal二次开发指南
                  702619
                  1.4.1 Portlet 样式以及窗口状态

                  图1.4.1-1

                  图1.4.1-2
                  JCP组织提出的JSR168规范定义了Portlet的实现标准。每个Portlet对外表现为一个小窗口,有自己的默认样式和窗口状态。如上图,Portlet有自己的标题,浏览状态下支持编辑、关闭、上移、下移、最大化、最小化功能,编辑状态下支持返回和关闭功能。从各种数据来源提取的信息以Portlet内容的形式呈现在Portal中。
                  Portlet样式指出 Portlet正处于什么模式,Portlet通常会根据所处的模式而执行不同的工作并产生不同的内容。
                  Portlet模式让 Portlet决定它该显示什么内容和执行什么动作。调用一个 Portlet的时候,Portlet 容器会提供一个 Portlet模式给那个 Portlet。当在处理一个请求动作时,Portlet 的模式是可以用程序来改变的。
                  JSR168规范定义了三个Portlet模式: 浏览、编辑和帮助,Liferay Portal支持其中的全部三个模式。同时Portal是可以根据使用者的角色,来决定是要提供(显示)哪几个 Portlet 模式给使用者操作。
                  例如,匿名使用者可以操作浏览和帮助等 Portlet 模式的内容, 而只有授权过的使用者可以操作编辑这个 Portlet 模式所提供的内容或动作。
                  在浏览这个Portlet模式里,所被期望要提供的功能是产生标记语言来表现此时 Portlet的状态。 举例来说, Portlet的 浏览 模式可以包含一个或多个画面让使用者可以浏览与互动, 或是一些不需要与使用者互动的静态内容。
                       在编辑这个Portlet模式里, Portlet 需要提供内容和逻辑来让使用者定制 Portlet 的行为。典型的说, 编辑模式的 Portlet 会设定或更新 Portlet 的参数设定值。
                  在帮助这个模式里,Portlet应该提供有关这个 Portlet的帮助信息。这个帮助信息可以是有关这个 Portlet的简单且条理清楚的视窗说明或是详细的说明整个来龙去脉。所有的Portlet并不需要都提供帮助这个模式。
                  一个 Portlet可以根据窗口状态来决定在一个页面里该占多少空间。 当调用一个 Portlet时, Portlet容器 需要告诉该 Portlet目前的窗口状态。 此时 Portlet可以根据窗口状态来决定它该对多少信息作处理。 在处理请求的过程中, Portlet可以通过程序的方式来改变窗口状态。
                  1.4.2 Portal页面

                  图1.4.2-1
                  每个Portal页面包含零个或者多个Portlet小窗口,构成一个完整的信息呈现页面。Portal在启动之后根据Portlet配置文件等信息,给Portlet的标题等属性赋值,赋予Portlet编辑、关闭等各种控制按钮,使Portlet成为一个标准的Portlet窗口。Portlet合并这些Portlet窗口,组成一个完整的文档,即Portal页面。每个Portlet都处于相应的布局当中,呈现事先定义的内容,表现Portal公共的品质。而且Portlet可以在不同的布局之间切换。Portlet响应客户端的请求,并将请求提交到相应的URL进行逻辑处理。
                  Portlet开发完毕之后,部署到Portal服务器,由Portal服务器负责组织、权限控制和呈现。Portal页面创建过程如下:
                  Portlet 在 Portlet容器内执行,Portlet容器接收 Portlet产生的内容。通常 Portlet容器将这些内容提交给 Portlet服务器,Portlet服务器依照这些内容建立Portal页面,然后将它传给客户端呈现。具体流程如下图:
                  • 6. Re: 【长篇原创】Liferay Portal二次开发指南
                    702619
                    支持啊,portal的书很不容易找的。

                    相信对我们大家一定很有益处的。
                    • 7. Re: 【长篇原创】Liferay Portal二次开发指南
                      702619
                      为什么我每发一次消息,就会多出一些材料来呢?
                      奇怪啊
                      • 8. Re: 【长篇原创】Liferay Portal二次开发指南
                        702619
                        呵呵,我说的吗!
                        真是太感谢了,我也学习和使用portal在做项目,希望可以和你交流,向你学习。
                        我的邮箱:jianjun0921@tom.com
                        • 9. Re: 【长篇原创】Liferay Portal二次开发指南
                          702619
                          感谢,希望看到更多! ^o^
                          • 10. Re: 【长篇原创】Liferay Portal二次开发指南
                            702619
                            不错,希望能整理成一个文档再上传!非常感谢
                            • 11. Re: 【长篇原创】Liferay Portal二次开发指南
                              702619
                              整理成一个PDF文档是肯定的,这样也可以把配图包含进来。
                              第二部分涉及到代码,还在调试。要保证文章中的所有代码都能正常运行,所以会有一点延迟。
                              第一部分主要是关于Portal理论的,先贴上来。

                              PDF文档再耐心等等。
                              • 12. Re: 【长篇原创】Liferay Portal二次开发指南
                                702619
                                好嘛 要是再加上点源代码,都能写一本书了......
                                • 13. Re: 【长篇原创】Liferay Portal二次开发指南
                                  702619
                                  第二部分 Liferay Portal 二次开发
                                  本部分主要内容
                                  GenericPortlet 自定义Portlet类 部署描述文件
                                  第三章 开发自己的Portlet
                                  在了解了Liferay Portal的基础架构,初步体会Liferay Portal良好的个性化定制之后,本章将开始Liferay Portal二次开发之旅,讲述并扩展Portlet的超类GenericPortlet,创建或者修改部署描述文件,构建属于自己的Portlet。
                                  第一节 重要的基类:GenericPortlet
                                  像Servlet一样,编写的Portlet也必须直接或者间接的扩展基类GenericPortlet,这个是由JCP针对Portal提出的JSR168规范定义的。只要扩展自规范的GenericPortlet,所有的Portlet都可以在支持JSR168规范的Portal服务器上运行。
                                  GenericPortlet统一定义了可供Portal容器识别和调用的方法,包括:
                                  public Init():初始化;
                                  public Init(PortletConfig) :初始化;
                                  public getInitParameter(String):取得在Portlet。xml中定义的初始化参数;
                                  public getInitParameterNames():取得在Portlet。xml中定义的全部初始化参数;
                                  public getPortletConfig():取得包含初始化参数的配置对象PortletConfig实例;
                                  public getPortletContext():取得Portlet上下文;
                                  public getPortletName():取得在Portlet。xml中定义的Portlet名称。
                                  public getResourceBundle(Locale) :取得Portlet国际化的Resource Bundle;
                                  protected getTitle(RenderRequest) :取得Portlet的标题;
                                  protected doView(RenderRequest,RenderResponse) :Portlet浏览模式的处理方法;
                                  protected doEdit(RenderRequest,RenderResponse) :Portlet编辑模式的处理方法;
                                  protected doHelp(RenderRequest,RenderResponse) :Portlet帮助模式的处理方法;
                                  protected doDispatch(RenderRequest,RenderResponse) :Portlet行为分发;
                                  protected processAction(RenderRequest,RenderResponse) :Portlet处理Action Request的方法;
                                  protected render(RenderRequest,RenderResponse):Portal处理Render Request的方法;
                                  public destroy():Portlet销毁,终止其生命周期。
                                  在Portlet Portal运行的时候,doView、doEdit、doHelp三个方法分别被调用,用以生成Portlet标记。同样也可以调用Servlet生成Portlet标记,或者不调用JSP或者Servlet,直接在方法中得到PrintWriter然后用最简单的pw.println()打印出内容。这个过程类似Servlet,如下:
                                  PrintWriter pw = renderResponse.getWriter();
                                  pw.println(“Hello,world!”);
                                  与Servlet类似,可以使用getInitParamter(String s)得到配置文件中Portlet的初始值,只不过Servlet在web.xml中,而Portlet在portlet.xml中。
                                  portlet.xml:
                                  <init-param>
                                       <name>jspView</name>
                                       <value>/jsp/view。jsp</value>
                                  </init-param>
                                  针对如上portlet.xml中的初始化信息,可以采用如下的调用方式:
                                  SimplePortlet.java:
                                  String jspName = getPortletConfig()。getInitParameter("jspView");
                                  • 14. Re: 【长篇原创】Liferay Portal二次开发指南
                                    702619
                                    第二节 Portlet标签
                                    跟Servlet一样,Portlet也自定义了很多灵活的标签。通过这些标签,可以调用Portlet内部的参数比如renderResponse、renderRequest、PortletConfig等,在JSP中跟Portlet通信。当然,在使用之前,除了要在web。xml中声明标签库外,还要在JSP的头部声明标签库调用:<%@ taglib uri="http://java。sun。com/Portlet" prefix="Portlet" %>
                                    3.2.1 defineObjects标签
                                    在使用Portlet典型标签之前,要见声明<portlet:defineObjects/>,这样才可以使用其他的标签。defineObjects中间不允许定义任何属性和包含任何内容。
                                    3.2.2 renderURL标签
                                    属性     值类型     对应值
                                    windowState     String     minimized
                                    normal
                                    maximized。

                                    PortletMode     String     view, edit , help
                                    var     String     
                                    secure
                                         String     true
                                    false

                                    创建一个当前RenderURL,当访问它时将使Portlet窗口变为最大化状态,模式变为浏览。<portlet:param/>子元素会在生成的RenderURL中增加number、page两个参数和值。
                                    3.2.3 actionURL标签
                                    属性     值类型     对应值
                                    windowState     String     minimized
                                    normal
                                    maximized。

                                    portletMode     String     view, edit , help
                                    var     String     
                                    secure
                                         String     true
                                    false
                                    <portlet:actionURL windowState="normal" PortletMode="edit">
                                    <portlet:param name="action" value="login"/>
                                    </portlet:actionURL>
                                    创建一个当前ActionURL,当访问它时将使Portlet窗口变为正常状态,模式变为编辑。<Portlet:param/>子元素会在生成的ActionURL中增加action参数和值。
                                    renderURL和actionURL两个标签在诸如生成form表单的action等方面特别有用。
                                    3.2.4 param标签
                                    属性     值类型
                                    name     String
                                    用在renderURL和actionURL标签内部,用来在生成的URL中增加参数和值。param标签不运行body内容存在。
                                    3.2.5 namespace标签
                                    为目前的Portlet产生一个唯一的Value,防止与其他Portlet或者Portal上面的Value冲突。
                                    上述标签的具体属性及其约束,请参阅{PORTAL_HOME}/liferay/WEB-INF/tld/liferay-portlet.tld 。
                                    第三节 Portal的对象
                                    JSR168给Portal定义了几个特别的对象,用来操作Portal特有的信息。这些对象跟Servlet的对象有点类似,又有点不同。这些对象都封装在{PORTAL_HOME}/common/lib/ext/portlet.jar包中,具体支持实现要视Portal服务器而定。
                                    3.3.1 Request对象
                                    Portlet中的Request与Servlet的Request一样接受客户端发送的请求,但是与Servlet不同,Portlet的Request分为Action Request及Render Request两种类型,因此Portlet接口中定义了两种方法用来处理不同的Request。分别是processAction(ActionRequest request,ActionResponse response) 和render(RenderRequest request,RenderResponse response),分别用以处理Action Request和Render Request。某种意义上来讲,render方法类似Servlet中的service方法,doView,doEdit,doHelp方法又类似doGet,doPost方法。
                                    ①、RenderRequest和ActionRequest
                                    PortletRequest分为RenderRequest和ActionRequest两种,分别由renderURL和actionURL来触发。renderURL是actionURL的一种优化。Portlet的开发过程中尽量使用renderURL而避免actionURL。actionURL适用于有确实的Action(行为)的情况下。比如说,表单form提交后Persistent状态的改变、session的改变、perference的修改等等。renderURL通常用来处理Portlet的导航。举个例子:
                                    使用actionURL:
                                    <%
                                    PortletURL pu = renderResponse.createActionURL();
                                    pu.setParameter("ACTION","LOGIN");
                                    <form name="usrform" method="post" action="<%=pu.toString()%>">
                                    %>
                                    说明:表单提交最好使用Post方法而不是Get方法,因为某些Portal服务器可能会将内部状态编码到URL的Query字符串中。
                                    使用renderURL:
                                    <%
                                    PortletURL pu=renderResponse.createRenderURL();
                                    Pu.setParameter("PAGE",Number);
                                    %>
                                    <a href="<%=pu%>">下一页</a>
                                    ②、renderURL和actionURL的处理方式
                                    当客户端请求是由一个renderURL触发的时候,Portal服务器会调用该Portal页面所有Portlet的render方法。
                                    而当客户端请求是由一个actionURL触发的时候,Portal服务器会先按用该页面所有Portlet的processAction方法再调用render方法。所以,要明确自己到底使用那种URL来出发客户端请求。
                                    ③、RenderRequest和ActionRequest的parameter参数作用范围
                                    当客户端请求由一个actionRequest触发时,所有parameter参数的取得都必须在processAction方法中进行。比如:
                                    public void processAction(ActionRequest req,ActionResponse res){
                                         String str = req.getParameter("ACTION");
                                         //response.setRenderParameter("ACTION",action);
                                    }

                                    public void doView(ActionRequest req,ActionResponse res){
                                         String str = req.getParameter("ACTION");
                                    }
                                    如上processAction方法中,getParameter方法将能成功得到表单中的参数ACTION所对应的值,因为我们知道,当目标Portlet的processAction方法运行完后,Portlet Container将调用Portal页面中所有Portlet的render方法.但是实际上doView方法中使用getParameter不会得到任何值.但是如果把processAction方法中注释了的一行解除注释的话,你就可以在doView方法中的得到参数ACTION对应的值. 这说明action request的参数,render方法中不可以直接取到.必须使用了setRenderParameter方法,再次传递一次.
                                    1 2 3 Previous Next