使用Java中的请求参数构造URL

App*_*pps 4 java java-ee http-request-parameters

我有一个通过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();
Run Code Online (Sandbox Code Playgroud)

但问题是,有一个"&"将被添加到构造的URL的末尾.我不想再做一些字符串操作并删除尾随的"&".你能建议一个更好的方法吗?

Ste*_*n C 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());
Run Code Online (Sandbox Code Playgroud)

选项#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());
Run Code Online (Sandbox Code Playgroud)

选项#3 - 如果有更多元素,则添加分隔符...

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

选项#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());
Run Code Online (Sandbox Code Playgroud)

哪个最好取决于您正在做什么的具体细节,以及性能的重要性.


我最后应该注意到,在组装常规URL和查询字符串时需要更加小心.例如,您需要在参数名称和值中正确转义任何非"无保留"(根据URL规范)的字符.如果您不小心,您最终可能会在您的网站上注入XSS攻击.