在我所经历的Portal项目中,大部分都存在“如何集成外部Web应用”的问题。解决这个问题有多种方式,其中常用的一种方式就是iframe,也就是直接用iframe将外部Web应用包含进来。
iframe最大的优势在于它无需编程就能够集成外部应用,方便快速。而且如果外部应用有所更改马上就会看到效果。但是iframe也有不少硬伤,是需要在采用之前考虑到的,我总结了大致有:
1)页面刷新问题
假设现在页面上有两个Portlet,PortletA和PortletB,其中PortletB非常简单,包含iframe如下:
<iframe width=420 height=330 frameborder=0 scrolling=auto src=URL1></iframe>
用户在iframe操作后,跳到URL2的页面。<然后用户点击PortletA的提交按钮,或者浏览器的刷新按钮,浏览器都会重新获得“<iframe width=420 height=330 frameborder=0 scrolling=auto src=URL1></iframe>”这个语句,也就是重新显示原始页面——URL1。
请注意,这个问题无论是否采用Portal都会存在,只要页面包含iframe,那么该页面的提交都会导致所有的iframe重新显示原始页面。
2)页面风格问题
一般的网页都是假设自身在800*600以上的分辨率下显示,一般都包含了头部信息(例如系统名称/Logo,),尾部信息(例如联系电话等),还有大表格等等,因此并不适合通过iframe内嵌在另外一个网页来观看。另外还需要考虑到网页的风格——例如字体、大小、颜色等等的不同。
3)Portlet交互问题
由于iframe中的内容是在另外一个Web服务器上运行,与Portal服务器实际上是没有关系。iframe无法与其他Portlet共享HTTP Session、Portal Context等属性,因此很难与其他Portlet进行交互。
4)Portlet Render Cache和iframe
一个门户页面包含多个Portlet,当用户在某个Portlet中提交时,其他Portlet的内容也会重新渲染。Portal服务器一般会提供了Portlet Render Cache技术来将Portlet的显示内容缓存起来,避免不必要的执行,从而提高性能。但是iframe集成的内容实际上完全不经过Portal服务器,所以这个选项对它是不起作用的。
因此在通过iframe技术进行集成时,要充分考虑到iframe的优劣势,一般来说具备以下特性的页面比较适合用iframe来集成。
a. 页面风格简单,主要以数据为主,很少装饰元素
b. 页面逻辑简单,很少用户交互,可以通过URL参数获得相应的结果