最近学习Liferay,想通过Flex开发Portlet,但是又没有办法使Flex与服务器通讯,网上找来找去,都是通过RemoteObject进行通讯的,例如:
https://www.liferay.com/zh_CN/c/blogs/find_entry?entryId=2906618
最后只找自己动手,丰衣足食了。
其实通过HTTPService与Portlet通讯主要需要解决两个问题:
1. 通过某种方法将Flash文件嵌入Portlet页面中(由于在Portal容器中无法直接得到Portlet工程下的资源);
2. 通过一种类似Ajax的方式与Portlet交互,使得Portal容器对返回值不做过多的包装,并且访问的URL可以由Flex获取到。
第一个问题通过查询Java Portal2.0规范中关于Resource的描述解决:
http://developers.sun.com/portalserver/reference/techart/jsr286/jsr286_2.html
其中提到,可以通过:
获取Portlet工程的WebRoot目录访问地址。
而第二个问题,也可以通过生成ResourceURL来解决,不过ResourceURL主要用作返回Portlet资源,比如js、css、swf文件等的,因此在这里不是很适合,并且通过ResourceURL标签生成的地址中参数的部分在中间,不好修改,因此传递给flex时比较麻烦。
最后,我找到了liferay的LiferayWindowState中有一种状态为EXCLUSIVE,也就是只显示Portlet内容,正好符合我们的需要,那么就通过RenderURL标签生成访问地址,再将地址通过param交给flex即可,flex中获取此地址后,再通过HTTPService访问即可。
生成地址的代码如下: