简介GridSphere 门户框架 在上一年基于 Portlet 的门户已成为门户服务器平台的最令人兴奋的领域之一Java Specification Request (JSR)(即 portlet API)的出现将允许门户供应商提供公共编程模型该模型允许开发人员更快地将新功能插入到门户服务器中消费者可以轻松地使用这些功能现在许多门户供应商支持 portlet包括 IBM WebSphereSun One Portal ServerOracle iAS 和 Jakarta Jetspeed 项目 GridSphere 门户 提供一个基于 portlet 的高级开放源代码门户GridSphere 是在欧盟提供基金的 GridLab 项目 下开发的提供了一个非常复杂的门户该门户为各种终端用户提供高度定制的环境portlet 模型向用户提供了一个灵活易用的接口并向门户开发人员提供了一个模型用于创建可插入的和动态的应用程序支持下面简要列出核心的 GridSphere 特性 Portlet API 的实现与 IBM WebSphere Portal Server 或更高版本紧密兼容 易于开发并易于与插入到 GridSphere portlet 容器中的第三方 portlet集成 级别更高的模型用于使用可视的 bean 和 GridSphere User Interface (UI) 标签库构建复杂的 portlet 灵活的基于 XML 的门户表示描述可以轻松对其进行修改来创建自定义的门户布局 对基于角色的访问控制(Role Based Access ControlRBAC)提供内置的支持RBAC 将用户分为 guestuseradmin 和 super user 复杂的服务模型允许创建用户服务可以按照用户权限限制服务方法 通过 Hibernate for RDBMS 数据库支持提供数据的持久性 为 portlet 服务的服务端测试集成了 Junit/Cactus 单位测试包括生成测试报告 GridSphere 核心 portlet 提供基本功能包括登录注销用户和访问控制管理 由于 GridSphere portlet API 几乎与 WebSphere portlet API 完全相同所以您应该多看看 developerWorks 文章这些文章在 参考资料 和 IBM WebSphere Portal Zone 中列出在理论上使用 IBM WebSphere Portal Server 开发本文中的示例 portlet 应该不难GridSphere API 与 JSR Portlet API 最后的规范非常类似gridSphere 的将来版本是符合 JSR 的 GridSphere 项目 GridSphere Web 站点提供关于开发 portlet 的附加文档有关使用 GridSphere 的信息和其他资源的集合要获得这些信息请加入 GridSphere 邮件列表中 当前的 GridSphere 版本提供了一个门户一个 portlet 容器和一组有用的核心 portlet包括用户和组管理以及布局定制和 portlet 订阅 安装 GridSphere 从 下载最新的 GridSphere 版本并按照指示安装该门户前提条件是您必须在系统中安装了 Java 技术 Ant 和 Tomcat X servlet 容器安装了 GridSphere 后可以只启动 Tomcat然后在 Web 浏览器中单击 查看该门户初始配置允许您以root身份登录而且不用输入口令登录后转至 Administration>Users 选项卡单击 root 用户来编辑配置文件更改口令和其他设置包括您的登录名和电子邮件地址登录后您就成为 GridSphere 门户管理员 图 GridSphere 用户管理器 portlet educitycn/img_///jpg>网格服务简介 在提供对用户的虚拟组织(Virtual OrganizationVO)内的计算资源和数据资源的安全统一访问方面门户正变得越来越复杂所以网格 portlet 必须依靠某种类型的中间件来执行这些操作开放网格服务基础设施(Open Grid Services InfrastructureOGSI)规定如何创建网格服务而 OGSI 是整体开放网格服务体系结构(Open Grid Services ArchitectureOGSA)的一部分Globus Toolkit (GT) 提供了 OGSI 的 Java 参考实现GT 提供了强制性网格服务特性如服务调用生存期管理服务数据接口依赖底层公钥基础设施(Public Key InfrastructurePKI)的安全接口网格服务扩展了 Web 服务因此在实际中编程模型很相似 简而言之使用 GT 创建网格服务的步骤如下所示 创建定义服务接口的 WSDL 接口可以采用工具转换采用 Java 或 C 语言编写现有接口以生成 WSDL 使用 GT 工具从 WSDL 服务器接口生成客户机和服务器存根(stub) 填写服务器骨架(skeleton)实现代码 配置服务部署描述符并部署服务到宿主容器 幸运的是GT 与一组供我们使用的示例服务绑定在一起因此我们将集中讨论使用现有服务和现有的客户机存根代码来访问服务 幸运的是您下载的 Tomcat 服务器还可以充当 OGSI 网格服务宿主环境允许 GridSphere 门户框架和 OGSA GT 示例服务一起运行 下一节准备开发示例 portlet您应从 Globus Web site 下载最新的 GT 版本要构建示例并部署到 Tomcat 容器中请发出下列命令其中 $CATALINA_HOME 设置为下载 Tomcat 的位置 %> ant %> ant samples %> ant Dtomcatdir=$CATALINA_HOME deployTomcat 现在由于示例 portlet 需要一些 GT 类所以需要将 OGSA Web 应用程序的库复制到 portlet 可以找到的 Tomcat 共享库目录 %> cp $CATALINA_HOME/webapps/ogsa/WEBINF/lib/*jar $CATALINA_HOME/shared/lib/ 根据 GT Users Guide(请参阅参考资料)最后一步是将下列条目添加到 $CATALINA_HOME/conf/webxml 中配置 Tomcat 以接受 WSDLGWSDL 和 XSD 文件扩展名 <mimemapping> <extension>gwsdl</extension> <mimetype>text/xml</mimetype> </mimemapping> <mimemapping> <extension>wsdl</extension> <mimetype>text/xml</mimetype> </mimemapping> <mimemapping> <extension>xsd</extension> <mimetype>text/xml</mimetype> </mimemapping> 编写网格计数器服务 portlet 在网格 portlet 示例中我们使用 Globus Toolkit 提供的示例 OGSI 计数器服务编写一个简单的加减数字的 portlet计数器服务表示为 CounterPortType它是基 GridService 接口的子类有三个方法如下面的图 所示 图 计数器服务的 UML 图 educitycn/img_///jpg>add(int a) 和 subtract(int b) 方法添加或减去提供的值并返回新值getValue() 方法只返回静态计数器值的当前结果 编写 portlet 在计数器 portlet 示例中用户可以输入整数值然后单击 Add 或 Subtract 按钮加上或减去计数器服务的值并显示已更新的计数器值 当第一次实例化 portlet 时init() 方法被调用向该 portlet 提供由任何后续 portlet 请求使用的所有必需的初始信息或配置信息portlet 编程模型将表示(portlet 的呈现)和逻辑(当某个动作发生时必须执行的操作)分为不同的 portlet 方法portlet 容器负责调用 doView() 呈现方法来显示 portlet并在 portlet 收到事件(如按钮单击或表单提交)时负责调用 actionPerformed() 方法Portlet 可以向用户提供几种模式包括 EditConfigure 或 Help从而向用户提供特定模式的接口portlet 必须提供适当的呈现方法如 doEdit 用于支持编辑模式对于熟悉 servlet 的人员而言portlet 开发非常相似只是 servlet 的 doGet 或 doPost() 方法由 actionPerformed() 和 doXXX() portlet 方法取代portlet 编程和 servlet 编程的另一个显着差别在于 PortletResponsePortletConfig 和 PortletContext 类的使用这些类在现有的由 Java Servlet API 提供的 HttpServletRequestHttpServletResponseServletConfig 和 ServletContext 类的基础上装饰(也就是提供)了附加的功能 最终的 portlet 如下所示 清单 计数器服务 portlet public class GridCounterPortlet extends AbstractPortlet { public static final String VIEW_JSP = /jsp/ogsa/counter/view_counterjsp; // Create a URL for the counter service private static final String counterUrl = FactoryService; private LocatorType locator = null; private CounterPortType counter = null; public void init(PortletConfig config) throws UnavailableException { superinit(config); try { // Create a grid service handle from the service URL URL GSH = new URL(counterUrl); // Get a reference to the CounterService Factory OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator(); Factory factory = gridLocatorgetFactoryPort(GSH); GridServiceFactory counterFactory = new GridServiceFactory(factory); // Create a new CounterService instance and get a refe |