将默认参数添加到<h:outputlink>,<h:commandlink>等等</h:commandlink> </h:outputlink>

时间:2012-02-04 19:34:14

标签: jsf-2

我想将lng参数添加到所有链接中。如何在不使用

的情况下执行此操作
<f:param name="lng" .... 

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

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

1 个答案:

答案 0 :(得分:0)

所以只需查看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。