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

Tap*_*ose 3 java url jsf

我试图在我的托管bean的动作监听器中获取绝对URL.我用过:

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

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

有没有什么方法可以立即给我整个网址?如何获取包含所有查询字符串的整个URL?

Ale*_*oie 5

您可以使用实例手动重建URL 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();
}
Run Code Online (Sandbox Code Playgroud)