portlet java_探秘企业门户开发:Java Portlet入门(2)

开发一个Portlet

下面这部分将介绍如何进行简单的Portlet开发。首先创建一个标准的Java项目,然后创建一个portlet.xml文件,在这个文件中定义哪些Portlet对哪些容器有效,以及在实例化时需要使用哪些类,但这个文件并没有定义如何注册和识别Portlet。

图4显示了一个示例Portlet项目的目录结构。

a784343a8fac674cd7f2d155bf9917a4.png 

图 4 Portlet项目结构示例

下面的portlet.xml定义了一个Portlet:<?xmlversion ="1.0"encoding="UTF-8"?>

"http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

"http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"

version="1.0">

QuickSearch

org.springframework.web.portlet.DispatcherPortlet

contextConfigLocation

/WEB-INF/context/portlet/QuickSearchDefinition.xml

text/html

view

Quick Search

从上面的内容可以看出portlet.xml指定contextConfigLocation为Spring类的初始化参数。

列表1显示了完整的contextConfigLocation文件的内容。<?xmlversion ="1.0"encoding="UTF-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

class="com.portlet.controller.QuickSearchController"

parent="basePageController">

true

value="com.portlet.command.commandObject"/>

quick.search

quick.search

true

org.springframework.web.portlet.handler.

PortletModeParameterHandlerMapping">

"org.springframework.web.portlet.handler.PortletModeHandlerMapping">

接下来就是编写Java代码实现控制器,视图和Portlet处理程序了。视图是一个JSP页面,控制器和Portlet处理程序是Java类。在控制器和处理程序的帮助下,从不同数据源提取数据,如Web Service,数据库或feed等,你可以通过命令模式将这些数据传给视图,运输工具使用commandObject。下面的代码展示了如何使用Portlet API获取数据并返回给视图层。@Override

protectedModelAndView handleRenderRequestInternal(

RenderRequest request, RenderResponse response)throwsException

{

logger.info ("Inside Controller handleRenderRequestInternal");

Map model =new

HashMap();

CommandObject commandObject =

(CommandObject)request.getPortletSession().getAttribute(

CommandObject.COMMAND_NAME,PortletSession.APPLICATION_SCOPE);

if(commandObject ==null){

commandObject =newCommandObject();

}

// logic to get the data and put it in the commandObject

// should be here...

String view = getFormView();

model.put("commandObject", commandObject);

ModelAndView mav =newModelAndView(view, model);

returnmav;

}

@Override

publicvoidonSubmitAction (finalActionRequest request,

finalActionResponse response,finalObject command,

finalBindException bindException)throwsException

{

logger.info ("Inside onSubmitAction");

// Set the form bean into session so that it will be available

CommandObject commandObject = (CommandObject)command;

logger.info("Command Object :"+ToStringBuilder.reflectionToString(

commandObject));

request.getPortletSession ().setAttribute ("command_obj",

command,PortletSession.APPLICATION_SCOPE);

}

在JSP文件中,你可以象下面这样检索数据:

method="post"commandName="commandObject">

var="listItem"varStatus="loop">

注意这个Portlet并没有指出它在屏幕上的布局,是否可以调整大小,宽度和高度应该保持多少为佳,这些属性都由Portlet容器来进行控制的。

为了让Portlet可以真正运行,你还需要编译并部署它。在编译时,创建一个标准的Java war文件(一般使用Ant或Maven创建),部署时将war文件放到托管Portlet容器的应用服务器上。当Portlet配置好,且在Portlet容器中注册后,就要借助portlet.xml文件查找哪些容器中可以使用哪些Portlet了。例如,在Vignette Portal中,你可以通过搜索找到需要的Portlet,然后将其添加到门户中,如图5和图6所示。

c836fad00fbebeefa9fe85a76fcfa170.png 

图 5 在Vignette中添加一个Portlet

993fe25275787a253b5c4f3285acc74f.png 

图 6 在Vignette中搜索Portlet

添加Portlet到Portlet容器后,你还可以设置它们的位置、布局和属性,例如,你可以设置默认的宽度和位置,以及是否可以最小化和移动位置等。

图7显示了Vignette示例页面有三个Portlet,当用户登录到门户后默认就看到这三个Portlet。

517924160a705b43b0a6ff1aaf56f337.png 

图 7 在Vignette调整Portlet布局

图8显示了eXo JBoss Portlet容器默认的布局,当然你也可以在此基础上重新调整,以符合你特殊需要。

ae26d8e4e0b63d527c1075be536e2cbe.png 

图 8  eXo JBoss 中可选的Portlet容器默认布局

通过Portlet容器可以很容易地改变整个网站的外观,风格,只需要改变Portlet的布局、皮肤或UI主题即可。

小结

本文介绍了门户和Portlet的入门基础知识,并提供了一个简单的实例,对如何创建和部署Portlet做了简要说明。目前既有开源的也有商业化的门户产品,不管采用哪种产品,基于门户的开发将使程序员的重心转移到业务逻辑上。门户技术还处于不断发展中,未来几年有可能出现新的门户技术,如果你正从事企业级开发,那么从现在开始关注门户技术吧!

原文:An Introduction to Java Enterprise Portals and Portlet Development

作者:Vlad Kofman

【责任编辑:杨赛 TEL:(010)68476606】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值