Java EE有ServletRequest.getParameterValues()。

在非ee平台上,URL.getQuery()只是返回一个字符串。

当不在Java EE上时,正确解析URL中的查询字符串的正常方法是什么?


在回答中,尝试创建自己的解析器是很受欢迎的。这是一个非常有趣和令人兴奋的微编码项目,但我不能说这是一个好主意。

下面的代码段通常是有缺陷或损坏的。对读者来说,打破它们是一项有趣的练习。还有攻击使用它们的网站的黑客。

解析查询字符串是一个明确定义的问题,但阅读规范并理解其中的细微差别并非易事。最好是让一些平台库编码器为您做艰苦的工作,并进行修复!


当前回答

你说“Java”,但“不是Java EE”。您的意思是您正在使用JSP和/或servlet,而不是完整的Java EE堆栈?如果是这种情况,那么您应该仍然可以使用request.getParameter()。

如果你的意思是你正在编写Java,但你没有编写jsp或servlet,或者你只是使用Java作为参考点,但你在一些没有内置参数解析的其他平台上……哇,这听起来像是一个不太可能的问题,但如果是这样的话,原则是:

xparm=0
word=""
loop
  get next char
  if no char
    exit loop
  if char=='='
    param_name[xparm]=word
    word=""
  else if char=='&'
    param_value[xparm]=word
    word=""
    xparm=xparm+1
  else if char=='%'
    read next two chars
    word=word+interpret the chars as hex digits to make a byte
  else
    word=word+char

(我可以编写Java代码,但这将是毫无意义的,因为如果您有Java可用,您可以只使用request.getParameters。)

其他回答

对于servlet或JSP页面,您可以使用request.getParameter("paramname")获取查询字符串的键/值对。

String name = request.getParameter("name");

还有其他方法,但我在创建的所有servlet和jsp页面中都是这样做的。

该方法获取uri并返回票面名称和票面值的映射

  public static Map<String, String> getQueryMap(String uri) {

    String queryParms[] = uri.split("\\?");

    Map<String, String> map = new HashMap<>();// 

    if (queryParms == null || queryParms.length == 0) return map;

    String[] params = queryParms[1].split("&");
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

你说“Java”,但“不是Java EE”。您的意思是您正在使用JSP和/或servlet,而不是完整的Java EE堆栈?如果是这种情况,那么您应该仍然可以使用request.getParameter()。

如果你的意思是你正在编写Java,但你没有编写jsp或servlet,或者你只是使用Java作为参考点,但你在一些没有内置参数解析的其他平台上……哇,这听起来像是一个不太可能的问题,但如果是这样的话,原则是:

xparm=0
word=""
loop
  get next char
  if no char
    exit loop
  if char=='='
    param_name[xparm]=word
    word=""
  else if char=='&'
    param_value[xparm]=word
    word=""
    xparm=xparm+1
  else if char=='%'
    read next two chars
    word=word+interpret the chars as hex digits to make a byte
  else
    word=word+char

(我可以编写Java代码,但这将是毫无意义的,因为如果您有Java可用,您可以只使用request.getParameters。)

在Android上,你可以使用Uri。uri类的解析静态方法来完成繁重的工作。如果你在做任何与uri和intent相关的事情,无论如何你都会想要使用它。

如果你正在使用Spring 3.1或更高版本(哎呀,希望它的支持能更早一点),你可以使用UriComponents和UriComponentsBuilder:

UriComponents components = UriComponentsBuilder.fromUri(uri).build();
List<String> myParam = components.getQueryParams().get("myParam");

getqueryparams()返回MultiValueMap<String, String>

这里有更多的文档。