在我使用的大部分代码中都有可怕的东西,如:
String url = "../Somewhere/SomeServlet?method=AMethod&id="+object.getSomething()+ "&aParam="+object.getSomethingElse());
或 - 更糟糕的是:
String url = "Somewhere/Here/Something.jsp?path="+aFile.toString().replace("\\","/")+ "&aParam="+object.getSomethingElse());
是否有正确的方法:
基本上 - 构建字符串要比正确执行它太容易了。有没有办法正确这就像构建字符串一样简单?
加
为了清楚起见 - 经过一番思考 - 我想我正在寻找类似的东西:
String s = new MyThing()
.setPlace("Somewhere/Something.jsp")
.addParameter(aName,aValue)
.addParameter(aName,aFile)
.toString();
这样它就可以处理所有逃避和添加“?”/“&”的不愉快并将“\”更改为“/”,而不是将“\”更改为文件等。
如果我必须自己编写一个(即如果Apache不是一个选项),那么有真正的Java技术可以正确地转义各个部分。我的意思是在参数中将“”转换为“”。而逃避“”在其他地方“%20”。
答案 0 :(得分:18)
您可以使用Apache URIBuilder
示例代码:Full Apache Example
URIBuilder builder = new URIBuilder()
.setScheme("http")
.setHost("apache.org")
.setPath("/shindig")
.addParameter("hello world", "foo&bar")
.setFragment("foo");
builder.toString();
答案 1 :(得分:9)
您还可以使用spring UriComponentsBuilder
UriComponentsBuilder
.fromUriString(baseUrl)
.queryParam("name", name)
.queryParam("surname", surname)
.build().toUriString();
答案 2 :(得分:7)
我已经写完了,您可以在需要额外功能的地方进行更改。它不使用任何外部资源,如果我查看了某些内容,请告诉我!
它基本上是URI
类的包装器,允许您更轻松地向URI添加子目录和参数。如果您对某些内容不感兴趣,可以设置默认值。
编辑:我添加了一个使用相对URI的选项(根据您的问题)。
public class Test {
public static void main(String[] args) throws URISyntaxException,
MalformedURLException {
URLBuilder urlb = new URLBuilder("www.example.com");
urlb.setConnectionType("http");
urlb.addSubfolder("somesub");
urlb.addSubfolder("anothersub");
urlb.addParameter("param lol", "unknown");
urlb.addParameter("paramY", "known");
String url = urlb.getURL();
System.out.println(url);
urlb = new URLBuilder();
urlb.addSubfolder("servlet");
urlb.addSubfolder("jsp");
urlb.addSubfolder("somesub");
urlb.addSubfolder("anothersub");
urlb.addParameter("param lol", "unknown");
urlb.addParameter("paramY", "known");
String relUrl = urlb.getRelativeURL();
System.out.println(relUrl);
}
}
class URLBuilder {
private StringBuilder folders, params;
private String connType, host;
void setConnectionType(String conn) {
connType = conn;
}
URLBuilder(){
folders = new StringBuilder();
params = new StringBuilder();
}
URLBuilder(String host) {
this();
this.host = host;
}
void addSubfolder(String folder) {
folders.append("/");
folders.append(folder);
}
void addParameter(String parameter, String value) {
if(params.toString().length() > 0){params.append("&");}
params.append(parameter);
params.append("=");
params.append(value);
}
String getURL() throws URISyntaxException, MalformedURLException {
URI uri = new URI(connType, host, folders.toString(),
params.toString(), null);
return uri.toURL().toString();
}
String getRelativeURL() throws URISyntaxException, MalformedURLException{
URI uri = new URI(null, null, folders.toString(), params.toString(), null);
return uri.toString();
}
}
输出:
绝对
http://www.example.com/somesub/anothersub?param%20lol=unknown¶mY=known
相对
/ servlet的/ JSP / somesub / anothersub PARAM%20lol =未知&安培; paramY =已知的
答案 3 :(得分:1)
我喜欢@Jeroen的建议,但它并不是我想要的所有,使用他的想法收集部分然后使用URI
来增长最终结果我把这个解决方案放在一起似乎做我想做的事:
public class URLBuilder {
// The scheme - http
private String scheme = null;
// The user - user
private String user = null;
// The host - example.com
private String host = null;
// The port - 8080
private int port = -1;
// The paths - /Path/To/Somewhere/index.jsp
private final ArrayList<String> paths = new ArrayList<String>();
// The parameters - ?a=b&c=d
private final ArrayList<Pair<String, String>> queries = new ArrayList<Pair<String, String>>();
// The fragment - #n
private String fragment = null;
public URLBuilder addQuery(String name, String value) {
queries.add(new Pair(name, value));
return this;
}
public URLBuilder addQuery(String name, long value) {
addQuery(name, String.valueOf(value));
return this;
}
public URLBuilder addQuery(String name, File file) {
addQuery(name, file.toURI().getPath());
return this;
}
public URLBuilder addPath(String path) {
paths.add(path);
return this;
}
@Override
public String toString() {
// Build the path.
StringBuilder path = new StringBuilder();
for (String p : paths) {
path.append("/").append(p);
}
// Build the query.
StringBuilder query = new StringBuilder();
String sep = "";
for (Pair<String, String> p : queries) {
query.append(sep).append(p.p).append("=").append(p.q);
sep = "&";
}
String url = null;
try {
URI uri = new URI(
scheme,
user,
host,
port,
path.length() > 0 ? path.toString() : null,
query.length() > 0 ? query.toString() : null,
fragment);
url = uri.toString();
} catch (URISyntaxException ex) {
Logger.getLogger(URLBuilder.class.getName()).log(Level.SEVERE, null, ex);
}
return url;
}
/**
* @param host the host to set
* @return this
*/
public URLBuilder setHost(String host) {
this.host = host;
return this;
}
/**
* @param scheme the scheme to set
* @return this
*/
public URLBuilder setScheme(String scheme) {
this.scheme = scheme;
return this;
}
/**
* @param user the user to set
* @return this
*/
public URLBuilder setUser(String user) {
this.user = user;
return this;
}
/**
* @param port the port to set
* @return this
*/
public URLBuilder setPort(int port) {
this.port = port;
return this;
}
/**
* @param fragment the fragment to set
* @return this
*/
public URLBuilder setFragment(String fragment) {
this.fragment = fragment;
return this;
}
public static void main(String args[]) {
try {
URLBuilder url = new URLBuilder();
System.out.println(url.toString());
url.setFragment("fragment");
System.out.println(url.toString());
url.setHost("host.com");
System.out.println(url.toString());
url.addPath("APath");
System.out.println(url.toString());
url.addPath("AnotherPath");
System.out.println(url.toString());
url.addQuery("query1", "param1");
System.out.println(url.toString());
url.addQuery("query 2", "param 2");
System.out.println(url.toString());
url.addQuery("file", new File("Hello World.txt"));
System.out.println(url.toString());
} catch (Throwable t) {
t.printStackTrace(System.err);
}
}
}
答案 4 :(得分:-3)
Recomendations
private final String BASE_URL = Properties.getProperty("base-url");
private Map propertiesMap; // = new HashMap<String,String>();
并在用于构建URL的代码中。
public String buildURL(){
StringBuilder builder = new StringBuilder();
builder.append(BASE_URL);
//for each property, append it
return builder.toString();
}