`

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中的JavaScript验证用户输入。以下JavaScript功能可能很有用:

<script>
function validate(foo) {
    if (foo.bar.value=="") {
        return false;
    }
    return true;
}
</script>
  同一页面中的其他portlet可能也有一个命名为validate()的具有不同逻辑的JavaScript方法。门户框架本身可能使用JavaScript方法。这个问题的解决方法是使用客户端脚本中的名称空间方法和顶层变量。<portlet:namespace/>标记将为每个portlet生成一个惟一标识符。第一步是通过taglib directive将标记库包含在JSP中。

<%@taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
  脚本中的validate()方法可以对标记加以区分。

<script>
function validate<portlet:namespace/>(foo) {
    if (foo.bar.value=="") {
        return false;
    }
    return true;
}
</script>
  以下是调用带名称空间的JavaScript方法的方式:

<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资源的内联客户端脚本符合规范
  客户端脚本常常引用外部资源(如图像、电影和外部页面)来增强用户界面。常见的示例是预先加载图像以使交换图像更有效的JavaScript。以下是一个示例:

<script>
function preloadImages(){
    var menuImage =
    new Image();
    menuImage.src = "images/icon.gif";
    var menuImageDark=new Image();
    menuImageDark.src = "images/icon.gif";
}
</script>
  客户端脚本中的URL必须根据JSR-168规范进行重写。这些脚本必须在JSP或JSP-168 portlet类中,以便调用重写API的URL。它们不能在单独的JavaScript (.js)文件中。以下是一个包含URL重写的适当名称空间脚本在JSR-168 portlet中看起来的样子:

<script>
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") %>";
}
</script>
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源码,portlet Filter

    Portlet是一种在Web应用程序中,特别是企业级门户平台中,用于呈现内容和功能的可重用组件。在Java世界中,portlet技术主要基于JSR 286(Portlet 2.0 API)标准,它定义了portlet如何与门户服务器交互。本篇文章将...

    struts2_portlet_pluto_demo

    Struts2_Portlet Pluto_Demo 是一个基于Struts2框架和Pluto Portlet Container的示例项目,旨在展示如何在Java Portlet环境下利用Struts2进行开发。这个项目可以帮助开发者理解如何将流行的MVC框架Struts2与portlet...

    Spring mvc portlet demo

    **Spring MVC Portlet Demo** Spring MVC Portlet是一个用于构建portlet应用程序的框架,它结合了Spring MVC的灵活性和portlet规范的强大功能。在这个demo中,我们将会深入探讨如何利用Spring 3.0 MVC架构来开发...

    portlet开发参考手册

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

    jquery portlet

    **jQuery Portlet 知识详解** `jQuery Portlet` 是基于 jQuery UI 框架实现的一种portlet组件,它主要用于构建可自定义布局、具有拖放功能的Web应用程序界面。Portlet是Web应用中的一个模块化组件,常用于企业级...

    Portlet规范介绍.rar

    Portlet是一种Web应用程序组件,主要用于构建企业级的门户系统。Portlet规范定义了这些组件如何在门户环境中交互、渲染和管理用户界面。本篇文章将深入探讨Portlet的概念、功能、工作原理以及相关的技术标准。 ...

    portlet之开发详解(中文)

    在如今的Web应用中,Portlet技术是一种用于创建动态Web内容组件的Java API,特别是在企业门户应用中十分常见。Portlet可以在 Portal 页面中作为一个独立的窗口区域显示内容,并且可以集成来自不同Web资源的信息。...

    IBM portlet api 和 中文教程

    IBM Portlet API是WebSphere Portal应用开发中的核心组件,它为构建portlet提供了一套标准的接口和类库。Portlet是一种可重用的Web组件,它们可以集成到门户环境中,展示来自不同数据源的信息,并与用户进行交互。...

    PortLet 入门小例子

    Portlet是一种可重用的Web组件,主要用于企业级应用程序,特别是内容管理系统如IBM WebSphere Portal或Liferay Portal中。Portlet允许开发者创建交互式的、个性化的内容小部件,这些小部件可以嵌入到门户页面上,为...

    Liferay portlet 工程示例代码

    Liferay Portlet工程示例代码提供了开发者们一个深入理解并实践Liferay Portal平台上的portlet开发的宝贵资源。Liferay Portal是一款开源的企业级门户系统,它允许用户创建、管理和集成各种Web应用程序,而portlet...

    portlet入门介绍

    Portlet入门介绍 在Web开发领域,Portlet是一种特殊的组件,它被设计用来构建可复用、可配置的Web应用程序,通常在Portal环境下运行。Portlet技术为用户提供了一种集中访问多种服务和信息的方式,例如新闻、天气...

    Portlet规范之Pluto实现的运用

    ### Portlet规范之Pluto实现的关键知识点 #### 1. PortletResourceBundle的使用 `PortletResourceBundle`主要用于定义Portlet的一些描述性信息,比如标题、关键字等,它可以替代`&lt;portlet-info&gt;`标签,帮助实现...

    Portlet

    1. **portlet容器**:portlet容器是运行portlet的平台,它负责管理portlet生命周期,包括初始化、渲染、事件处理等,并提供portlet间通信的机制。常见的portlet容器有IBM WebSphere Portal、Liferay Portal和JBoss ...

    Stringbeans3.5 加载外部portlet应用

    在IT行业中,Portlet是一种可重用的Web组件,它可以在门户环境中运行,提供特定的功能或服务。Stringbeans是一个流行的portlet容器,它允许开发者构建和管理portlet应用。本篇文章将详细探讨如何在Stringbeans 3.5...

    portlet-api.jar

    portlet-api.jar portlet-api.jar portlet-api.jar

    在JetSpeed中开发portlet项目

    在JetSpeed中开发portlet项目是一项涉及Java Web技术的重要工作,主要基于JSR168(portlet规范1.0)标准。JetSpeed是一个开源的企业门户服务器,它支持portlet的开发和集成,提供了一个灵活且可扩展的框架来构建企业...

    文件上载Portlet源代码

    文件上载Portlet是Web应用程序中的一个组件,主要用于在用户界面上接收并处理用户上传的文件。Portlet是Java Portlet API定义的一种可重用、可组合的Web部件,它在门户环境中运行,如Liferay、Pluto等。在这个特定的...

    Portlet 简单例子demo pluto

    Portlet技术是Web应用程序开发中的一个重要概念,尤其在企业级应用中广泛使用,它主要用于构建可重用的、模块化的Web界面。在这个“Portlet简单例子demo pluto”中,我们将探讨Portlet的基本原理,以及如何通过Pluto...

    eclipse+tomcat开发portlet

    【标题】:“eclipse+tomcat开发portlet” 【描述】:本教程主要介绍如何使用集成开发环境Eclipse和Web服务器Tomcat来开发portlet,适用于初学者。教程将通过详细的步骤和示例帮助开发者理解portlet的创建过程。 ...

Global site tag (gtag.js) - Google Analytics