Poetlet服务封装了portlet中的可重用的商业和逻辑操作。Portlet服务有利于将逻辑操作最小化,便于重用。另一方面,portlet服务还有下面的好处:
内建的持久化框架有有利于将对象持久化到关系数据库中。
内建的访问控制权限有利于安全控制
集成测试框架
Spirit服务接口借用了websphere的接口。下面时服务的UML图:
<!--[if !vml]--><!--[endif]-->
PortletServiceFactory负责产生、初始化、销毁portlet服务。PortletService定义了一个空的服务接口,而PortletServiceProvider定义了增加了生命周期,当服务初始化和销毁的时候调用init和destroy方法。服务描述文件定义了服务和初始化参数。通过PortletServiceConfig这个类可以得到初始化参数。
一个portlet可以通过PortletContext对象得到服务。getService()方法返回一个服务对象PortletService。
ExampleService = (ExampleService)getPortletConfig().getContext().getService(ExampleService.class);
用户服务时带有权限的服务,例如UserManagerService服务中的方法deleteUser(User user)只有超级用户才能执行,其他用户才会抛出PortletServiceAuthorizationException异常。
核心portlet服务
Spirit包含几个核心服务,这些服务有基本的portlet所调用。仅有LoginService不是用户服务。UserManagerService和AccessControlService都是用户服务。
Portlet服务举例
下面列举一个股票报价的服务StockQuoteService,这个服务只有一个方法getStockQuotes,返回从quote.com服务得到的股票报价列表。
定义服务
在WEB-INF/PortletServices.xml文件中定义一个服务实体:
...
<service>
<name>Stock Quote Service</name>
<description>Provides Stock Quotes</description>
<interface>org.myorg.services.StockQuoteService</interface>
<implementation>org.myorg.services.impl.StockQuoteServiceImpl</implementation>
<service-config>
<param-name>quote_service</param-name>
<param-value>quote.com</param-value>
</service-config>
</service>
定义服务接口
package org.myorg.services.StockQuoteService;
import com.kuaff.spirit.portlet.service;
import java.util.List;
public interface StockQuoteService extends PortletService { <!--[if !vml]--><!--[endif]-->
public List getStockQuotes(); <!--[if !vml]--><!--[endif]-->
}
<!--[if !vml]--><!--[endif]-->
StockQuoteService必须继承PortletService
<!--[if !vml]--><!--[endif]-->
定义了一个方法:getStockQuotes
定义服务实现
package org.myorg.services.impl.StockQuoteServiceImpl;
import org.myorg.services.StockQuoteService;
import com.kuaff.spirit.portlet.service.*;
import com.kuaff.spirit.portlet.service.spi.PortletServiceProvider;
import java.util.List;
public class StockQuoteServiceImpl implements PortletServiceProvider, StockQuoteService {
public void init(PortletServiceConfig config)
throws PortletServiceUnavailableException {
// 初始化
}
public void destroy() {
// 销毁
}
public List getStockQuotes() {
// 得到股票报价列表
}
}
Portlet中访问服务
package org.myorg.portlets.StockQuotePortlet;
// 这里忽略了import
public class StockQuotePortlet extends AbstractPortlet {
public void actionPerformed(ActionEvent event) {
PortletContext ctx = getPortletConfi().getContext();
StockQuoteService quoteService = null;
try {
StockQuoteService quoteService = (StockQuoteService)ctx.getService(StockQuoteService.class);
} catch (PortletServiceException e) {
getPortletLog().error("Couldn't get quote service instance", e);
return;
}
// 得到股票报价列表,并放到request中
List quotes = quoteService.getStockQuotes();
req.setAttribute("stocks", quotes);
}
public void doView(PortletRequest req, PortletResponse res) {
// 显示股票报价
List quotes = req.getAttribute("stocks");
...
}
}
用户服务举例
还是以上一个例子为例,假定只有管理员可以配置股票,这样StockQuoteService将变成了用户服务。
定义用户服务
仅仅增加了user-required元素
<service>
<name>Stock Quote Service</name>
<user-required>true</user-required>
<description>Provides Stock Quotes</description>
<interface>org.myorg.services.StockQuoteService</interface>
<implementation>org.myorg.services.impl.StockQuoteServiceImpl</implementation>
<service-config>
<param-name>quote_service</param-name>
<param-value>quote.com</param-value>
</service-config>
</service>
必须设置<user-required>true</user-required>
编辑用户接口
...
setQuoteService(String quoteService);
....
定义用户服务实现
package org.myorg.services.impl.StockQuoteServiceFactory;
import org.myorg.services.StockQuoteService;
import com.kuaff.spirit.portlet.service.*;
import com.kuaff.spirit.portlet.service.spi.PortletServiceProvider;
import java.util.List;
public class StockQuoteServiceFactory implements PortletServiceProvider, StockQuoteService {
// 产生单例
private instance = new StockQuoteFactory();
private StockQuoteServiceFactory() {}
public static StockQuoteServiceFactory getInstance() {
return instance;
}
public void init(PortletServiceConfig config)
throws PortletServiceUnavailableException {
// 初始化
}
public void destroy() {
// 销毁
}
public List getStockQuotes() {
// 得到股票列表
}
public void setStockQuoteService(String quoteService) {
// 设置股票服务
}
}
下一步就是对StockQuoteServiceImpl增加权限检查。
package org.myorg.services.impl.StockQuoteServiceImpl;
import org.myorg.services.StockQuoteService;
import com.kuaff.spirit.portlet.services.*;
import com.kuaff.spirit.portlet.services.spi.PortletServiceProvider;
import java.util.List;
public class StockQuoteServiceImpl implements PortletServiceProvider, StockQuoteService {
private StockQuoteServiceFactory quoteServiceFactory = null;
private PortletServiceAuthorizer authorizer = null;
public UserManagerServiceImpl(PortletServiceAuthorizer authorizer) {
this.authorizer = authorizer;
}
public void init(PortletServiceConfig config)
throws PortletServiceUnavailableException {
// 使用StockQuoteServiceFactory配置
quoteServiceFactory = StockQuoteServiceFactory.getInstance();
quoteServiceFactory.init();
}
public void destroy() {
// 销毁
quoteServiceFactory.destroy();
}
public List getStockQuotes() {
quoteServiceFactory.getStockQuotes();
}
public void setStockQuoteService(String quoteService) { <!--[if !vml]--><!--[endif]-->
// 设置股票服务
//检查权限
authorizer.authorizeSuperUser();
quoteServiceFactory.setStockQuoteService(quoteService);
}
}
Portlet中访问用户服务
...
public void actionPerformed(ActionEvent event) {
PortletContext ctx = getPortletConfig().getContext();
PortletRequest req = event.getPortletRequest();
User user = req.getUser();
StockQuoteService quoteService = null;
try {
StockQuoteService quoteService = (StockQuoteService)ctx.getService(StockQuoteService.class, user);
} catch (PortletServiceException e) {
getPortletLog().error("不能得到服务实例", e);
return;
List quotes = quoteService.getStockQuotes();
req.setAttribute("stocks", quotes);
}
....
分享到:
相关推荐
### UAP V6.3 Portal开发技术手册知识点 #### UAP Portal概述 UAP Portal是基于JSR286规范实现的J2EE技术体系架构的门户平台,该平台不仅可以展现产品需求,还具备强大的系统集成组装功能。它支持多种集成框架,...
《LifeRay Portal 6.0.6 学习手册》是一份针对LifeRay Portal初学者的详细教程,旨在帮助读者深入了解和掌握LifeRay Portal的使用和开发。下面将对其中的关键知识点进行深入探讨。 1. **LifeRay Portal初体验** ...
【用友UAP的Portal开发】是针对企业级Web应用的一种解决方案,旨在提供一个集成了多种功能和服务的统一入口。UAP Portal是基于JSR 286规范,遵循J2EE技术体系,具备强大的系统集成和组装能力。它不仅支持产品展示...
Portlet技术是Web应用程序开发中的一个重要组成部分,尤其是在企业级应用如Java Portal平台中。JSR-170,全称为Java Portlet API 1.0,是Java Community Process(JCP)发布的一项标准,用于定义portlet如何在门户...
d Authorization Service) 配置......................总的来说,Stringbeans(TM) Portal管理手册是一份详尽的指南,涵盖了从基础安装到高级功能的所有方面,为用户提供了一个全面了解和管理Stringbeans Portal的框架。
【JBoss Portal手册】是企业级Java应用服务器JBoss提供的一种综合性的门户解决方案。这个平台允许组织构建、部署和管理富互联网应用程序,提供了一个统一的入口点,供用户访问多种服务和信息。作为开发者或者系统...
1. **portlet概念**:portlet是portal中的可重用组件,能够独立提供服务,如新闻显示、天气预报、社交媒体集成等。 2. **JSR268**:Portlet 2.0规范,增加了portlet的灵活性和互操作性,如支持Ajax增强的用户界面、...
它采用MVC(模型-视图-控制器)设计模式,提供了一个可扩展的框架,支持portlet、主题、布局和服务的开发。Liferay还引入了Service Builder,使得创建和部署服务变得简单。 2. **Portlet 开发** Portlet是Liferay ...
【标题】:“Portal” 【描述】:“SoftPortal Good” ...JSR168作为portlet开发的标准,为构建这样的平台提供了基础,而JSR168 PORTLET标准手册汉化整理.doc则是开发者深入了解和实践这一标准的重要参考资料。
### Portal PUMA开发手册知识点概述 #### 一、引言与用户管理介绍 - **WebSphere Portal 用户管理**:WebSphere Portal 提供了一个强大的用户管理组件,它能够连接到不同的用户存储库(如LDAP、数据库等),这些...
《Spring Framework 2.0 中文参考手册》是Java开发者不可或缺的重要参考资料,它全面解析了Spring框架的核心概念、设计模式以及实现细节。Spring作为一个开源的轻量级框架,旨在简化企业级应用的开发,通过依赖注入...
- 它整合了portlet框架、工作流、内容管理、搜索和个性化功能,为企业构建统一的入口点。 2. **系统需求** - 在开始安装前,必须确保你的硬件和软件环境满足WebSphere Portal V6.1的要求,包括操作系统(如...
### 中国移动ORACLE Portal 安全配置手册关键知识点解析 #### Oracle AS 平台安全概述 **1.1 Oracle AS 平台简介** - **Oracle AS 平台**:是Oracle公司提供的一套全面且完整的电子商务解决方案的重要部分,基于...
格里芬,Neil Griffin是Liferay Portal的委员以及JSF开发团队领导者,并且是Portlet Faces项目的合作创始人。 目录 第I部分 javaserver faces框架 第1章 javaserver faces简介 1.1 什么是javaserver faces 1.2 ...
- **portlet开发参考手册**:Portlet是LifeRay中的核心组件,用于展示动态内容和交互功能。这个参考手册可能详细介绍了portlet的生命周期、开发过程和集成方法。 综合来看,这些资源对于想要学习和精通LifeRay开发...
格里芬,Neil Griffin是Liferay Portal的委员以及JSF开发团队领导者,并且是Portlet Faces项目的合作创始人。 目录 第I部分 javaserver faces框架 第1章 javaserver faces简介 1.1 什么是javaserver faces 1.2 ...