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

Java 如何在JSF中使用查询字符串获取当前绝对URL?,java,jsf,url,Java,Jsf,Url,我试图在我的托管bean的操作侦听器中获取绝对URL。我使用了: HttpServletRequest#getRequestURL() // returning http://localhost:7101/POSM/pages/catalog-edit HttpServetRequest#getQueryString() // returning _adf.ctrl-state=gfjk46nd7_9 但实际的URL是:http://localhost:7101/POSM/pages/cata

我试图在我的托管bean的操作侦听器中获取绝对URL。我使用了:

HttpServletRequest#getRequestURL() // returning http://localhost:7101/POSM/pages/catalog-edit
HttpServetRequest#getQueryString() // returning _adf.ctrl-state=gfjk46nd7_9
但实际的URL是:
http://localhost:7101/POSM/pages/catalog-编辑?\u adf.ctrl state=gfjk46nd7\u 9&articleference=HEN00067&\u afrLoop=343543687406787
。我不知道为什么参数
artcileReference
会被忽略


有没有什么方法可以一次给我整个URL?如何使用所有查询字符串获取整个URL?

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

下面是一个示例代码,我在过去使用过它:

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();
}
私有字符串getURL()
{
枚举参数;
弦式sParameter;
StringBuilder sbURL=新的StringBuilder();
对象oRequest=FacesContext.getCurrentInstance().getExternalContext().getRequest();
尝试
{
if(或HttpServletRequest的请求实例)
{
追加(((HttpServletRequest)或请求).getRequestURL().toString());
lParameters=((HttpServletRequest)oRequest.getParameterNames();
if(lpParameters.hasMoreElements())
{
如果(!sbURL.toString()包含(“?”)
{
sbURL.append(“?”);
}
其他的
{
sbURL.append(“&”);
}
}
while(lParameters.hasMoreElements())
{
sParameter=lParameters.nextElement();
sbURL.append(sParameter);
sbURL.append(“=”);
追加(urlcoder.encode(((HttpServletRequest)oRequest).getParameter(sParameter),“UTF-8”);
if(lpParameters.hasMoreElements())
{
sbURL.append(“&”);
}
}
}
}
捕获(例外e)
{
//无所事事
}
返回sbURL.toString();
}

考虑到
HttpServletRequest#getParameterValues()
方法:

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();
}
受保护字符串getCurrentURL()引发不支持的编码异常{
枚举参数=getServletRequest().getParameterNames();
StringBuffer urlBuffer=新的StringBuffer();
追加(getServletRequest().getRequestURL().toString());
if(parameters.hasMoreElements()){
如果(!urlBuffer.toString()包含(“?”){
urlBuffer.append(“?”);
}否则{
urlBuffer.append(“&”);
}
}
while(parameters.hasMoreElements()){
字符串参数=(字符串)参数。nextElement();
字符串[]parameterValues=getServletRequest()。getParameterValues(参数);
如果(!CollectionUtils.sizeIsEmpty(参数值)){
对于(int i=0;i
复杂的答案,一些猴子编码:)@TapasBose或者如果你有特殊字符,你将没有一个有效的URL例如:参数包括一个
&
+1和明显可接受的答案。非常感谢你。我已经发布了类似的解决方案,如果你可以看看的话。实际上,我是从
URLEncoder#encode
获取NPE的,所以我已经处理了这个问题,我还考虑了
HttpServletRequest#getParameterValues()
,因为可以有
param=value1¶m=value2¶m=value3