JSP внутри ListItems onclick

#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 .


Как это проверить?

  1. добавьте строку ниже div и посмотрите, что она печатает.

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <c:out value="${sessionScope.currentPage }" />
      
  2. Щелкните правой кнопкой мыши в браузере и посмотрите на источник представления. Внутри 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-текст, который отправляется в качестве ответа браузеру.