gt;
</dependencies>
</sys:environment>
<security-realm-name>pluto-properties-file-realm</security- realm-name>
<security>
<default-principal realm-name="pluto-properties-file-realm">
<principal class=
"org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal" name="user"/>
</default-principal>
<role-mappings>
<role role-name="tomcat">
<realm realm-name="pluto-properties-file-realm">
<principal class=
"org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal" name="admin"/>
<principal class=
"org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="system"/>
</realm>
</role>
</role-mappings>
</security>
<tomcat:cross-context/>
</web-app>
您可以看到清单 1 中的部署计划有三个主要配置:
依赖性: <dependency> 元素用于指定 Web 应用程序与任何其他模块 、应用程序或服务之间的 依赖性。它还可以指明与位于 Geronimo 存储库中的第三方库之间的依赖性。在 清单 1 中, <dependency> 元素内的 <artifactId>sharedlib</artifactId> 将指定与 sharedlib 服务之间的依赖性。
安全性:Pluto Web 应用程序要求配置安全性。特别是,它要求使用 <security-realm> 验证 用户登录和主要角色,并使用 <role-mappings> 映射在 Pluto 的 Web 部 署描述符 (web.xml) 中 定义的角色。在 清单 1 中,pluto-properties-file-realm 安全领域被配置为 强制执行特定于应用程序 的验证策略,它用作登录域的入口点。它被配置为使用 org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal。在 Pluto 应用程序的 web.xml 文件中定义的 tomcat 角色被映射为使用这个 security-realm。
跨上下文:Pluto 服务器要求使用的一项重要功能是能够调用部署在 Geronimo 服务器上的其他 Web 应用程序中提供的 portlet。默认情况下,这个功能 —— 允许一个 Web 应用程 序把请求分派给其他 Web 应用程序 —— 是禁用状态。您可以通过在部署计划中指定 <cross- context> 元素来启用它 。清单 1 中出现的 <tomcat:cross-context/> 将为 Pluto 服务器应用程 序激活此功能。
在 Geronimo 中部署 Pluto
如果已下载的是 Pluto 源代码版本,您可以将其构建为获得 Pluto Web 应用 程序 PLUTO_SRC\pluto\portal\target\pluto.war。如果使用的是 Pluto 的二进制版 本,请使用以下命令从 PLUTO_HOME\webapps\pluto 文件夹创建 pluto.war(其中 pluto_xxx 是您选定 的文件夹):
c:\pluto_xxx>jar cvf pluto.war
拥有 pluto.war 之后,请使用 Web 控制台或命令行部署工具(在一行中键入 以下命令)部署它:
c:\geronimo-1.1.1\bin>deploy --user system deploy
c:\pluto_xxx\pluto.war c:\pluto_xxx\geronimo-web-pluto.xml
在Apache Geronimo上开发和部署Apache Pluto门户应用程序(4)
时间:2011-08-27 IBM Rakesh Midha
开发样例门户应用程序
作为一个演示门户应用程序的开发及部署的样例场景,您将开发一个购票应用 程序。由于要开发的是 基于 JSR 168 和 J2EE 的应用程序,因此对于部署在 Geronimo 中的 Pluto 的 门户应用程序的服务器设 置与所有其他服务器设置完全相同。要创建样例门户应用程序,需要创建四个文 件:
Portlet 类
Portlet 描述符
Web 应用程序描述符
Portlet 视图页面
这些文件内容的详细说明不在本文讨论范围内。有关更多信息,请阅读 “使 用 Apache Pluto 构建和 测试 JSR 168 兼容的 portlets”(developerWorks,2006 年 4 月)。
portlet 类
门户类中的每个 portlet 都有一个用于实现 javax.portlet.Portlet 接口的 portlet 类。为了便于 操作,JSR 168 为 javax.portlet.Portlet 定义了一个默认实现 —— javax.portlet.GenericPortlet 类。清单 2 显示了 org.sample.geronimo.buyticket.BuyTicketPortlet 类,它 将扩展 BuyTicket portlet 的 GenericPortlet。同样地,本文的样例代码将包括 org.sample.geronimo.buyticket.TShirtPortlet(请参阅 下载 部分)。
清单 2. portlet 类 —— org.sample.geronimo.buyticket.BuyTicketPortlet
package org.sample.geronimo.buyticket;
import java.io.*;
import javax.portlet.*;
import org.apache.pluto.portlet.admin.util.PlutoAdminContext;
public class BuyTicketPortlet extends GenericPortlet {
private static String VIEW_JSP = "/view.jsp";
protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
response.setContentType(request.getResponseContentType ());
PortletContext context = getPortletConfig ().getPortletContext();
context.getRequestDispatcher(VIEW_JSP).include(request, response);
}
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, java.io.IOException {
String game = request.getParameter("game");
String name = request.getParameter("name");
String card = request.getParameter("card");
String errorMessage = null;
if(game != null && name != null && card != null
&& !game.equals("") && !name.equals("")
&& !card.equals("")){
response.setRenderParameter("game", game);
response.setRenderParameter("name", name);
}else
response.setRenderParameter("errorMessage",
"You entered invalid data, please check the name and credit information");
}
}
在Apache Geronimo上开发和部署Apache Pluto门户应用程序(5)
时间:2011-08-27 IBM Rakesh Midha
portlet 描述符
清单 3 中显示的 portlet.xml 文件将为门户应用程序中包含的所有 portlet 提供诸如 portlet 名 称、标题、类和模式之类的信息。
清单 3. portlet 描述符 —— portlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
xmlns="http://java.sun.com/xml/ns/portlet/portlet- app_1_0.xsd"
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet- app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
id="org.sample.geronimo.buyticket.BuyTicketPortlet">
<portlet>
<portlet-name>BuyTicket</portlet-name>
<display-name>Buy Ticket Portlet</display-name>
<portlet-class>
org.sample.geronimo.buyticket.BuyTicketPortlet
</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
<portlet-info>
<title>Buy Ticket Title</title>
</portlet-info>
</portlet>
<portlet>
<portlet-name>TShirt</portlet-name>
<display-name>TShirt Portlet</display-name>
<portlet-class>
org.sample.geronimo.buyticket.TShirtPortlet
</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
<portlet-info>
<title>TShirt</title>
</portlet-info>
</portlet>
</portlet-app>
在Apache Geronimo上开发和部署Apache Pluto门户应用程序(6)
时间:2011-08-27 IBM Rakesh Midha
Web 应用程序描述符
web.xml 是用于提供关于 Web 应用程序组件信息(例如 servlet 和 taglib )的 J2EE 指定的标准 XML 描述符。清单 4 将显示 buyticket 门户应用程序的 WEB-INF\web.xml 文件 。
清单 4. Web 应用程序描述符 —— WEB-INF\web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>GetPortlet</display-name>
<servlet>
<servlet-name>BuyTicket</servlet-name>
<display-name>BuyTicket Wrapper</display-name>
<description>Automated generated Portlet Wrapper</description>
<servlet-class>org.apache.pluto.core.PortletServlet</servlet- class>
<init-param>
<param-name>portlet-guid</param-name>
<param-value>buyticket.BuyTicket</param-value>
</init-param>
<init-param>
<param-name>portlet-class</param-name>
<param- value>org.sample.geronimo.buyticket.BuyTicketPortlet</param- value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>BuyTicket</servlet-name>
<url-pattern>/BuyTicket/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TShirt</servlet-name>
<display-name>TShirt Wrapper</display-name>
<description>Automated generated Portlet Wrapper</description>
<servlet-class>org.apache.pluto.core.PortletServlet</servlet- class>
<init-param>
<param-name>portlet-guid</param-name>
<param-value>buyticket.TShirt</param-value>
</init-param>
<init-param>
<param-name>portlet-class</param-name>
<param- value>org.sample.geronimo.buyticket.TShirtPortlet</param- value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TShirt</servlet-name>
<url-pattern>/TShirt/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>http://java.sun.com/portlet</taglib-uri>
<taglib-location>tld/portlet.tld</taglib-location>
</taglib>
<taglib id="PortletTLD">
<taglib-uri>http://java.sun.com/portlet</taglib-uri>
<taglib-location>/WEB-INF/tld/portlet.tld</taglib- location>
</taglib>
</web-app>
在Apache Geronimo上开发和部署Apache Pluto门户应用程序(7)
时间:2011-08-27 IBM Rakesh Midha
portlet 视图页面
BuyTicketPortlet 包括一个视图页面以通过调用 context.getRequestDispatcher ("view.jsp").include(request, response); 来解除视图部分与 portlet 代码 之间的耦合。清单 5 中 显示的 view.jsp 文件用于呈现实际的 HTML 页面。
清单 5. 初始页面 —— view.jsp
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@ page language="java" contentType="text/html; charset=ISO- 8859-1"
pageEncoding="ISO-8859-1" session="false"%>
<portlet:defineObjects />
<%
String game = renderRequest.getParameter("game");
if (game == null) game = "";
String name = renderRequest.getParameter("name");
if (name == null) name = "";
String errorMessage = renderRequest.getParameter ("errorMessage");
if (errorMessage != null) {
%>
<p><%=errorMessage%></p>
<%
}else if (name != null && !name.equals("") && game != null && !game.equals("") ) {
%>
<p><b> Thank you <%= name %>, you purchased ticket for <%= game %></b></p>
<%
}
%>
<FORM name="<portlet:namespace/>ticketform" action="<portlet:actionURL/>">
<table border="0">
<tr><td>
Select Game/Event
</td><td>
<select name="game">
<%
java.util.ArrayList map=org.sample.geronimo.buyticket.GameConstants.map;
java.util.Iterator itr=map.listIterator();
while(itr.hasNext())
{
String gamelist=(String)itr.next();
%>
<option value=<%= gamelist %> selected="true"><%= gamelist % ></option>
<%
}
%>
</select>
</td></tr>
<tr><td>Name</td><td><INPUT type="text" name="name" size="20"/></td></tr>
<tr><td>Card</td><td><INPUT type="text" name="card" size="20"/></td></tr>
<tr><td>Exp. Date</td><td><INPUT type="text" name="date" size="20"></td></tr>
</table>
<INPUT type="submit" name="<portlet:namespace/>submitTicket" value="Buy"/>
<INPUT type="submit" value="Cancel"/>
</FORM>
现在把 portlet.tld 文件从 PLUTO_HOME\webapps\pluto\WEB-INF\tld 复制 到 WEB-INF\tld 文件夹 中。编译 WEB-INF\classes 文件夹中的 Java 文件,并把以上所有文件打包成一 个 WAR 文件,如下所示 :
c:\buyticket>jar -cvf buyticket.war
在Apache Geronimo上开发和部署Apache Pluto门户应用程序(8)
时间:2011-08-27 IBM Rakesh Midha
为样例应用程序创建部署计划
当 Pluto 被部署到 Geronimo 上时,必须把将要部署到 Pluto 中的所有门户 应用程序作为 Web 应用 程序部署到 Geronimo 服务器中。您需要有一个 buyticket 门户应用程序的 Geronimo Web 部署计划, 就像需要有一个 Pluto 服务器应用程序 Web 部署计划一样。清单 6 中显示了 buyticket 的部署计划 —— geronimo-web-app.xml。
清单 6. 门户应用程序部署计划 —— geronimo-web-app.xml
<?xml version="1.0"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/web"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming"
xmlns:tomcat="http://geronimo.apache.org/xml/ns/web/tomcat/config- 1.0"
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment- 1.1">
<sys:environment>
<dependencies>
<dependency>
<artifactId>sharedlib</artifactId>
</dependency>
</dependencies>
</sys:environment>
</web-app>
Pluto 门户应用程序要求使用常见的 Pluto 文件,这些文件都是通过 Geronimo 中的 sharedlib 服 务共享的。门户应用程序与 sharedlib 服务的依赖性是在清单 6 所示的门户应 用程序部署计划中指定的 。
在 Geronimo 上部署和测试样例应用程序
门户应用程序必须执行两级部署。在第一级中,它将作为 Web 应用程序被部 署到 Geronimo 中。您可 以通过使用 Geronimo 部署工具轻松完成此操作:
在一行中键入以下命令:
c:\geronimo-1.1.1\bin>deploy --user system deploy c:\buyticket\buyticket.war
c:\buyticket\geronimo-web-app.xml
此命令将把应用程序作为 Web 应用程序部署到 Geronimo 中,但是要使用 Pluto 服务和功能,必须 通过 Pluto 把应用程序重定向(第二个部署级别)。
为此,您必须把应用程序配置信息存储到 Pluto 注册库中。您可以手动更新 pluto\WEB- INF\data\pageregistry.xml、pluto\WEB-INF\data \portletcontexts.txt 和 pluto\WEB- INF\data\portletentityregistry.xml 文件,也可以执行下一步使用 Pluto admin 应用程序。
打开 http://localhost:8080/pluto/portal,并单击 Admin 链接。此操作将 打开图 1 中所示的 http://localhost:8080/pluto/portal/adminportletapp 应用程序。
图 1. Pluto admin 应用程序 —— 部署 buyticket portlet 应用程序
在Apache Geronimo上开发和部署Apache Pluto门户应用程序(9)
时间:2011-08-27 IBM Rakesh Midha
在此应用程序中,浏览到 buyticket.war 文件,并单击 Submit。此操作将部 署 buyticket 应用程序 并把门户应用程序的具体配置添加到 portletentityregistry.xml 中。
在 admin 部署的下一个页面中,请为新部署的门户应用程序提供标题、描述 和布局信息(参见图 2) 。
图 2. Pluto admin 应用程序 —— 门户布局
把行数和列数更改为显示门户应用程序所包含的行数和列数。
接下来,选择显示在每行每列的 portlet,如图 3 所示。
图 3. Pluto admin 应用程序 —— 定义页面布局
在此步骤中,使用门户应用程序中进行 portlet 定位的布局设置更新 pageregistry.xml。执行完此 步骤就完成了把门户应用程序部署到在 Geronimo 上运行的 Pluto 服务器中的任 务。
现在可以开始通过单击 buyticket 链接来测试和使用应用程序。图 4 将显示 已部署到 Pluto 服务器 中并且正在运行的 buyticket 应用程序。
图 4. buyticket 门户应用程序
结束语
Apache Pluto 是用于 JSR 168 兼容性测试的易于使用的小型门户测试环境。 门户服务器支持并未预 先集成到 Geronimo 中,但是任何门户服务器 —— 例如 Pluto、Jetspeed 或 Liferay —— 都可以作 为插件或外部应用程序安装到 Geronimo 中。即使您引入了重量级的 Jetspeed 或 Liferay 作为部署环 境,也只有 Pluto 能够满足轻量级开发和测试的要求。通过把 Pluto 和 Geronimo 集成到一起,您将获 得结合了开源门户服务器与应用服务器的精华的门户环境。
本文配套源码
|