有没有人知道或者我知道可以用来操作查询字符串的java类?
基本上我想要一个类,我可以简单地给一个查询字符串,然后删除,添加和修改查询字符串KVP.
提前致谢.
编辑
在回答对此问题的评论时,查询字符串将看起来像这样;
N=123+456+112&Ntt=koala&D=abc
Run Code Online (Sandbox Code Playgroud)
所以我想把这个类传递给查询字符串并说出类似的内容.
String[] N = queryStringClass.getParameter("N");
Run Code Online (Sandbox Code Playgroud)
然后也许吧
queryStringClass.setParameter("N", N);
Run Code Online (Sandbox Code Playgroud)
有可能 queryStringClass.removeParameter("N");
或者那种效果.
Mau*_*ara 16
这样的事情
public static Map<String, String> getQueryMap(String query)
{
String[] params = query.split("&");
Map<String, String> map = new HashMap<String, String>();
for (String param : params)
{
String name = param.split("=")[0];
String value = param.split("=")[1];
map.put(name, value);
}
return map;
}
Run Code Online (Sandbox Code Playgroud)
要简单地迭代地图:
String query = url.getQuery();
Map<String, String> map = getQueryMap(query);
Set<String> keys = map.keySet();
for (String key : keys)
{
System.out.println("Name=" + key);
System.out.println("Value=" + map.get(key));
}
Run Code Online (Sandbox Code Playgroud)
lau*_*man 12
您也可以使用Google Guava的Splitter.
String queryString = "variableA=89&variableB=100";
Map<String,String> queryParameters = Splitter
.on("&")
.withKeyValueSeparator("=")
.split(queryString);
System.out.println(queryParameters.get("variableA"));
Run Code Online (Sandbox Code Playgroud)
打印出来
89
Run Code Online (Sandbox Code Playgroud)
我认为这是一个非常易读的替代解决方案.
编辑:正如@raulk所指出的,此解决方案不考虑转义字符.但是,这可能不是问题,因为在URL-Decode之前,查询字符串保证不会有任何与'='和'&'冲突的转义字符.您可以通过以下方式将此用于您的优势.
假设您必须解码以下查询字符串:
a=%26%23%25!)%23(%40!&b=%23%24(%40)%24%40%40))%24%23%5E*%26
Run Code Online (Sandbox Code Playgroud)
这是URL编码,然后保证'&'和'='分别专门用于分离对和键的值,此时您可以使用Guava分割器来获取:
a = %26%23%25!)%23(%40!
b = %23%24(%40)%24%40%40))%24%23%5E*%26
Run Code Online (Sandbox Code Playgroud)
获得键值对后,您可以单独对它们进行URL解码.
a = &#%!)#(@!
b = #$(@)$@@))$#^*&
Run Code Online (Sandbox Code Playgroud)
这应该涵盖所有情况.
如果您使用的是J2EE,则可以使用ServletRequest.getParameterValues().
否则,我认为Java没有任何用于查询字符串处理的公共类.编写自己的应该不会太难,尽管存在某些棘手的边缘情况,例如在技术上认识到相同的密钥在查询字符串中可能出现多次.
一种实现可能如下所示:
import java.util.*;
import java.net.URLEncoder;
import java.net.URLDecoder;
public class QueryParams {
private static class KVP {
final String key;
final String value;
KVP (String key, String value) {
this.key = key;
this.value = value;
}
}
List<KVP> query = new ArrayList<KVP>();
public QueryParams(String queryString) {
parse(queryString);
}
public QueryParams() {
}
public void addParam(String key, String value) {
if (key == null || value == null)
throw new NullPointerException("null parameter key or value");
query.add(new KVP(key, value));
}
private void parse(String queryString) {
for (String pair : queryString.split("&")) {
int eq = pair.indexOf("=");
if (eq < 0) {
// key with no value
addParam(URLDecoder.decode(pair), "");
} else {
// key=value
String key = URLDecoder.decode(pair.substring(0, eq));
String value = URLDecoder.decode(pair.substring(eq + 1));
query.add(new KVP(key, value));
}
}
}
public String toQueryString() {
StringBuilder sb = new StringBuilder();
for (KVP kvp : query) {
if (sb.length() > 0) {
sb.append('&');
}
sb.append(URLEncoder.encode(kvp.key));
if (!kvp.value.equals("")) {
sb.append('=');
sb.append(URLEncoder.encode(kvp.value));
}
}
return sb.toString();
}
public String getParameter(String key) {
for (KVP kvp : query) {
if (kvp.key.equals(key)) {
return kvp.value;
}
}
return null;
}
public List<String> getParameterValues(String key) {
List<String> list = new LinkedList<String>();
for (KVP kvp : query) {
if (kvp.key.equals(key)) {
list.add(kvp.value);
}
}
return list;
}
public static void main(String[] args) {
QueryParams qp = new QueryParams("k1=v1&k2&k3=v3&k1=v4&k1&k5=hello+%22world");
System.out.println("getParameter:");
String[] keys = new String[] { "k1", "k2", "k3", "k5" };
for (String key : keys) {
System.out.println(key + ": " + qp.getParameter(key));
}
System.out.println("getParameters(k1): " + qp.getParameterValues("k1"));
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53672 次 |
最近记录: |