Почему я не могу использовать оператор if-else внутри выражения скриптлета, тогда как тернарный оператор работает нормально

Мы знаем, что переменная скрипта state имеет значение true.

Почему это выражение скриптлета неверно? Каким будет код в методе _jspService после перевода?

<%=
if(state) {
  "yes";
} else {
  "no";
}
%>

И это правильно

<%= state ? "yes" : "no" %>

потому что возвращает значение, и оно появится в _jspService как

public void _jspService(...){
   out.println("yes");
}

person Joe    schedule 09.10.2013    source источник
comment
Первый ничего не транслирует в методе _jspService, потому что это недопустимый синтаксис. Он не компилируется.   -  person Ian McLaird    schedule 09.10.2013


Ответы (2)


Версия if / else синтаксически отличается от тернарного оператора. Ничего не "возвращает".

Чтобы сделать что-то подобное, вам нужно сделать это

<%
    if (state) {
        out.print("yes");
    } else {
        out.print("no");
    }
%>

Если операторам нужно что-то делать. Они не могут просто использовать строку в качестве единственного оператора. Тернарный оператор выбирает и возвращает выбранное значение.

Блоки скриптлета с синтаксисом <%= %> должны быть одним выражением, которое создает значение для вывода. В основном они должны что-то оценивать. Даже если бы оператор if был синтаксически правильным, он все равно не вернул бы значения.

person Ian McLaird    schedule 09.10.2013
comment
Я знаю, что это правильно, как скриптлет, но вопрос был. Почему неправильно выражение ‹%= ... %› Это потому, что мы можем использовать if/else внутри них? - person Joe; 09.10.2013

Роэль де Нийс сказал:

Выражения JSP ‹%= ... %> помещаются внутрь out.print().

Итак, ‹%= состояние? "yes" : "no" %> преобразуется в out.println(state ? "yes" : "no");, который без проблем компилируется. Но с оператором if результирующий код не будет компилироваться. Вот почему точка с запятой в выражении jsp не допускается.

person Joe    schedule 10.10.2013