我有一个通过URL访问的servlet,该URL中有一些请求参数。现在我需要将用户重定向到另一个页面(来自servlet),还要附加我从请求中获取的请求参数。 这就是我正在做的事情
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的末尾。我不想再做一些字符串操作并删除尾随的“&”。你能建议一个更好的方法吗?
答案 0 :(得分: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());
选项#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攻击的载体。
答案 1 :(得分:4)
请参阅此问题,了解如何从某种集合中轻松构建String:What's the most elegant way to concatenate a list of values with delimiter in Java?
此外,您的代码有一个错误:您必须转义值,因为paramName
和请求参数都可以包含&
和其他非法字符。请使用URLEncoder.encode(value, "UTF-8")
。
答案 2 :(得分:3)
只需附加"?" + request.getQueryString()
(如果参数在URL中传递 - 查询字符串包含所有get参数)
如果他们不是,那么你的方法似乎很好。只是
if (en.hasMoreElements()) sb.append("&");