如何在JSF中使用查询字符串获取当前绝对URL?

时间:2013-05-31 05:44:33

标签: java jsf url

我正在尝试在托管bean的动作侦听器中获取绝对URL。我用过:

HttpServletRequest#getRequestURL() // returning http://localhost:7101/POSM/pages/catalog-edit
HttpServetRequest#getQueryString() // returning _adf.ctrl-state=gfjk46nd7_9

但实际网址为:http://localhost:7101/POSM/pages/catalog-edit?_adf.ctrl-state=gfjk46nd7_9&articleReference=HEN00067&_afrLoop=343543687406787。我不知道为什么参数artcileReference被省略。

是否有任何方法可以立即为我提供整个网址?如何获取包含所有查询字符串的整个URL?

2 个答案:

答案 0 :(得分:5)

您可以使用ServletRequest#getParameterNames()实例提供的ServletRequest#getParameter()HttpServletRequest手动重建网址。

以下是我过去用于此目的的示例代码:

private String getURL()
{
    Enumeration<String> lParameters;
    String sParameter;
    StringBuilder sbURL = new StringBuilder();
    Object oRequest = FacesContext.getCurrentInstance().getExternalContext().getRequest();

    try
    {
        if(oRequest instanceof HttpServletRequest)
        {
            sbURL.append(((HttpServletRequest)oRequest).getRequestURL().toString());

            lParameters = ((HttpServletRequest)oRequest).getParameterNames();

            if(lParameters.hasMoreElements())
            {
                if(!sbURL.toString().contains("?"))
                {
                    sbURL.append("?");
                }
                else
                {
                    sbURL.append("&");
                }
            }

            while(lParameters.hasMoreElements())
            {
                sParameter = lParameters.nextElement();

                sbURL.append(sParameter);
                sbURL.append("=");
                sbURL.append(URLEncoder.encode(((HttpServletRequest)oRequest).getParameter(sParameter),"UTF-8"));

                if(lParameters.hasMoreElements())
                {
                    sbURL.append("&");
                }
            }
        }
    }
    catch(Exception e)
    {
        // Do nothing
    }

    return sbURL.toString();
}

答案 1 :(得分:1)

在这里,我提出了我的解决方案,考虑到了HttpServletRequest#getParameterValues()方法:

,考虑了Alexandre给出的答案。
protected String getCurrentURL() throws UnsupportedEncodingException {
    Enumeration parameters = getServletRequest().getParameterNames();
    StringBuffer urlBuffer = new StringBuffer();
    urlBuffer.append(getServletRequest().getRequestURL().toString());

    if(parameters.hasMoreElements()) {
        if(!urlBuffer.toString().contains("?")) {
            urlBuffer.append("?");
        } else {
            urlBuffer.append("&");
        }
    }

    while(parameters.hasMoreElements()) {
        String parameter = (String)parameters.nextElement();
        String[] parameterValues = getServletRequest().getParameterValues(parameter);

        if(!CollectionUtils.sizeIsEmpty(parameterValues)) {
            for(int i = 0; i < parameterValues.length; i++) {
                String value = parameterValues[i];

                if(StringUtils.isNotBlank(value)) {
                    urlBuffer.append(parameter);
                    urlBuffer.append("=");                            
                    urlBuffer.append(URLEncoder.encode(value, "UTF-8"));

                    if((i + 1) != parameterValues.length) {
                        urlBuffer.append("&");
                    }
                }                                                                        
            }
        }                                    

        if(parameters.hasMoreElements()) {
            urlBuffer.append("&");
        }
    }

    return urlBuffer.toString();
}