在Liferay Portal中使用DWR

Portal的概念风风火火地炒了好几年,确始终没有大红大紫。眼看着Ajax和Web 2.0朝自己杀来,靠Portal产品过日子的厂商们也终于按耐不住了。老牌开源Portal产品Liferay在其4.0版本中就加入了Ajax的东东,其Portlet的移动、添加和删除就是基于Ajax的。但是这远远是不够的,如果不能在产品级别更好的支持Portlet内部的Ajax,那么传统的Portal很可能会穷途末路,因为完全基于Ajax的PortalFramework已经出现了,如Light

然而无论Ajax和Web 2.0发展成什么样,有一点它是无法取代Portal的,就是Web系统的组件化乃至服务化。Portal最有价值的地方也就是提出了把Web系统当作组件或服务来集成,这样,无论是遗留下来的Web系统,还是新开发的Web系统,都可以很简单地集成在一块儿,并且,把某个Web系统替换掉也是很简单的。也许不久的将来,Ajax和Web 2.0的阵营中也会出现把Web系统当作组件或服务的技术,但是这其实就是Portal的概念,换汤不换药。

前阵子有机会在Liferay Portal下开发一些Ajax的Portlet,其中用到了DWR,有些tricky的地方,写在这里方便各位,也方便自己。

在Portlet的jsp中引用DWR的js不能简单地直接使用相对路径,比如,如果DWR的js相对jsp放在/dwr目录中的话,如下的引用方式是不对的:

<script type="text/javascript" src="/dwr/engine.js"></script>
<script type="text/javascript" src="/dwr/util.js"></script>
<script type="text/javascript" src="/dwr/interface/YourClass.js"></script>

因为当你把Portlet部署到Liferay的时候,这个相对路径的意义就变了。为了正确引用js,我们必须使用如下的声明方式:

<script type="text/javascript"
    src
='<%= renderResponse.encodeURL(renderRequest.getContextPath() + "/dwr/engine.js") %>'>
</
script>
<script type="text/javascript"
    src
='<%= renderResponse.encodeURL(renderRequest.getContextPath() + "/dwr/util.js") %>'>
</
script>
<script type="text/javascript"
    src
='<%= renderResponse.encodeURL(renderRequest.getContextPath() +
                 "/dwr/interface/RssReader.js") %
>'>
</
script>

其中的renderRequest和renderResponse是Liferay Portal添加到jsp中的隐含变量,负责对Portlet进行渲染。renderRequest.getContextPath()就是当前jsp的路径,加上js相对于jsp的路径,最后要用renderResponse.encodeURL()方法解码一下才能得到正确的路径。

其他方面,DWR的使用方法就和在一般的jsp中的使用方法一样了。从这里也可以看出,不光是使用DWR,所有对js及其他资源的引用都要用这种方法。
posted on 2006-08-09 10:31  Allen Young  阅读(2082)  评论(7编辑  收藏  举报