#html #jsp
#HTML #jsp
Вопрос:
Я пытаюсь установить параметр сеанса внутри вызова onclick элементов списка, например:
<div id="menu">
<ul>
<li class="menuClass" onclick="<% session.setAttribute( "currentPage", "firstPage"); %>">First page</a></li>
<li class="menuClass" onclick="<% session.setAttribute( "currentPage", "secondPage"); %>"><a href="/index.jsp">Second page</a></li>
</ul>
Однако это приводит к тому, что SecondPage отображается все время, даже без щелчка. Является ли этот подход вообще законным или есть другой способ изменить переменную сеанса и обновить страницу в элементе списка?
Ответ №1:
При вызове страницы JSP происходит следующее, в таком порядке:
- Сервер проверяет, был ли файл .jsp уже скомпилирован и изменился ли он с момента последней компиляции.
- Сервер запускает jsp через компилятор Jasper, который интерпретирует jsp в код Java, Все, что не является Java (CSS, HTML, JavaScript и т. Д.), Помещается в строку.
- Код Java скомпилирован и выполнен.
- Результаты помещаются в ответ и отправляются пользователю.
Итак, ваш оператор: session.setAttribute
выполняется до того, как HTML отправляется пользователю, и выполняет точно и currentPage
всегда имеет значение secondPage
already .
Как это проверить?
-
добавьте строку ниже
div
и посмотрите, что она печатает.<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:out value="${sessionScope.currentPage }" />
-
Щелкните правой кнопкой мыши в браузере и посмотрите на источник представления. Внутри
onclick
атрибута ничего нет, потомуsetAttribute
что он был выделен в отдельную команду и выполнен до того, как страница была отправлена вам.<li class="menuClass" onclick="">
Вы можете попробовать, как показано ниже, передать его как строку запроса вместо атрибута сеанса.
<a href="/index.jsp?currentPage=firstPage">First Page</a>
<a href="/index.jsp?currentPage=secondPage">Second Page</a>
Примечание: всегда старайтесь избегать элементов сценария и использовать стандартную библиотеку тегов JSP
Комментарии:
1. Полностью забыл, как работает JSP, спасибо за помощь!
Ответ №2:
Нет, этот подход не имеет смысла. Вы не можете ожидать, что обработчик onclick JavaScript, запущенный в браузере, выполнит Java-код на сервере. Единственный способ для обработчика JavaScript вызвать изменения на сервере — отправить HTTP-запрос (с использованием AJAX) на этот сервер.
Помните, что все, что находится внутри <% %>
, выполняется механизмом JSP на сервере, чтобы сгенерировать HTML-текст, который отправляется в качестве ответа браузеру.