Portal 是一种非常棒的web2.0技术,它基于JSR168 Java Portlet规范, 用户可以根据自己的喜好加载所需的Portlet。它提供给用户非常个性化的用户体验。
GWT 是一种由Google公司所开发的基于Java的Web框架技术,用于开发全Ajax应用程序。
如何让这两种诱人的技术整合在一起就是我所感兴趣的,同样也是这篇文章所要探讨的主题。现有的主流Portal平台技术有Liferay, Jboss Portal, JetSpeed-2,exo等,而这篇文章将会着重介绍如何使用Liferay Portal来整合GWT。
首先你必须要安装好GWT,你可以在Google Code网站上下载到GWT的最新版本http://code.google.com/webtoolkit/
本例子里使用的是gwt-windows-1.4.60版本。直到我发布Blog文章时GWT的最新版本为gwt-windows-1.4.61。我看过了ChangeLog其实只是更改了一些在Mac下的bugs,并没有太大的改动。所以我暂时没有更新。
其次就是要安装Portal平台了,之前已经说过主流的Portal平台技术有Liferay, Jboss Portal, JetSpeed-2, exo。其实每一个Portal都可以和GWT整合,我最初做的整合的Example就是在JBoss Portal上(说实话在所有的Portal平台中我最喜欢的就是JBoss Portal),之后在每个平台上都成功的整合了。因为考虑到国内大多数Portal开发者都习惯使用Liferay,所以在这里就探讨一下 Liferay于GWT的整合方式。 Liferay Portal是一个基于MIT License的免费的开源Portal项目,你可以在Liferay的官方网站上下载到http://www.liferay.com/。最新的版本是在2008年2月份才发布的Liferay Portal 4.4.0。我也是更新到了这个最新版本的Tomcat5.5.20绑定版。
接下来我就根据我制作的一个简单的时钟的Example,来说明整合实现的方式(例子可以在文章底部下载到)
项目结构
GWT客户端的实现方式:
package mqj.web.coral.client;
import mqj.web.coral.client.rpc.CoralService;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
/**
* @author maqujun
*
*/
public class Coral implements EntryPoint {
/** Timer is a serialized object of GWT */
private Timer timer;
private Label label = new Label("Wait...");
/**
* GWT Locat Time and set to the GWT label.
* @author maqujun
*/
private class CallBack implements AsyncCallback {
public void onFailure(Throwable caught) {
timer.cancel();
Window.alert(caught.getMessage());
}
public void onSuccess(Object result) {
label.setText(((Time) result).getTime());
}
}
private CallBack callBack = new CallBack();
/**
* Running a Timer to collect time from GWT Server.
*/
public void onModuleLoad() {
RootPanel.get("uid").add(label);
timer = new Timer() {
public void run() {
CoralService.App.getInstance().getTime(callBack);
}
};
timer.scheduleRepeating(1000);
}
}
gwt.xml配置文件的代码
<module>
<inherits name='com.google.gwt.user.User' />
<entry-point class='mqj.web.coral.client.Coral' />
<servlet path="/CoralService" class="mqj.web.coral.server.CoralServiceImpl" />
</module>
Coral.html文件代码
<html>
<head>
<title>Coral</title>
</head>
<body>
<script language='javascript' src='mqj.web.coral.Coral.nocache.js'></script>
<div id='uid'></div>
</body>
</html>
GWT服务器端的实现代码
package mqj.web.coral.server;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.text.DateFormat;
import java.util.Date;
import mqj.web.coral.client.Time;
import mqj.web.coral.client.rpc.CoralService;
/**
* Server side of GWT time project.
* @author maqujun
*
*/
public class CoralServiceImpl extends RemoteServiceServlet implements
CoralService {
/**
* Collect time.
*/
public Time getTime() {
String out = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.FULL).format(new Date());
return new Time(out);
}
}
GWT Portlet的实现代码
package mqj.web.coral;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletSecurityException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author maqujun
*
*/
public class CoralPortlet extends GenericPortlet {
protected void doView(RenderRequest renderRequest,
RenderResponse renderResponse) throws PortletException,
PortletSecurityException, IOException {
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.println("<script language='javascript' src='"
+ renderRequest.getContextPath()
+ "/mqj.web.coral.Coral.nocache.js'></script>");
writer.println("Coral's Time:");
writer.println("<div id='uid'></div>");
writer.close();
}
在上面贴出的代码里我标注为红色的代码是要特别注意的地方,这是Portlet可以调用GWT内容的关键。所以GWT控件必须被定义在Div中。
Portlet的配置XML
liferay-display.xml
<?xml version="1.0"?>
<display>
<category name="category.sample">
<portlet id="gwt_portlet" />
</category>
</display>
liferay-portlet.xml
<?xml version="1.0"?>
<liferay-portlet-app>
<portlet>
<portlet-name>gwt_portlet</portlet-name>
<instanceable>true</instanceable>
</portlet>
<role-mapper>
<role-name>administrator</role-name>
<role-link>Administrator</role-link>
</role-mapper>
</liferay-portlet-app>
portlet.xml
<?xml version="1.0"?>
<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">
<portlet>
<portlet-name>gwt_portlet</portlet-name>
<display-name>Coral GWTPortlet</display-name>
<portlet-class>mqj.web.coral.CoralPortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
</supports>
<portlet-info>
<title>Sample GWTPortlet</title>
<short-title>Sample GWTPortlet</short-title>
<keywords>Sample GWTPortlet</keywords>
</portlet-info>
<security-role-ref>
<role-name>administrator</role-name>
</security-role-ref>
</portlet>
</portlet-app>
以及web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>gwt_portlet</display-name>
<servlet>
<servlet-name>CoralService</servlet-name>
<servlet-class>mqj.web.coral.server.CoralServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CoralService</servlet-name>
<url-pattern>/CoralService</url-pattern>
</servlet-mapping>
</web-app>
以上的Portal xml和web.xml的配置是这个Portlet能够正常运行在Liferay中最基本的信息。
更多的代码在这里就不贴出来了,有兴趣的朋友可以看一下附件中的源代码。
使用Ant打包GWT为war文件,以admin权限登陆Liferay, 使用Portlet plugin加载war文件。然后通过Add Application加载到你的页面中即可运行。
运行的图片是这样的
已知的问题:
这样的整合只能用于普通的GWT Portlet项目的开发,如果你想使用GWT-EXT这样的GWT与EXT整合的实现方式,即你想要实现Portal+GWT+EXT2.0的开发模式时会有问题。我尝试过。问题的关键点在于Div的使用上,等我解决了这个问题后我会把我的解决方案发布出来与大家共享。
分享到:
- 2008-02-24 14:21
- 浏览 4839
- 评论(9)
- 论坛回复 / 浏览 (9 / 8421)
- 查看更多
相关推荐
Liferay Portal 是一个开源的企业级门户平台,广泛用于构建复杂的Web应用程序和企业内部协作系统。它提供了丰富的功能,包括内容管理、社交媒体集成、工作流支持以及用户界面定制。本资源集是针对Liferay Portal开发...
在Liferay中整合GWT(Google Web Toolkit)是一项常见的任务,尤其对于开发复杂的企业级Web应用来说,这种集成可以利用GWT的强大力量来创建高性能的用户界面,同时利用Liferay的门户功能和社区特性。这篇博文提供了...
Liferay Portal是一款开源的企业级门户平台,用于构建和管理复杂的企业级Web应用程序。在这个开发实例中,我们将深入探讨四个Liferay Portal MVC(Model-View-Controller)应用的实践案例,这些实例可以帮助开发者更...
Liferay Portal是一种开源的企业门户解决方案,支持使用Java语言构建企业内部网(intranets)和其他协作平台。根据提供的内容片段,我们可以了解到一些关于Liferay Portal书籍的具体信息,这本书是外国人编写的,受...
Liferay Portal 6是一款先进的企业级门户平台,旨在帮助企业构建和维护高效、安全、用户友好的内部网(Intranets)。它不仅提供了丰富的功能模块,如文档管理、工作流、社交媒体集成等,还支持高度定制化,使得企业...
【Liferay Portal 内容管理】是企业级门户平台Liferay Portal的重要组成部分,它提供了丰富的文档管理和信息发布功能,便于组织内部的信息共享与协作。 在Liferay Portal中,文档管理主要通过【Document Library】...
Liferay Portal是一个开源的企业级门户解决方案,它允许用户构建和部署Web应用程序和门户。它支持多种插件,包括Portlets(小应用程序)、主题、布局模板等,使得开发者能够灵活地创建企业级应用。 在描述中提到的...
**Liferay Portal** 是一款功能强大的企业级门户平台,支持多种应用集成和技术扩展。它不仅提供了丰富的特性满足企业日常需求,同时也支持高度定制化开发。本文档旨在指导开发者如何进行 Portlet 的开发并部署在 ...
- **Portal服务器**:是提供用户界面、整合各种应用和服务的平台,Liferay Portal就是这样的一个服务器,它能够聚合来自不同源的信息并提供统一的访问入口。 - **Portlet容器**:是portal服务器的一部分,负责管理...
### Liferay Portal 二次开发指南 ...总之,Liferay Portal的二次开发不仅涉及技术层面的编码和配置,还需要深入理解其架构和使用模式,才能充分利用其强大功能,构建出既高效又个性化的门户应用。
Using Liferay Portal 6.1
Liferay Portal 是一个开源的企业级门户平台,它允许用户创建、管理和定制各种Web应用程序和内容。这个求助主题可能涉及到在使用Liferay Portal过程中遇到的问题,或者是寻求关于如何更有效地利用其特性和功能的建议...
搭建Liferay Portal的开发环境是一项细致且复杂的过程,涉及到多个步骤和组件的配合。本文将根据给定的文件信息,详细解析如何从零开始构建一个完整的Liferay开发环境,包括必要的准备、具体步骤以及关键配置。 ###...
Liferay Portal是一个开源的企业级内容管理平台,它允许用户创建和管理网站、社区和工作流程。这个压缩包可能包含了该版本下用于数据库管理和优化的SQL脚本。 描述中的内容与标题相同,表明这个资源是专门针对...
《Liferay Portal 6 企业内网》一书详尽地介绍了如何利用Liferay Portal 6构建和维护高效的企业内部网络。Liferay Portal是一款开源的企业级应用平台,它集成了内容管理、工作流、社区工具等多种功能,为组织提供了...
liferay是一个现成的,即开即用的,功能完备的门户网站Liferay Portal,是一个完美的桌面协同办公组合,完全为企业和机构设计
Liferay Portal Liferay IDE
Liferay Portal 是一个基于 Java 的开源门户平台,提供了一个灵活的框架来构建企业门户和 web 应用程序。本文档将从架构解析、portal 规范、portlet 容器、portlet 生命周期、liferay portal 工作原理等方面对 ...