开发一个Portlet
下面这部分将介绍如何进行简单的Portlet开发。首先创建一个标准的Java项目,然后创建一个portlet.xml文件,在这个文件中定义哪些Portlet对哪些容器有效,以及在实例化时需要使用哪些类,但这个文件并没有定义如何注册和识别Portlet。
图4显示了一个示例Portlet项目的目录结构。
图 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所示。
图 5 在Vignette中添加一个Portlet
图 6 在Vignette中搜索Portlet
添加Portlet到Portlet容器后,你还可以设置它们的位置、布局和属性,例如,你可以设置默认的宽度和位置,以及是否可以最小化和移动位置等。
图7显示了Vignette示例页面有三个Portlet,当用户登录到门户后默认就看到这三个Portlet。
图 7 在Vignette调整Portlet布局
图8显示了eXo JBoss Portlet容器默认的布局,当然你也可以在此基础上重新调整,以符合你特殊需要。
图 8 eXo JBoss 中可选的Portlet容器默认布局
通过Portlet容器可以很容易地改变整个网站的外观,风格,只需要改变Portlet的布局、皮肤或UI主题即可。
小结
本文介绍了门户和Portlet的入门基础知识,并提供了一个简单的实例,对如何创建和部署Portlet做了简要说明。目前既有开源的也有商业化的门户产品,不管采用哪种产品,基于门户的开发将使程序员的重心转移到业务逻辑上。门户技术还处于不断发展中,未来几年有可能出现新的门户技术,如果你正从事企业级开发,那么从现在开始关注门户技术吧!
原文:An Introduction to Java Enterprise Portals and Portlet Development
作者:Vlad Kofman
【责任编辑:杨赛 TEL:(010)68476606】