Проверьте, находится ли int между двумя числами

Да, у меня есть doctype в web.xml

blockquote>

Удалите это из web.xml, и все должно быть хорошо. Допустимый сервлет 3.0 (Tomcat 7, JBoss AS 6/7, GlassFish 3 и т. Д.), Совместимый с web.xml, представлен ниже, без каких-либо :




    


Для сервлета 3.1 ( Tomcat 8, WildFly 8/9/10/11, GlassFish / Payara 4 и т. Д.), Он выглядит следующим образом:




    


Для сервлета 4.0 (Tomcat 9, WildFly 12, GlassFish / Payara 5 и т. Д. ), это выглядит следующим образом:




    


При использовании JSTL 1.1 или новее вам нужно убедиться, что ваш web.xml объявлен таким образом, что webapp работает, по крайней мере, с сервлета 2.4, иначе EL выражения не будут работать в webapp.

Если у вас еще есть сервлет 2.3 или старше в web.xml, даже если у вас уже есть сервлет 2.4 или более новый XSD, тогда он все равно будет вынужден для запуска в сервлетах 2.3 или более старых modus, в результате чего EL-выражения не срабатывают.

. Техническая причина: EL первоначально был частью JSTL 1.0 и недоступен в Servlet 2.3 / JSP 1.2 и старше. В JSTL 1.1 EL был удален из JSTL и интегрирован в JSP 2.0, который идет вместе с Servlet 2.4. Итак, если ваш web.xml объявлен для запуска webapp в Servlet 2.3 или более раннем модуле, JSP ожидает найти EL в библиотеке JSTL, но это, в свою очередь, потерпит неудачу, если это новая версия JSTL, лишенная EL.

См. также:

30
задан Timo Willemsen 2 January 2010 в 21:45
поделиться

7 ответов

Одна из проблем состоит в том, что тройная реляционная конструкция привнесет серьезные проблемы синтаксического анализа:

<expr> ::= <expr> <rel-op> <expr> |
           ... |
           <expr> <rel-op> <expr> <rel-op> <expr>

Когда вы попытаетесь выразить грамматику этих производств с помощью типичного PGS, вы обнаружите, что в точке первого имеется конфликт сдвига-спициала. При разборе необходимо просмотреть произвольное количество символов, чтобы увидеть, есть ли второй , прежде чем он сможет решить, была ли использована двоичная или троичная форма. В этом случае, вы не можете просто игнорировать конфликт, потому что это приведет к неправильному разбору.

Я не говорю, что эта грамматика фатально неоднозначна. Но я думаю, что вам понадобится обратный парсер, чтобы правильно с ним разобраться. И это серьезная проблема для языка программирования, где быстрая компиляция является основным плюсом.

21
ответ дан 27 November 2019 в 23:44
поделиться

Это просто синтаксис. '<' - это бинарная операция, и большинство языков не делают его переходным. Они могли бы сделать это так, как Вы говорите, но тогда кто-нибудь спросил бы, почему Вы не можете делать и другие операции в двоичной системе. "если (12 < x != 5)"?

Синтаксис - это всегда компромисс между сложностью, выразительностью и удобочитаемостью. Различные дизайнеры языка делают разные варианты. Например, в SQL есть "x BETWEEN y AND z", где x, y и z могут быть по отдельности или все быть столбцами, константами или связанными переменными. И я с удовольствием использую его в SQL, а также не переживаю, почему его нет в Java.

.
10
ответ дан 27 November 2019 в 23:44
поделиться

Потому что этот синтаксис просто не определен? Кроме того, x < y оценивается как bool, так что же значит bool < int? На самом деле это не накладные расходы; кроме того, вы могли бы написать утилитный метод, если бы вы действительно хотели - isBetween(10,x,20) - Я бы не стал сам, но эй...

.
9
ответ дан 27 November 2019 в 23:44
поделиться

Неудобства набора текста 10 < x && x < 20 минимальны по сравнению с увеличением сложности языка, если допустить 10 < x < 20, поэтому разработчики языка Java решили не поддерживать его.

.
7
ответ дан 27 November 2019 в 23:44
поделиться

COBOL позволяет это (уверен, что и некоторые другие языки тоже). Java унаследовала большую часть синтаксиса от C, который не позволяет этого.

6
ответ дан 27 November 2019 в 23:44
поделиться

Вы человек, и поэтому вы понимаете, что означает термин "10 < x < 20". У компьютера нет такой интуиции, поэтому он читает как: "(10 < x) < 20".

Например, если x = 15, он вычислит:

(10 < x) => TRUE

"TRUE < 20" => ???

При программировании на Си будет хуже, так как нет значений True\False. Если x = 5, то вычисление будет:

10 < x => 0 (значение False)

0 < 20 => не 0 число (True)

и поэтому "10 < 5 < 20" вернёт True! :S

.
4
ответ дан 27 November 2019 в 23:44
поделиться

Поскольку оператор < (и большинство других) являются двоичными операторами (они берут два аргумента), а (true true) не является действительным булевым выражением.

Разработчики языка Java могли бы спроектировать язык так, чтобы он позволял синтаксис, подобный тому типу, который Вы предпочитаете, но (я предполагаю) они решили, что он не стоит более сложных правил разбора.

.
0
ответ дан 27 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

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