在IBM WebSphere Portal中实现可定制的打印
程序原理
本程序工作原理如下:
1)首先,通过新建Portal外表,在每个Portlet外部“套”上一个div。div上加上两个额外的属性pageprint、displaytext以及HTML标准属性id。pageprint用于标识该Portlet是一个可以被“打印管理器”管理的Portlet。displaytext用于给“打印管理器”中的“打印小部件”提供文本显示,它的值为Portlet的标题。id的值是Portlet的id值,它被用来关联“打印小部件”和真正的Portlet,以便取到实际要打印的内容。
2) 用Dojo实现一个“打印管理器”,它能够搜索到当前页面上所有具有pageprint标识的Portlet,将它们显示出来。并且提供六种布局格式供用户选择。
3)通过新建Portal主题,方便的在用户的Portal页面上增加一个“启动打印管理器”的链接,该链接用于调用2)中提到的“打印管理器”。
打印管理器
打印管理器由如下四个区域组成(见图10):
“打印小部件”选择区:该区域列出所有当前页面上的“打印小部件”,用户可以通过拖拽的方式将其放入打印布局定制区。
布局方式选择区:该区域列出了一栏、两栏、三栏、T字型、倒T字型以及“工”字型六种打印布局方式。用户可以根据自己的打印需要从中选择合适的布局方式。
打印布局定制区:该区域根据用户当前选定的打印布局方式显示一个相应的表格,然后用户可以从“打印小部件”选择区选取需要的“打印小部件”放入该表格。最终打印将根据该表格的内容打印出结果。
按钮区:该区域显示三个按钮。它们分别是“打印”、“预览”和“取消”。“打印”将直接打印定制好的结果,而“预览”会显示一个预览效果以便用户进行修改。
图 10. 打印管理器示意图 
什么叫“打印小部件”?
打印小部件表示页面上的一个可打印单元,通过打印管理器可以管理这些打印小部件。在本文中,打印小部件即指Portlet,但事实上通过“标记”,页面上的任何元素都可以成为打印小部件。
图11是一个真实“打印管理器”的屏幕截图,将它与图10进行对照可以更容易地理解“打印管理器”的工作方式。
图 11. 打印管理器屏幕截图 
开发新“外表” - 将Portlet标识为“打印小部件”
什么样的页面元素可以被“打印管理器”识别为“打印小部件”呢?正如“程序原理”部分中讲到的,所有的“打印小部件”都必须具有三个属性pageprint,displaytext和id。清单1中示范了这两种属性的用法。
清单 1. 打印小部件示例
<table id="mytable" pageprint="true" displaytext="示例表格"> ... </table> <img id="myimage" src="myimage.jpg" pageprint="true" displaytext="示例图片"/>
在一般的Web应用程序中,这些属性需要手工添加。如果您使用的是基于组件的Web框架,可以直接在组件的级别上添加这些属性。在IBM WebSphere Portal,通过创建“外表”就可以为每个应用了该“外表”的Portlet添加这些属性,也就是说,这些Portlet会自动标识为“打印小部件”。从另一个角度讲,在开发Portlet的阶段,开发者可以完全不用关心此事,而是将它推迟到部署阶段来完成。 简单来说,创建新“外表”只需要拷贝一个Portal中已有的“外表”目录(一般是IBM),更改目录名称,然后根据自己的需要修改里面的jsp文件,最后在Portal的管理界面添加就可以了。如何创建“外表”不是本文的重点,因此本文不做详细叙述,具体步骤请参考 Portal Info Center 。创建好“外表”目录后,打开Control.jsp,找到class为“wpsPortlet”的div标签,在其外面加上一个div标签,在该标签中上添加属性pageprint、displaytext和id。displaytext的值就是Portlet的标题,id就是Portlet的id。示例代码见清单2。
清单 2. Control.jsp示例
... <div pageprint="true" displaytext="<portal-skin:portletTitle/>" id="<portal-skin:portletID />"> <div class="wpsPortlet" ...> ... </div> </div> ...
开发新“主题” - 集成“打印管理器”到Portal页面
"主题"的开发,简单来说,也是拷贝一个已有的“主题”目录(一般是IBM),更改目录名,然后根据需要修改添加删除里面的程序文件,最后在Portal的管理界面添加即可。具体开发“主题”的步骤请参考 Portal Info Center 。新“主题”目录创建后,在主题目录下:
创建PrintManager.jspf,该文件包含“打印管理器”所有的页面元素。
创建js/PrintManager,拷贝Dojo库文件到该目录(Dojo库文件从Dojo的网站下载)并创建文件PrintManager.js。PringManager.js定义实现“打印管理器”的函数。
创建images/PrintManager,该目录包含六种布局方式的示意图片。
修改Default.jsp让它包含PrintManager.jspf - 找到id为“mainContent”的div标签,在它上面加入一个行include语句。示例代码见清单3。清单 3. Default.jsp示例
... <%@ include file="./PrintManager.jspf" %> <div id="mainContent"> <portal-core:screenRender/> ... </div> ...