Упорядочивание значений в HttpServletRequest.getParameterValues ()

HttpServletRequest.getParameterValues() возвраты a String[] содержа все значения данного параметра Запроса HTTP. Кто-либо знает, гарантируется ли порядок значений в этом массиве спецификацией тем же как порядок, который через те значения прошли в запросе?

Например, если у меня есть ПОЛУЧИТЬ строка запроса x=1&x=2&x=3, я, как гарантируют, получу String[] {"1", "2", "3"} когда я звоню getParameterValues()? Это, кажется, работает на практике, но я не могу найти ничего, что определяет, что это должно иметь место, таким образом, я отказываюсь полагаться на него.

21
задан skaffman 23 February 2010 в 10:23
поделиться

3 ответа

В javadoc для ServletRequest ( v2.5 javadoc ) ничего не упоминается о порядке значений для этого метода. Таким образом, я бы не стал рассчитывать на сохранение порядка.


Обновление: также проверил документ спецификации для версии 2.5, содержит следующую информацию, относящуюся к getParameterValues ​​(). В нем ничего не упоминается об упорядочивании по отношению к строке запроса, поэтому я думаю, что поведение, которое вы видите, - это детали реализации, а не определенные как часть интерфейса.

Параметры хранятся как набор пар имя-значение. Для любого заданного имени параметра может существовать несколько значений параметра . Следующие методы интерфейса ServletRequest доступны для доступа к параметрам:

  • getParameter
  • getParameterNames
  • getParameterValues ​​
  • getParameterMap

Метод getParameterValues возвращает массив объектов String, содержащий все значения параметров, связанные с именем параметра . Значение, возвращаемое из метода getParameter, должно быть первым значением в массиве объектов String , возвращаемых getParameterValues. Метод getParameterMap возвращает java.util.Map параметра запроса , который содержит имена как ключи и значения параметров как значения карты.

Для дальнейшего использования спецификации сервлетов Java можно загрузить с Sun, я имею в виду веб-сайт Oracle . Вы можете дважды проверить конкретную версию сервлета, которая вас интересует.

15
ответ дан 29 November 2019 в 20:55
поделиться

Использование File.ReadAllLines является простым - но не обязательно наиболее эффективным, поскольку он считывает всю строку в память.

Краткая версия, вероятно, будет:

var wordsPerLine = from line in File.ReadAllLines(filename)
               select string.Split(line, '\t');

foreach(var line in wordsPerLine)
{
    foreach(word in line)
    {
        // process word...
    }
}

Если вы хотите, чтобы один перечисляемый из слов, вы можете использовать

-121--4903707-

Я не совсем уверен, что вы спрашиваете, но похоже, что вы пытаетесь получить каждое слово из файла с разделителями табуляции как IEnumerable < строка > . Если это так, попробуйте выполнить следующие действия

var query = File.ReadAllLines(somePathVariable)
                .SelectMany(x => x.Split(new char[] { '\t' });
-121--4903706-

. Это зависит от реализации интерфейса, выполняемого с помощью (в том числе, от выполнения).

0
ответ дан 29 November 2019 в 20:55
поделиться

Это действительно не определено явно в спецификации сервлета, но по крайней мере спецификация форм HTML явно определяет его в разделе application / x-www-form-urlencoded :

2. Имена / значения элементов управления перечислены в том порядке, в котором они появляются в документе.

Итак, эта часть безопасна. Теперь контейнер сервлетов, наиболее логично приличная и эффективная реализация, будет обрабатывать входной поток HTTP немедленно по мере его поступления, поэтому параметры будут обрабатываться в том порядке, в котором они появляются в URI запроса (GET) или в теле запроса (POST).Сбор их в String [] - самый простой выбор, поскольку он также используется как есть в API сервлетов, поэтому я действительно не вижу смысла собирать его в HashSet , как структура, или выполните Collections # shuffle () или что-то еще, а затем преобразуйте его в String [] .

По крайней мере, я могу сказать по опыту, что Tomcat делает это правильно, поэтому все основные контейнеры / серверы приложений, построенные на основе Tomcat / Catalina (IBM Websphere, JBoss AS, Sun Glassfish и т. Д.), Также будут вести себя так. У меня только нет опыта работы с Weblogic, но я был бы удивлен, если бы он обрабатывал его по-другому (читай: менее эффективно).

Не гарантируется только порядок имен параметров , логически потому, что он поддерживается HashMap .


Вкратце: параметры собраны в HashMap . Имена гарантированно не упорядочиваются из-за характера HashMap . Значения (одно имя параметра может иметь несколько значений, например foo = bar1 & foo = bar2 & foo = bar3 ), в свою очередь, упорядочены из-за природы String [] , хотя это не явно указан в API сервлета.

На всякий случай можно использовать другой подход, например

foos=3&foo[0]=bar1&foo[1]=bar2&foo[2]=bar3

с

int foos = Integer.valueOf(request.getParameter("foos"));
for (int i = 0; i < foos; i++) {
    int foo = Integer.valueOf(request.getParameter("foo[" + i + "]"));
}
8
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: