0

在我的应用程序中,我必须提取请求的参数并按照它们在查询字符串中出现的顺序放入集合中。

例如,如果发件人提出以下请求,

http://myapp.com/myrequest?param3=value3¶m2=value2¶m1=value1 ,

我需要生成一个集合,其中的元素按以下顺序放置:param3、param2、param1。

为此,我首先使用getParameterNames如下所示的方法提取参数的名称。

private List<String> getParameterNames(HttpServletRequest aRequest) 
  throws IOException {
    final List<String> parameterNames = new LinkedList<>();
    final BufferedReader reader = aRequest.getReader();
    final String queryString = IOUtils.toString(reader);

    final String[] parameterValuePairs = queryString.split("&");

    for (String parameterValuePair : parameterValuePairs) {
        final String[] nameValueArray = parameterValuePair.split("=");

        parameterNames.add(nameValueArray[0]);
    }
    return parameterNames;
}

问题:调用此方法后,永远aRequest.getParameterValue(...)返回null参数名称。

如果我不这样做 - 首先保存参数映射,然后调用getParameterNames,那么它的结果为空。

final Map<String,String[]> parameterMap = aRequest.getParameterMap();
final List<String> parameterNames = getParameterNames(aRequest);

我尝试了以下事情:

  1. 确保它reader.close()没有被调用getParameterNames(我在其他地方读到这可能会导致问题)。
  2. 调用reader.reset().

这些都没有帮助。

如何从 a 中获取参数值对列表,该列表HttpServletRequest按参数在查询字符串中的外观排序?

4

1 回答 1

0

使用第一种方法,您不需要使用Reader来获取参数。而是这样做:

final List<String> parameterNames = new LinkedList<>();
final String queryString = query.getQueryString(); // get query string from query itself
// rest of your code stays unchanged

它不起作用的原因是来自请求输入流的数据只能读取一次。

或者,如果我错了,但事实并非如此,您可以将参数及其值保存到LinkedHashMap中:

final LinkedHashMap<String, String> parameterValues = new LinkedHashMap<>();
final BufferedReader reader = aRequest.getReader();
final String queryString = IOUtils.toString(reader);

final String[] parameterValuePairs = queryString.split("&");

for (String parameterValuePair : parameterValuePairs) {
    final String[] nameValueArray = parameterValuePair.split("=");
    parameterValues.put(nameValueArray[0], nameValueArray[1]);
}

现在parameterValues是一个按出现顺序排序的条目的地图。

于 2013-10-01T14:29:28.520 回答