posts - 12, comments - 19, trackbacks - 0, articles - 23
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Portlet应用开发 (JSR168)(二)

Posted on 2006-08-10 20:22 毛里求斯的化石 阅读(471) 评论(0)  编辑  收藏 所属分类: portal相关

By Terry.lee

SpiritSeekerS@sqatester.com

 

 

本部分使用本系列中 Part1 搭建的开发环境 , 如果还没有搭建好开发环境 , 请参考 Portlet 应用开发 (JSR168),Part1 进行开发环境的搭建 .

 

Part1 , 我们开发了一个简单的 portlet 程序 , 但是 几乎 所有的 代码和文件 都是由 Eclipse pluto plugin 替我们完成的 , 如何配置用来在 Pluto 中的 Portal 中添加新的 Portal Page 并且将新的 Portlet 添加到新的 Page 中去呢 ? Part2 将一步一步教你如何创建一个新 Portal Page.

 

 

·          Portal 的设定
Tomcat Webapps 目录 : 其中 pluto portal 所在目录 , 用以配置 Portal Page 的两个文件分别是 pageregistry.xml portletentityregistry.xml ( 如图 Figure1_1)

Figure1_1

 

 

其中 pageregistry.xml 用来在 Portal 中配置 Portal Page, portletentityregistry.xml 用来在 Page 中配置 Portlet.

 

·          portletentityregistry.xml
打开 pageregistry.xml, 内容如下
:

<?xml version="1.0" encoding="UTF-8"?>

<portlet-entity-registry>

    <application id="1">

        <definition-id>portlets</definition-id>

        <portlet id="1">

            <definition-id>portlets.SimplePortlet</definition-id>

        </portlet>

    </application>

</portlet-entity-registry>

其中 application 标签表明了目前的 application ID, portlet 标签定义了一个 Portlet , 如果你新开发了一个 Portlet , 可以加入以下内容
:

<?xml version="1.0" encoding="UTF-8"?>

<portlet-entity-registry>

    <application id="1">

        <definition-id>portlets</definition-id>

        <portlet id="1">

            <definition-id>portlets.SimplePortlet</definition-id>

        </portlet>

        <portlet id="2">

            <definition-id>portlets.IntroPortlet</definition-id>

        </portlet>

    </application>

</portlet-entity-registry>

 

这样一来你又在 portal 中注册了一个新的 Portlet, 接下来是将新注册的 Portlet 加入 Page .

 

·          pageregistry.xml
打开 pageregistry.xml, 内容如下
:

<?xml version="1.0"?>

<portal>

 

    <fragment name="navigation" class="org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation">

    </fragment>

   

    <fragment name="sample" type="page">

        <navigation>

            <title>Sample Portlet</title>

            <description>Basic page to show the simple portlet</description>

        </navigation>

 

        <fragment name="row" type="row">

 

            <fragment name="col1" type="column">

 

                <fragment name="p1" type="portlet">

                    <property name="portlet" value="1.1"/>

                </fragment>

 

            </fragment>

 

        </fragment>

 

    </fragment>

</portal>

 

以上是 sample portlet 的配置 .

 

Fragment 标签用来配置 navigation ( 导航栏 ), Page, 以及 Page 中的 Column Row.

分别用 fragment 标签的 type 属性来标识 . Pluto 自带的 Portal 使用 fragment 标签来配置及处理简单的 Portlet Layout.

 

<property name="portlet" value="1.1"/> 中的 value 值是在 portletentityregistry.xml 中定义的 . 分别对应 application id portlet id , 将其值用 ”.” 连接起来使用用以定义一个 Portlet . 同样 , 如果使用 <property name="portlet" value="1.2"/> , 则将使用 portlets.IntroPortlet.

        

 

 

1)     配置同一行中的两个 Portlet, 如下 :

<?xml version="1.0"?>

<portal>

 

    <fragment name="navigation" class="org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation">

    </fragment>

   

    <fragment name="sample" type="page">

        <navigation>

            <title>Sample Portlet</title>

            <description>Basic page to show the simple portlet</description>

        </navigation>

 

        <fragment name="row" type="row">

 

            <fragment name="col1" type="column">

 

                <fragment name="p1" type="portlet">

                    <property name="portlet" value="1.1"/>

                </fragment>

 

                <fragment name="p2" type="portlet">

                    <property name="portlet" value="1.1"/>

                </fragment>

 

            </fragment>

 

        </fragment>

 

    </fragment>

 

</portal>

 

2)      配置同一列中的 两个 Portlet, 如下 :

<?xml version="1.0"?>

