如何使用java从查询字符串中读取参数和值?

时间:2010-02-16 09:38:40

标签: java url servlets character-encoding

我从谷歌代码使用Ciui,所有请求只是GET请求而不是POST。这些电话是由ajax发出的(我不确定)。我需要知道如何从这个URL读取“searchstring”参数。当我使用getQueryString()方法在我的Servlet中读取它时,我无法正确地形成实际文本。这个unicode(当%替换为/时)就像文本一样实际上是中文的。请让我如何解码搜索字符串并创建字符串。

http://xxxx.com?searchString=%u8BF7%u5728%u6B64%u5904%u8F93%u5165%u4EA7%u54C1%u7F16%u53F7%u6216%u540D%u79F0&button=%E6%90%9C%E7%B4%A2

另一个参数是适当的百分比编码,我可以使用URL解码进行解码。提前谢谢。

4 个答案:

答案 0 :(得分:6)

好吧,在我的情况下,我有来自其他来源的查询字符串,所以你可能需要这个:

    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 [] p=param.split("=");
        String name = p[0];  
      if(p.length>1)  {String value = p[1];  
        map.put(name, value);
      }  
    }  
    return map;  
} 

那么你可以使用:

 Map params=getQueryMap(querystring);
 String id=(String)params.get("id");
 String anotherparam=(String)params.get("anotherparam");

答案 1 :(得分:2)

这些中文字符的编码方案实际上违反了Web标准(即RFC 3986):百分号是保留字符,除标准百分比编码外,不能使用。

我强烈建议您使用标准编码方案(UTF-8字节和百分比编码);那么你可以简单地使用标准的getParameter()方法。如果您坚持违反标准,则很可能无法在符合标准的servlet容器中解决您的问题。

答案 2 :(得分:2)

使用Java 8的解决方案。

这段代码转换了键/值列表中的查询字符串:

List<AbstractMap.SimpleEntry<String, String>> list = 
        asList(queryString.split("&")).stream()
        .map(s -> copyOf(s.split("="), 2))
        .map(o -> new AbstractMap.SimpleEntry<String, String>(o[0], o[1]) )
        .collect(toList());

@Tuno的评论激励我写一个新的答案,这个替代(和更短)的解决方案使用groupingBy方法:

Map<String, List<String>> llist = 
       asList(queryString.split("&")).stream()
       .map(s -> copyOf(s.split("="), 2))
       .collect(groupingBy(s -> s[0], mapping(s -> s[1], toList())));

我建议使用URLDecoder.decode(String s, String enc)

解码值

两个解决方案都使用以下行打印集合内容:

list.stream().forEach(s -> System.out.println(s.getKey() + " = " + s.getValue()));

答案 3 :(得分:1)

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    String searchString = request.getParameter("searchString");
    // process searchString
}

自动完成对参数的解码。