4

我有一个通过 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 的末尾会添加一个“&”。我不想再做一些字符串操作并删除尾随的“&”。你能建议一个更好的方法来做到这一点吗?

4

3 回答 3

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 攻击注入您的网站的向量。

于 2011-07-08T09:26:54.677 回答
4

看看这个问题如何从某种集合中轻松构建一个字符串:What's the most beautiful way to concatenate a list with delimiter in Java?

您的代码也有一个错误:您必须转义这些值,因为paramName请求参数和请求参数都可以包含&其他非法字符。为此使用URLEncoder.encode(value, "UTF-8")

于 2011-07-08T09:23:13.243 回答
3

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

如果不是,那么您的方法似乎很好。只要有

if (en.hasMoreElements()) sb.append("&");
于 2011-07-08T09:23:31.120 回答