Возврат с ошибкой 500 из JSP включает в себя

Есть ли способ изнутри страницы jsp:include заставить запрашивающую страницу ответить ошибкой HTTP 500? Я пытался использовать response.sendError(418, "I'm a teapot.");, но это работает только в JSP, содержащем jsp:include, и только если это первая строка, потому что вы не можете вызвать ее после того, как ответ был зафиксирован. У меня есть это:

Индекс.jsp:

// other HTML

<jsp:include page="Exapmle.jsp">
    <jsp:param name="aVariable" value="aValue" />
</jsp:include>

// other HTML

Пример.jsp:

<%
    String aVariable = request.getParameter("aVariable");
    if (aVariable != null && !aVariable.trim().isEmpty) {
        // code to generate content
        %><%=someContent%><%
    } else { 
        response.sendError(418, "I'm a teapot");
    }
%>

Так есть ли способ сделать это? Я сомневаюсь, основываясь на том, как работает JSP, но надеюсь, что где-то здесь может помочь. Кроме того, сервлеты не вариант (по крайней мере, сейчас).


person Daevin    schedule 15.03.2016    source источник


Ответы (1)


Если вы заставите его работать, вы не должны полагаться на то, что он всегда будет работать на всех платформах и в будущих обновлениях. Как вы правильно указали: после того, как ответ был зафиксирован (например, все заголовки HTTP находятся на пути к клиенту), сервер больше не может добавлять какие-либо другие заголовки HTTP. Не говоря уже об изменении кода состояния.

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

JSP хорош для отображения контента, который вы отправляете, вместе с соответствующим кодом состояния. Не решать, какой код состояния отправить.

person Olaf Kock    schedule 18.03.2016
comment
О, я знаю. Мне не нравится это делать, но, к сожалению, сейчас это моя задача. Мы находимся в процессе перехода на .NET MVC с сервлетов Java, поэтому предполагается, что это будет быстрое исправление, чтобы заставить что-то работать, прежде чем мы полностью переключимся. Причины для этого длинные и раздражающие, но мой менеджер хочет, чтобы это было сделано именно так. - person Daevin; 18.03.2016
comment
Тогда вам все равно следует переместить обнаружение состояния ошибки вверх. Если вы не можете продвинуть его в нужное место, переместите его во включающее jsp. Это уродливо и неправильно, но, похоже, это правильный путь для вас. - person Olaf Kock; 19.03.2016