2013-05-31 48 views
2

我想在我的托管bean的动作侦听器中获取绝对URL。我用过:如何在JSF中使用查询字符串获取当前绝对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吗?我如何获得所有查询字符串的整个网址?

+0

答案很简单:第 –

+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(); 
} 
+0

为什么我们需要'URLEncoder的#encode'? –

+0

@TapasBose ortherwise如果您有特殊字符,例如:包含一个'&' –

+0

+1和显然可以接受的答案,您将不会拥有有效的URL。非常感谢你。如果你可以看看,我已经发布了类似的解决方案。其实我从'URLEncoder#encode'得到了NPE,所以我已经处理了,我也考虑过'HttpServletRequest#getParameterValues()',因为可以有'param = value1&param = value2&param = value3'。 –

1

在这里,我想到了我的解决方案,同时由亚历山大给出的答案的想法,考虑到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(); 
} 
相关问题