<portal>

 

    <fragment name="navigation" class="org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation">

    </fragment>

   

    <fragment name="sample" type="page">

        <navigation>

            <title>Sample Portlet</title>

            <description>Basic page to show the simple portlet</description>

        </navigation>

 

        <fragment name="row1" type="row">

 

            <fragment name="col1" type="column">

 

                <fragment name="p1" type="portlet">

                    <property name="portlet" value="1.1"/>

                </fragment>

 

            </fragment>

 

        </fragment>

 

        <fragment name="row2" type="row">

 

            <fragment name="col1" type="column">

 

                <fragment name="p1" type="portlet">

                    <property name="portlet" value="1.1"/>

                </fragment>

 

            </fragment>

 

        </fragment>

 

    </fragment>

 

</portal>

 

 

 

 

·          Portlet Modes Portlet window state s
Portlet
模式 (Portlet Mode) Portlet 提供的用以区分 Portlet 所执行功能的一个概念 . 通常情况下其拥有以下几种模式
:
1. VIEW

2. EDIT

3. HELP

以上各模式分别对应 GenericPortlet 中的 doView(…) , doEdit(…) , doHelp(…) 方法 , 分别调用以上方法来产生各个模式中的 Fragment 内容 . 非常类似 Servlet 中的 doGet(…) , doPost(…) 方法 , 都是 Helper 方法 , 但是概念不同 .

 

Portlet 状态 (Portlet window states) 提供了对于 Portlet 窗口的控制功能 , 其中有如下三种最基本的状态 :

1.      Normal

2.      Maximized

3.      Minimized

 

Portlet 开发人员可以在处理 ActionRequest ( 以后的章节将讲述其概念 ) 时使用代码实现 Portlet 模式 , 及其 Portlet 状态的转变 .

 

: 只能在处理 ActionRequest 时改变 Portlet Modes Portlet Window states.

     

以上 Portlet Modes Portlet window states 都可以配置成 custom Portlet mode custom portlet window state. 不同的地方在于对于 Mode 来说 , 定制化的 Mode 需要对 GenericPortlet doDispatch 方法进行重写 (Overriding), 因为 GenericPortlet 类通过 render 方法按照不同的 Portlet Mode request 分别分发给 doView,doEdit,doHelp 等辅助方法 . 如果需要定制的 Mode , 必须重写 doDispatch 方法 . 同时如果使用 Portal 提供商的 Portlet Modes 或者 Portlet window States, 都必须在部署描述中添加相关的设定 .

 

A.      添加 Custom Portlet Modes

以下使用代码实现了一个新的 Portlet Mode: CONFIG , 当然也可以使用 Portal 提供商支持的 Portlet Mode. 但是需要 Mapping Portal 提供商所支持的 Portlet Mode. 使用如下描述 :

 

    <custom-portlet-mode>

         <description>Provides administration functions</description>

         <portlet-mode>CONFIG</portlet-mode>

    </custom-portlet-mode>

 

1. Portlet 代码 ( CustomPortletModeExample .java)

 

package portlets.portletmode;

 

/**

  * @author terry

  *

  * To change the template for this generated type comment go to

  * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments

  */

import javax.portlet.*;

import java.io.IOException;

 

public class CustomPortletModeExample extends GenericPortlet{

 

  public void doView(RenderRequest request, RenderResponse response)

  throws PortletException, IOException

  {

  response.setContentType( "text/html" );

 

  String jspName = getPortletConfig().getInitParameter( "all" );

 

  PortletRequestDispatcher rd =

    getPortletContext().getRequestDispatcher(jspName);

 

  rd.include(request, response);

  }

 

  public void doEdit(RenderRequest request, RenderResponse response)

  throws PortletException, IOException

  {

  response.setContentType( "text/html" );

 

  String jspName = getPortletConfig().getInitParameter( "all" );

 

  PortletRequestDispatcher rd =

    getPortletContext().getRequestDispatcher(jspName);

 

  rd.include(request, response);

  }

   

  public void render(RenderRequest request, RenderResponse response)

  throws PortletException, IOException{

         doDispatcher(request,response);

  }

   

  public void doDispatcher(RenderRequest request, RenderResponse response)

         throws PortletException, IOException{

         if(!request.getWindowState().equals(WindowState.MINIMIZED)){

         if (request.getPortletMode().equals(PortletMode.VIEW)){

                doView(request,response);

         } else if (request.getPortletMode().equals(PortletMode.EDIT)){

                doEdit(request,response);

         } else if (request.getPortletMode().equals( new PortletMode( "CONFIG" ))){

                doConfig(request,response);

         }

}

  }

 

  public void doConfig(RenderRequest request, RenderResponse response)

    throws PortletException, IOException

  {

    response.setContentType( "text/html" );

 

    String jspName = getPortletConfig().getInitParameter( "all" );

 

    PortletRequestDispatcher rd =

         getPortletContext().getRequestDispatcher(jspName);

 

    rd.include(request, response);

  }

 

  public void processAction(ActionRequest request, ActionResponse response)

         throws PortletException, IOException

  {

         String action=request.getParameter( "ACTION" );

         System.out.println( "ACTION" + action);

         if (action== null ){

                action= "" ;

         }

         response.setRenderParameter( "ACTION" ,action);

  }

}

 

