1

页面标题

有没有办法在运行时动态更改页面标题?

我知道您可以在门户级别更改页面标题,但此解决方案不提供任何 SEO 价值,因为它不会更改页面中的 TITLE 标记。

对于我所看到的更改门户标题的方式是非常静态的(这些是全局设置):

  • 更改主题策略中的bannerTitleText
  • 如果不存在,请将bannerTitleTextResourceBundle 和bannerTitleTextResourceKey 调整为所需的值。
  • 否则,在主题配置中全局设置标题

我们的目标是能够在页面级别设置标题,以便它可以在页面之间更改并包含相关页面的关键字。

实际上,如果这可以从 WCM 完成,那将是最理想的。

更新

我注意到 WebSphere Portal 6.1.5 中的默认主题是附加页面标题,因此检查了主题并且确实足够 jspInit.jspf 有一些以下新方法:



private static com.ibm.portal.state.service.PortalStateManagerServiceHome portalStateManagerServiceHome;

// (This goes in the jspInit constructor)
portalStateManagerServiceHome = (com.ibm.portal.state.service.PortalStateManagerServiceHome) ctx.lookup("portal:service/state/PortalStateManager");

protected com.ibm.portal.state.service.PortalStateManagerService getStateManagerService( javax.servlet.ServletRequest request, javax.servlet.ServletResponse response ) throws Exception {
    final com.ibm.portal.state.service.PortalStateManagerService psms = portalStateManagerServiceHome.getPortalStateManagerService( (javax.servlet.http.HttpServletRequest) request, (javax.servlet.http.HttpServletResponse) response );
    return psms;
}
protected boolean isStaticPage( javax.servlet.ServletRequest request, javax.servlet.ServletResponse response ) throws com.ibm.portal.ModelException {
    final com.ibm.portal.model.NavigationSelectionModelProvider nsmProvider = navigationSelectionModelHome.getNavigationSelectionModelProvider();
    final com.ibm.portal.navigation.NavigationSelectionModel nsm = nsmProvider.getNavigationSelectionModel(request, response);
    final com.ibm.portal.navigation.NavigationNode currentNavNode = (com.ibm.portal.navigation.NavigationNode) nsm.getSelectedNode();
    final com.ibm.portal.content.ContentNode currentContentNode = currentNavNode.getContentNode();

    return currentContentNode.getContentNodeType().equals( com.ibm.portal.content.ContentNodeType.STATICPAGE );
}

protected com.ibm.portal.navigation.NavigationNode getSelectedNode( final javax.servlet.ServletRequest request, javax.servlet.ServletResponse response ) throws com.ibm.portal.ModelException {
    com.ibm.portal.model.NavigationSelectionModelProvider nsmProvider = navigationSelectionModelHome.getNavigationSelectionModelProvider();
    com.ibm.portal.navigation.NavigationSelectionModel nsm = nsmProvider.getNavigationSelectionModel(request, response);
    return (com.ibm.portal.navigation.NavigationNode) nsm.getSelectedNode();
}

protected String getSelectedNodeTitle( final javax.servlet.ServletRequest request, javax.servlet.ServletResponse response ) throws com.ibm.portal.ModelException {
    final String title;
    if ( localizedContextHome != null ) {
        com.ibm.portal.model.LocalizedContext context = localizedContextHome.getLocalizedContext( (javax.servlet.http.HttpServletRequest) request );
        title = context.getTitle( getSelectedNode( request, response ) );
    } else {
        title = "";
    }

    return title;
}

添加后,我能够从 6.1.5 主题复制 head_title.jspf;其中包括以下新行:


<c:set var="selectedNodeTitle" value="<%=getSelectedNodeTitle(request, response)%>" />
<title><c:out value="${siteTitle} - ${selectedNodeTitle}"/></title>

现在剩下的就是想办法从 WCM 中获取它。

4

2 回答 2

2

我将介绍缺少的 WCM 部分,因为我已经实现了它。我将能够为您提供所需的信息,但没有现成的代码。它只是从一个流中读取并写入另一个流,所以你应该能够掌握这个想法。使用 Portal 6.1 最合理的方式是为此需求开发一个Servlet 过滤器。你想做的是:

  1. 使 WCM 组件打印出您想要注入 html 标头的正确信息。这通常意味着例如导航器组件打印当前路径/标题。
  2. 将这些组件添加到您的演示模板中。您可能希望它使用 html 注释标签<!-- -->和一些您可以稍后从生成的 html 解析的方案。
  3. 构建一个 servlet 过滤器,如果它是 html/xhtml(使用 mime 类型),则从 ServletResponse 读取整个页面。在你这样做的时候解析评论。现在,用正确的标签在 html 标题部分重写一个新页面。
  4. 重新注入新的响应页面,这次该页面具有正确的 SEO html 标头。

不幸的是,这是你必须采取的方式。甚至没有隐藏/私有 API 允许您从 WCM 呈现 portlet 的应用程序上下文中获取您想要的内容并将其放入 html 标头中。此外,您必须将 servlet 过滤器添加到 wps 应用程序。这里的一个常见问题是您必须在编辑 web.xml 后重新部署它。

servlet 过滤器的性能影响可以忽略不计(总共只有几个百分比),而且这种方法很有效。根据我的经验,它非常适合 SEO 目的,您几乎可以通过这种方式从 WCM 获得任何信息。

于 2011-08-29T20:22:33.730 回答
0

我只是想更新这个问题,提到有一个新功能可以更好地实现同样的目标。

新的 Web 内容查看器 (286) 利用了 JSR 286 中称为两阶段渲染的新功能,其中创建了一个称为 doHeaders 的新事件。在 doHeaders 事件下,可以修改响应以在头部添加元素,例如标题。

现在,Web 内容查看器提供了一个页面显示标题设置,使您可以从内容中进行选择

现在剩下的就是让我们的开发人员能够从 Web 内容中设置其他元素,例如:规范元素/链接、元标记等。但我认为新的 Web 内容文件夹功能可以让我们在主题级别构建一些东西。

祝所有有 SEO 意识的 Lotus Web Content Management 开发人员好运。

于 2011-12-02T20:35:33.927 回答