`
297014031
  • 浏览: 14112 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

portlet使用指南

阅读更多
摘要
  JSR-168是适合于portlet开发人员的Java API集合。设计符合规范的JSR-168 portlet的原因有很多。可移植性就一个显而易见的好处。
根据规范编写的代码更容易在门户服务器之间移动。多数基于Java的门户服务器都支持JSR-168 portlet。
  另一个好处是更易于联合。当portlet符合JSR-168规范时,通过Web Services for Remote Portlets (WSRP)生产者公开JSR-168 Portlet会更容易一些。
WSRP提供了一个通过Web service联合portlet内容的标准。JSR-168和WSRP 1.0 portlet功能是紧密耦合的。
JSR-168 to WSRP portlet桥利用JSR-168的URL重写API。本文将阐述开发JSR-168 portlet以便获得可移植性的最佳实践。
1. 总是利用URL重写API,以获得Portlet中的内容
  Java开发人员经常在如下所示JSP中编写图像的URL:
<img src="/<%= request.getContextPath()%>/images/logo.gif"/>
  这在JSR-168 portlet中是不正确的。正确的方法是:
<img  src="<%= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/logo.gif")  %>"/>

  encodeURL()方法可以采用完全路径URI或者完全限定URL。完全路径URI是最常用的。在使用JSR-168 portlet将资源嵌入Web Application Archive (WAR)中时,
可以使用此技术。在将图像放置到单独服务器上时,可以使用完全限定URL。专门为静态内容提供服务的缓存服务器就是一个示例,它卸掉来自门户服务器的通信量。
尽管可以通过对完全限定URL使用encodeURL()来引用portlet以外的内容,但应该只在无法通过客户机访问资源时这样做。
如果客户机可以直接浏览资源,则无需对URL使用encodeURL()。例如,如果有一台Web服务器,
可用该服务器获得门户用户无法直接浏览的防火墙内的静态内容,则需要调用encodeURL()。
如果这些内容在防火墙之外,并且门户用户可以直接浏览到Web服务器,则无需调用encodeURL()。
2. 不要将路径附加到重写URL中
  传入RenderRequest的encodeUrl()方法中的URL在调用该方法之前必须是完整的。在调用该方法之后,无法添加URL的某些部分。
例如,如果想从XSLT转换中生成一个URL转换,则不能将已编码的基本URL(http://foo.com/)作为参数传递,
并将路径(pages/bar.jsp)附加到该转换中的已编码基本URL中。
  以下调用演示了将URL编码到图像中的正确方式:
<@= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/logo.gif")@>
  它使用一个.portal文件在BEA WebLogic Portal 9.2中生成以下HTML片段:
<img src="http://localhost:7001/PortalWebApp/images/logo.gif;
PORTAL_TAU=W3f6FbmLLcgZq9Fpv1JHLs5rrJG8Lgj2nnDVJqdfShhRGFnsqCKZ!-545815275"/>

  以下调用是不正确的。URL并不指向想要的资源。
<@= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/")+"logo.gif"@>
  它使用.portal文件在WebLogic Portal 9.2中生成以下HTML文件:
<img src="http://localhost:7001/PortalWebApp/images/;PORTAL_TAU=W3f6FbmLLcgZq9Fpv1JHLs5rrJG8Lgj2nnDVJqdfShhRGFnsqCKZ!-545815275logo.gif"/>

3. 使用名称空间限定客户端脚本变量和方法
  假设您想使用portlet中的Javas cript验证用户输入。以下Javas cript功能可能很有用:
<s cript>
function validate(foo) {
    if (foo.bar.value=="") {
        return false;
    }
    return true;
}
</s cript>
  同一页面中的其他portlet可能也有一个命名为validate()的具有不同逻辑的Javas cript方法。门户框架本身可能使用Javas cript方法。
这个问题的解决方法是使用客户端脚本中的名称空间方法和顶层变量。<portlet:namespace/>标记将为每个portlet生成一个惟一标识符。
第一步是通过taglib directive将标记库包含在JSP中。
<%@taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
  脚本中的validate()方法可以对标记加以区分。
<s cript>
function validate<portlet:namespace/>(foo) {
    if (foo.bar.value=="") {
        return false;
    }
    return true;
}
</s cript>
  以下是调用带名称空间的Javas cript方法的方式:
<form action="http://www.somesite.org/servlet"
method="GET" onsubmit="return validate<portlet:namespace/>(this);">
<label for="bar">Text(required): </label>
<input type="text" name="bar" id="bar">
</form>
4. 确保引用Portlet资源的内联客户端脚本符合规范  
客户端脚本常常引用外部资源(如图像、电影和外部页面)来增强用户界面。常见的示例是预先加载图像以使交换图像更有效的Javas cript。以下是一个示例:
<s cript>
function preloadImages(){
    var menuImage =  new Image();
    menuImage.src = "images/icon.gif";
    var menuImageDark=new Image();
    menuImageDark.src = "images/icon.gif";
}
</s cript>
  客户端脚本中的URL必须根据JSR-168规范进行重写。这些脚本必须在JSP或JSP-168 portlet类中,以便调用重写API的URL。它们不能在单独的Javas cript (.js)文件中。以下是一个包含URL重写的适当名称空间脚本在JSR-168 portlet中看起来的样子:
<s cript>
function <portlet:namespace/>preloadImages(){
    var menuImage = new Image();
    menuImage.src = "<%=renderResponse.encodeURL(renderRequest.getContextPath()+ "images/icon.gif")%>";
    var menuImageDark= new Image();
    menuImageDark.src = "<%=renderResponse.encodeURL(renderRequest.getContextPath()+ "images/icon_dark.gif") %>";
}
</s cript>
5. 总是为portlet响应声明一个内容类型  
根据JSR-168规范,"portlet必须使用RenderResponse接口的setContentType方法设置响应的内容类型"。没有显式设置其内容类型的portlet仍然会成功获得编译。但WebLogic Portal不会执行没有设置其内容类型的portlet。确保您的portlet设置了其内容类型。  
以下示例演示了一个正确设置其内容类型的portlet:
public class MyPortlet extends GenericPortlet {
    public void doView(RenderRequest request, RenderResponse response)
        throws PortletException, IOException {
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.println("I set my content type!");
    }
}
  下面的示例是错误的,但仍将获得编译:
public class MyPortlet extends GenericPortlet {
    public void doView(RenderRequest request, RenderResponse response)
        throws PortletException, IOException {
        // no content type set!
        PrintWriter writer = response.getWriter();
        writer.println("I did NOT set my content type!");
    }
}
6. 不要从Portlet发送Cookie
根据JSR-168 portlet规范,在HttpServletResponse上调用addCookie()实际上不会设置一个cookie。
允许设置cookie的portlet容器被打破。不要调用此方法。  
如果您喜欢在用户使用门户的时候基于每位用户持久存储信息,那么可以将信息存储为portlet会话中的一个属性。
如果您喜欢在用户退出后持久存储信息,那么可以将信息存储到数据存储库(文件系统、数据库、LDAP等)中。
7. 将业务逻辑从表示中分离出来
有经验的开发人员都知道模型查看器控制器框架类似于Struts或Beehive,可以使开发富Web应用程序变得更容易。这同样也适用于portlet。
JSR-168并不是适用于平台独立portlet的惟一理想规范。WSRP portlet在实现标准的门户(包括非Java门户)之间移动很方便。
WebLogic Portal 可以通过WSRP公开Beehive和Struts portlet。  
如果需要将portlet部署为JSR-168 WAR,您仍然有一些选择。将业务逻辑从JSR-168 portlet的表示逻辑中分离出来的最简单方法是指派一个JavaServer Page (JSP)。
portlet处理呈现方法(比如render()和doView())中的业务逻辑。
portlet使用应用程序级作用域或portlet作用域将信息传递给JSP。下面的示例将一个portlet请求指派给JSP,并传递portlet作用域中的一个字符串:
public void doView( RenderRequest request,
     RenderResponse response)
    throws PortletException, IOException {
response.setContentType("text/html");
request.setAttribute("foo","bar");
String jsp = "/pages/portal.jsp";
PortletContext ctx = getPortletContext();
PortletRequestDispatcher dispatcher = ctx.getRequestDispatcher(jsp);
dispatcher.include(request, response);
}
  到达JSP(上述示例中的jsp)的路径值并不包括portlet的Web归档文件(WAR)的上下文路径。  
JSR-168的指派方法允许将业务逻辑与表示分离。不过,它们缺乏MVC框架的成熟度。  
适用于JSR-168开发的框架包括: Spring Portlet MVC WebWork Struts Action 2 Struts Action 2是Struts和WebWork的组合,
因此portlet代码库对现在而言几乎是一样的。这些框架简化了复杂portlet的开发和维护。
结束语:
遵守这些指导原则会使您的portlet符合JSR-168规范。遵守规范会使您的portlet在Java门户服务器之间移动变得更容易。还会使利用WSRP联合门户内容变得更容易。
分享到:
评论

相关推荐

    IBM portlet开发指南

    ### 知识点概述 #### 什么是Portal和Portlet Portal是企业信息门户的简称,它提供了一个集中的平台,通过它可以访问各种...这对于任何希望深入学习和掌握Portlet开发技术的开发者来说,是一个宝贵的资源和学习指南。

    The_Java_Portlet_Specification(JSR168规范英文版)

    - **帮助方法(doHelp())**:提供关于Portlet使用指南的信息。 - **处理动作方法(processAction())**:处理来自用户的表单提交等动作请求。 - **偏好验证类(WeatherPreferencesValidator)**:用于验证用户输入...

    Portlet开发指南

    ### Portlet开发指南详解 #### 一、Portlet与Portal技术概述 **1. Portal**:Portal是一种提供统一入口的网站或应用平台,用于整合多种信息和服务资源,为用户提供个性化和集中化的信息展示和交互界面。它能够集成...

    JSR-168 Portlet指南.doc

    【JSR-168 Portlet开发指南】 JSR-168,全称为Java Specification Request 168,是Java社区制定的一项标准,旨在为portlet开发者提供一套API,以实现portlet的可移植性和互操作性。Portlet是一种组件化的应用程序,...

    IBM Portlet中使用WCM快速指南

    ### IBM Portlet中使用WCM快速指南:详细解析与实践步骤 #### 引言 IBM Portlet中使用WCM(Web Content Management)快速指南旨在为用户提供一个清晰的流程,指导如何在IBM Lotus Workplace Web Content ...

    Portlet标准汉化手册

    总的来说,Portlet标准汉化手册旨在为开发者提供关于如何构建和使用Portal Server及Portlet的详细指南,帮助他们理解这一技术的精髓,以便在实际项目中有效利用Portal架构的优势,提供更加个性化和高效的服务。

    portlet入门介绍

    1. Java Portlet API文档:官方文档提供了详细的API参考和使用指南。 2. 开发者社区:如Liferay和IBM DeveloperWorks等,有很多关于portlet开发的教程、示例代码和问答讨论。 3. 在线课程:一些在线教育平台提供了...

    Portlet HelloWorld Pluto2+myeclips6+tomcat6詳細開發指南

    本指南将详细介绍如何使用Pluto Portlet容器,集成myeclipse6开发环境,并在tomcat6应用服务器上部署和运行一个简单的"Hello World" Portlet示例。 首先,我们需要了解基础概念。Portlet是Java Portlet API定义的一...

    portlet开发参考手册

    Portlet开发参考手册是针对portlet技术的一份详细指南,它为开发者提供了全面的指导,以帮助他们构建和集成portlet到Web门户中。Portlet是一种可重用的Web组件,它们在门户环境中运行,允许用户自定义门户界面,展示...

    Stringbeans3.5 加载外部portlet应用

    本篇文章将详细探讨如何在Stringbeans 3.5版本中加载外部portlet应用,以及相关文档和示例的使用。 首先,要理解Stringbeans 3.5的架构,它基于Java Portlet API,该API定义了portlet如何与门户服务器交互。加载...

    portlet

    在给定的文件中,“增删改查开发文档.docx”可能包含关于如何在portlet中实现基本的数据操作(CRUD:创建、读取、更新、删除)的指南,这通常是portlet功能的核心部分。开发者需要熟悉JDBC、Hibernate或Spring Data...

    portlet资料

    - 文件“0608_hanis-PortletWorkbook.pdf”可能是关于portlet工作流的教程或指南,可能涵盖了portlet如何处理用户请求、响应,以及如何与其他portlet协作等内容。 5. **源码分析**: - 标签中的“源码”提示了这...

    portlet-guide:用华丽的方式开发 MyUW portlet 的指南

    用华丽的方式开发 MyUW portlet 的指南。 公共回购,但毫无歉意地专注于 my.wisc.edu 小心! 这是一个公共回购。 促进透明度和与同行 portlet 开发机构的协作是公开的。 但是,本指南毫无歉意地以 MyUW 为重点。 ...

    Portlet 2规范

    #### 四、实施指南 在实施Portlet 2.0规范时,开发者需要注意以下几点: - **兼容性**:确保Portlet能够与现有的门户平台兼容。 - **性能优化**:考虑到门户应用可能会承载大量并发访问,优化Portlet的性能是关键...

    金蝶eas__二次开发Portlet (BOS开发指南)

    金蝶EAS二次开发Portlet(BOS开发指南)深入解析 金蝶EAS作为一款集成了财务、供应链、生产制造、人力资源等多模块的企业管理软件,为企业的信息化建设提供了全面的支持。在金蝶EAS的二次开发中,Portlet技术的应用...

    portlet specification

    - 规范领导者授予您非独家、不可转让、全球性的有限许可,允许您查看、下载、使用及复制此规范,仅用于内部评估目的,包括但不限于开发旨在在符合规范的实现上运行的应用程序,但这些应用程序本身不得实现规范的...

    Portlet JSR-170标准手册跟帮助文档

    "JSR-170.pdf"文档可能包含了详细的API参考、示例代码和最佳实践,而"docs"目录可能包含更丰富的开发指南和教程。通过深入阅读这些资料,开发者可以全面了解和掌握JSR-170标准,从而有效地开发出符合规范的portlet...

    Portlet-Specification(2).rar_portlet

    "Portlet-Specification(2).rar_portlet"这个资源提供了关于JAVA Portal开发的详细指南,帮助开发者深入理解portlet的规范和实践。 Portlet是Java Portlet API定义的一种轻量级、可复用的Web组件,它能够在门户环境...

Global site tag (gtag.js) - Google Analytics