2. JSP(all_mode.jsp)

<%@ page session="false" %>

<%@ page import="javax.portlet.*"%>

<%@ page import="java.util.*"%>

<%@ taglib uri='/WEB-INF/tld/portlet.tld' prefix='portlet'%>

<portlet:defineObjects/>

<br>

<h3>Custom Portlet Mode Example</h3>

Current Portlet Mode: <b><%=renderRequest.getPortletMode()%></b><br>

Current Window State : <b><%=renderRequest.getWindowState()%></b><br>

<br>

 

 


5. Portlet.xml


<?xml version="1.0" encoding="UTF-8"?>

<portlet-app xmlns="/org/apache/pluto/portalImpl/xml/portlet-app_1_0.xsd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/org/apache/pluto/portalImpl/xml/portlet-app_1_0.xsd /org/apache/pluto/portalImpl/xml/portlet-app_1_0.xsd">

 

  <!-- Custom PortletMode Example -->

  <portlet>

         <description>CustomPortletModeExample Example</description>

         <portlet-name>CustomPortletModeExample</portlet-name>

         <display-name>CustomPortletModeExample</display-name>

         <portlet-class>portlets.portletmode.CustomPortletModeExample</portlet-class>

         <init-param>

                <name>all</name>

                <value>/fragments/portletmode/all_mode.jsp</value>

         </init-param>

         <expiration-cache>-1</expiration-cache>

         <supports>

                <mime-type>text/html</mime-type>

                <portlet-mode>VIEW</portlet-mode>

                <portlet-mode>EDIT</portlet-mode>

                <portlet-mode>CONFIG</portlet-mode>

         </supports>

         <supported-locale>en</supported-locale>

         <portlet-info>

                <title>Custom PortletMode Example</title>

                <short-title>PortletMode</short-title>

                <keywords>PortletMode</keywords>

         </portlet-info>

    </portlet>

 

</portlet-app>


6. portletregistry.xml.

 

<?xml version="1.0" encoding="UTF-8"?>

<portlet-entity-registry>

    <application id="10">

        <definition-id>portlets</definition-id>

        <portlet id="10">

            <definition-id> portlets.CustomPortletModeExample </definition-id>

        </portlet>

    </application>

</portlet-entity-registry>

 

7. pageregistry.xml


<?xml version="1.0"?>

<portal>

 

    <fragment name="navigation" class="org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation">

    </fragment>

   

         <!-- Custom PortletMode Example Page -->

      <fragment name="customportletmodepage" type="page">

        <navigation>

            <title>Custom PortletMode Example Page</title>

            <description>Custom PortletMode Example Page</description>

        </navigation>

        <fragment name="row1" type="row">

            <fragment name="col1" type="column">

                <fragment name="p1" type="portlet">

                    <property name="portlet" value="10.10"/>

                </fragment>

            </fragment>

        </fragment>

  </fragment>

 

</portal>

 

 

将以上源代码编译后 , 再通过 Eclipse 生成 / 更新 Portlet web.xml ,  将所有配置及相关文件部署后 , 启动 Tomcat.

 

 

 

Browser 中加载如下页面 : Http://localhost:8080/pluto/portal , 可以看到如下的页面 ( :2_1)

 

                               2-1

 

 

单击 Custom PortletMode Example Page 后可以看到如下 Portlet 页面 :

 

2-2

 

单击右上角的 config , 可以看到如下页面片段 :

 

2-3

 

以上可以看到新添加的 Portlet Mode: config.

 

 

B.      添加 Custom Window States

 

  添加新的 window states 同样需要在配置文件中加入相应的描述 , 如下 :
<custom-window-state>

<description>Occupies 50% of the portal page</description>

<name>half_page</name>

</custom-window-state>

 

但是同样需要 Mapping Portal 提供商所支持的 Window state.

 

总结 :

因为 Eclipse Pluto plugin 使用的是 version1.0 , 所以可能有许多 Bugs 或者没有实现的功能 , 所以如果需要最新版本的 Pluto , 可以在 Apache CVS 上下载 , 下载的代码中有现成的 Build scripts 以及相关的 deploy script. 请参考相关文档资料 .

 

资源 :

·         Pluto
http://jakarta.apache.org/pluto

·         Pluto Mail List
http://news.gmane.org/gmane.comp.jakarta.pluto.user

·         WSRP Spec1.0
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrp

·         Apache WSRP 实现
http://ws.apache.org/wsrp4j/

·         Apache’s Portal, JetSpeed:
http://jakarta.apache.org/jetspeed/site/index.html

·         JSR 168:
http://www.jcp.org/en/jsr/detail?id=168

· "Portlet 规范介绍 " By Stefan Hepper Stephan Hesmer

Part 1: Get your feet wet with the specification's underlying terms and concepts (August 2003)

Part 2: The Portlet API's reference implementation reveals its secrets (September 2003)


只有注册用户登录后才能发表评论。


网站导航: