2011-07-08 96 views
4

我有一个通过URL访问的servlet,并且该URL中包含一些请求参数。现在我需要将用户重定向到不同的页面(来自servlet),但是还附加了从请求中获得的请求参数。 这是我在做什么在Java中构建一个包含请求参数的URL

StringBuffer sb=new StringBuffer("/test.jsp"); 
    sb.append("?"); 
    Enumeration en = request.getParameterNames(); 
    while(en.hasMoreElements()){ 
     String paramName = (String) en.nextElement(); 
     sb.append(paramName); 
     sb.append("="); 
     sb.append(request.getParameter(paramName)); 
     sb.append("&"); 
    } 
      String constructedURLWithParams=sb.toString(); 

但问题是,有一个“&”,这将朝着构建URL的末尾添加。我不想再次执行一些字符串操作,并删除尾随的“&”。你能否建议一个更好的方法来做到这一点?

回答

3

只需追加"?" + request.getQueryString()(如果该参数在URL中传递 - 查询字符串包含所有的GET参数)

如果不是,那么你的做法似乎罚款。刚刚有

if (en.hasMoreElements()) sb.append("&"); 
6

这是一种常见的情况。我打算把它简化一点说明了一些解决方案:


选项#1 - 通过改变StringBuffer的长度删除最后一个字符:

StringBuffer sb = new StringBuffer(); 
Enumeration en = ... 
while (en.hasMoreElements()) 
    sb.append(en.nextElement()); 
    sb.append(","); 
} 
if (sb.length() > 0) { 
    sb.setLength(sb.length() - 1); 
} 
System.err.println(sb.toString()); 

选项#2 - 增加如果缓冲器是一个非空

StringBuffer sb = new StringBuffer(); 
Enumeration en = ... 
while (en.hasMoreElements()) 
    if (sb.length() > 0) { 
     sb.append(","); 
    } 
    sb.append(en.nextElement()); 
} 
System.err.println(sb.toString()); 

隔板0

选项#3 - 添加隔板,如果有更多的元素...

StringBuffer sb = new StringBuffer(); 
Enumeration en = ... 
while (en.hasMoreElements()) 
    sb.append(en.nextElement()); 
    if (en.hasMoreElements()) { 
     sb.append(","); 
    } 
} 
System.err.println(sb.toString()); 

选项#4 - 添加隔板,如果这不是第一次轮环...

StringBuffer sb = new StringBuffer(); 
Enumeration en = ... 
boolean first = true; 
while (en.hasMoreElements()) 
    if (first) { 
     first = false; 
    } else { 
     sb.append(","); 
    } 
    sb.append(en.nextElement()); 
} 
System.err.println(sb.toString()); 

哪一个最好取决于你正在做什么的确切细节以及性能如何重要。


我应该终于注意到,在组装一般URL和查询字符串时需要小心一些。例如,您需要正确地转义参数名称和值中不是“未保留”的任何字符(根据URL规范)。如果你不小心,最终可能会有一个向你的网站注入XSS攻击的媒介。

+0

这是如何,我通常修复这些有点问题 – chedine