为 <h:outputLink>、<h:commandLink> 等添加默认参数

Posted

技术标签:

【中文标题】为 <h:outputLink>、<h:commandLink> 等添加默认参数【英文标题】:Add default parameter to <h:outputLink>, <h:commandLink> and so on 【发布时间】:2012-02-26 23:14:39 【问题描述】:

我想将lng 参数添加到所有链接。我怎么能不使用

<f:param name="lng" .... 

在每个链接中? lng 的值在会话范围的 bean 中。

也许Filter 可以做到这一点,但在这种情况下,我如何在不注入的情况下访问该值?

【问题讨论】:

如果它已经在会话范围的 bean 中,为什么还需要它?是为了纯粹的 SEO 目的吗? 没错,搜索引擎优化的目的,我们的搜索引擎优化部门需要在页面上的每个链接上都有lng 【参考方案1】:

所以只要查看 URLRewrite 过滤器,我就找到了解决方案。

我编写了一个覆盖响应的过滤器和 encodeURL 方法。

doFilter 方法,检测请求中是否有 lng 参数,如果没有,则从 getDefaultLng 方法中的 bean 获取默认 lng 值:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException 
    final HttpServletRequest hsRequest = (HttpServletRequest) request;
    final HttpServletResponse hsResponse = (HttpServletResponse) response;
    if (hsRequest.getParameter("lng")!=null)
        lng = hsRequest.getParameter("lng");
      else 
        lng = getDefaultlng(hsRequest, hsResponse);
    
    LngResponse lngResponse = new LngResponse(hsResponse,lng);
    chain.doFilter(hsRequest, lngResponse);

一个只添加参数的LngResponse#encodeURL

public String encodeURL(String s) 
    s = parseUrl(s);
    return super.encodeURL(s);


private String parseUrl(String s)
    if (s.indexOf("lng=")==-1)
        if (s.indexOf("?")>-1)
            s = s+"&lng="+this.lng;
         else 
            s = s+"?lng="+this.lng;
        
    
    return s;

终于成功了,所以我们的 SEO 部门有他们独特的 URI。

【讨论】:

以上是关于为 <h:outputLink>、<h:commandLink> 等添加默认参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSF h:outputLink 生成页面锚点

h:link 和 h:outputLink 之间的区别

JSF 中 f:param 的条件渲染

JSF2 - 以编程方式创建 HtmloutputLink

警告:JSF1091:找不到“外部链接”的mime类型

如何在 JSF 2.0 中重定向