Do you know any JDK service in Java 1.5 that knows to take care of URL appending? (taking care of putting "?" or "&" depends on the fact that the query param is the first one or not).
Thanks, Shay
This simple class for building URL saves me a lot of time:
public class LinkBuilder {
protected String scheme;
protected String host;
protected int port;
protected Map<String, String> args = new HashMap<String, String>();
protected String path;
protected String hash;
public LinkBuilder() {
this(null, null, 0, new HashMap<String, String>(), null, null);
}
protected LinkBuilder(LinkBuilder other) {
this.scheme = other.scheme;
this.host = other.host;
this.port = other.port;
this.args = new HashMap<String, String>();
if (other.args != null) {
this.args.putAll(other.args);
}
this.path = other.path;
this.hash = other.hash;
}
protected LinkBuilder(String schema, String host, int port, Map<String, String> args, String path, String hash) {
this.scheme = schema;
this.host = host;
this.port = port;
this.args = new HashMap<String, String>();
if (args != null) {
this.args.putAll(args);
}
this.path = path;
this.hash = hash;
}
public LinkBuilder(URI url) {
String query = url.getRawQuery();
if (query != null) {
for (String argLine : query.split("&")) {
if (argLine.length() > 0) {
int i = argLine.indexOf('=');
if (i != -1) {
args.put(argLine.substring(0, i), argLine.substring(i + 1));
}
else {
args.put(argLine, null);
}
}
}
}
this.scheme = url.getScheme();
this.host = url.getHost();
this.port = url.getPort();
this.path = url.getRawPath();
this.hash = url.getRawFragment();
}
public LinkBuilder url(URI url) {
return new LinkBuilder(url);
}
public LinkBuilder scheme(String schema) {
return new LinkBuilder(schema, host, port, args, path, hash);
}
public LinkBuilder host(String host) {
if (host.indexOf('/') != -1) {
throw new IllegalArgumentException("Wrong host name: " + host);
}
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder port(int port) {
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder hash(String hash) {
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder path(String path) {
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder arg(String name) {
return arg(name, null);
}
public LinkBuilder arg(String name, Object value) {
Map<String, String> newArgs = new HashMap<String, String>(args);
newArgs.put(name, value == null ? null : value.toString());
return new LinkBuilder(scheme, host, port, newArgs, path, hash);
}
public String build() {
StringBuilder buf = new StringBuilder();
if (scheme != null) {
buf.append(scheme);
}
buf.append("://");
if (host != null) {
buf.append(host);
}
if (port > 0 && !"https".equals(scheme)) {
buf.append(':').append(port);
}
if (path != null) {
if (path.charAt(0) != '/') {
buf.append('/');
}
buf.append(path);
}
else if (args.size() > 0 || hash != null) {
buf.append('/');
}
if (args.size() > 0) {
buf.append('?');
boolean first = true;
for (Entry<String, String> arg : args.entrySet()) {
if (!first) {
buf.append('&');
}
else {
first = false;
}
buf.append(URLEncoder.encode(arg.getKey(), "UTF-8"));
if (arg.getValue() != null && arg.getValue().length() > 0) {
buf.append("=").append(URLEncoder.encode(arg.getValue(), "UTF-8"));
}
}
}
if (hash != null) {
buf.append('#').append(hash);
}
return buf.toString();
}
public String toString() {
return build();
}
}
Usage is very simple:
new LinkBuilder()
.scheme("http")
.host("stackoverflow.com")
.path("/questions/3253058/how-to-append-url-in-java/3253350")
.hash("3253350")
.build(); // Generates link to this post
new LinkBuilder(new URI("http://www.google.com/search"))
.arg("q", "Bugs Bunny")
.arg("ie", "UTF-8")
.build(); // Results in http://www.google.com/search?q=Bugs+Bunny&ie=UTF-8
Hope this helps.
A rather straightforward example (and very similar to Noel M's example who posted his while I was writing this) would be:
StringBuilder sb = new StringBuilder(url);
url.indexOf("?") > -1 ? sb.append("&") : sb.append("?");
// loop over your paramaters and append them like in Noel M's example
url = sb.toString();
public String buildUrl(String url, List<String> params) {
StringBuilder builder = new StringBuilder(url);
if(params != null && params.size() > 0) {
builder.append("?");
for(Iterator<String> i = params.iterator(); i.hasNext();) {
String s = i.next();
builder.append(s);
if(i.hasNext()) {
builder.append("&");
}
}
}
return builder.toString();
}
精彩评论