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>Preferences>Java>Code
Generation>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)