HttpServletRequest.getParameterValues()
возвраты a String[]
содержа все значения данного параметра Запроса HTTP. Кто-либо знает, гарантируется ли порядок значений в этом массиве спецификацией тем же как порядок, который через те значения прошли в запросе?
Например, если у меня есть ПОЛУЧИТЬ строка запроса x=1&x=2&x=3
, я, как гарантируют, получу String[] {"1", "2", "3"}
когда я звоню getParameterValues()
? Это, кажется, работает на практике, но я не могу найти ничего, что определяет, что это должно иметь место, таким образом, я отказываюсь полагаться на него.
В javadoc для ServletRequest ( v2.5 javadoc ) ничего не упоминается о порядке значений для этого метода. Таким образом, я бы не стал рассчитывать на сохранение порядка.
Обновление: также проверил документ спецификации для версии 2.5, содержит следующую информацию, относящуюся к getParameterValues (). В нем ничего не упоминается об упорядочивании по отношению к строке запроса, поэтому я думаю, что поведение, которое вы видите, - это детали реализации, а не определенные как часть интерфейса.
Параметры хранятся как набор пар имя-значение. Для любого заданного имени параметра может существовать несколько значений параметра . Следующие методы интерфейса ServletRequest доступны для доступа к параметрам:
Метод getParameterValues возвращает массив объектов String, содержащий все значения параметров, связанные с именем параметра . Значение, возвращаемое из метода getParameter, должно быть первым значением в массиве объектов String , возвращаемых getParameterValues. Метод getParameterMap возвращает java.util.Map параметра запроса , который содержит имена как ключи и значения параметров как значения карты.
Для дальнейшего использования спецификации сервлетов Java можно загрузить с Sun, я имею в виду веб-сайт Oracle . Вы можете дважды проверить конкретную версию сервлета, которая вас интересует.
Использование 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- . Это зависит от реализации интерфейса, выполняемого с помощью (в том числе, от выполнения).
Это действительно не определено явно в спецификации сервлета, но по крайней мере спецификация форм 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 + "]"));
}