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

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

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

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

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

【问题讨论】:

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

标签: jsf-2


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2013-09-25
    • 1970-01-01
    • 2015-10-06
    • 2011-01-20
    • 2017-01-07
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多