读者会发现我在示例2中定义的CONFIG_TITLE这个变量始终没有用到,其实是为了实现Portlet标题栏文字的自设定而放置的。
WebSphere Portal6中Portlet标题栏文字的修改比较怪异,本来按照JSR168中所规定的,只要使用RenderResponse.setTitle(String title)函数就可以设置标题了,而且我用这个方法在pluto-1.1.4中测试通过,但在WebSphere Portal中却怎么调都不行,看了IBM网站上的一篇文章《Tip: Changing a portlet title at run time in WebSphere Portal V6》才有点明白,似乎是IBM为了访问效率考虑,所以在WebSphere Portal中调用RenderResponse.setTitle只是修改了com.ibm.portal.portlet.Constants.DYNAMIC_TITLE这个值,然后还需要在皮肤中使用DOM,并读取该值才能显示。
下面是实现步骤。在示例2的代码中进行修改实现。
(1)修改皮肤。
复制IBM皮肤文件夹,重命名为IBM_DT,修改其中的control.jsp。
找到其中如下一段代码
<portal-skin:portletTitle>
<portal-fmt:problem bundle="nls.problem"/>
</portal-skin:portletTitle>
为其添加span或者div标签,用于修改时的定位,修改为
<span id="title.<portal-skin:portletID/>">
<portal-skin:portletTitle>
<portal-fmt:problem bundle="nls.problem"/>
</portal-skin:portletTitle>
</span>
然后在control.jsp文件的最下方,添加如下代码用于修改标题栏文字。
<script type="text/javascript">
var dynamicTitle ="<%=request.getAttribute(com.ibm.portal.portlet.Constants.DYNAMIC_TITLE)%>";
var titleElement = document.getElementById("title.<portal-skin:portletID/>");
if (titleElement != null) {
if (dynamicTitle != "" && dynamicTitle != "null")
titleElement.innerHTML = dynamicTitle;
}
</script>
如此,皮肤就修改完成了。
(2)修改PortletExamplePortletView.jsp,在其中添加一行代码。
renderResponse.setTitle(prefs.getValue(PortletExamplePortlet.CONFIG_TITLE, "ConfigTitle"));
(3)转入Portal中查看显示效果。
安装该皮肤,并且设置要修改标题的Portlet都要使用该皮肤。
为了演示此种方式可以同时在一个页面中给多个portlet设置不同的标题文字,我们可以再复制一个PortletExample Portlet,命名为PortletExample2,然后将其也添加到测试页面上。然后给这两个Portlet配置不同的参数,如下图,可以看到,两个Portlet的标题是不同的,显示内容、高度等也都不同。
为了演示此种方式可以同时在一个页面中给多个portlet设置不同的标题文字,我们可以再复制一个PortletExample Portlet,命名为PortletExample2,然后将其也添加到测试页面上。然后给这两个Portlet配置不同的参数,如下图,可以看到,两个Portlet的标题是不同的,显示内容、高度等也都不同。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/freewind88/jsr168-15.jpg)
这种方式修改的只是View视图时的标题,如果我们进入配置模式,会发现标题栏还是原来的名字。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/freewind88/jsr168-16.jpg)
RenderResponse.setTitle(String title)函数也可以在PortletExamplePortlet.java中的doView、doEdit等函数中调用,显示结果与直接在jsp中调用相同,留待读者自己尝试。