欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Liferay Portal中使用DWR

程序员文章站 2022-03-15 15:55:44
...
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及其他资源的引用都要用这种方法。