Там какой-либо путь состоит в том, чтобы установить атрибуты запроса (не параметры), когда форма отправляется?
Проблема, которую я пытаюсь решить: у Меня есть страница JSP, отображающая некоторые данные в нескольких выпадающих списках. То, когда форма отправляется, мой сервлет Контроллера обрабатывает этот запрос (на основе параметров устанавливало/указывало в форме), и перенаправления к той же странице JSP, которая, как предполагается, отображает дополнительные детали. Я теперь хочу отобразить те же/более ранние данные в выпадающих списках, не имея необходимость повторно вычислять или повторно вычислять для получения тех же самых данных.
И на упомянутой странице JSP, выпадающие списки в форме заполняются данными, которые указаны через атрибуты запроса. Прямо сейчас, после того, как Форма ОТПРАВЛЯЕТСЯ, и я перенаправляюсь к той же странице JSP, выпадающие списки пусты, потому что необходимые атрибуты запроса не присутствуют.
Я - вполне n00b когда дело доходит до веб-приложений, таким образом, очевидное и легкое решение этой проблемы выходит из меня в данный момент!
Я открыт для предложений о том, как реструктурировать поток управления в Сервлете.
Некоторые детали об этом приложении: стандартный Сервлет + JSP, JSTL, работающий в Apache Tomcat 6.0.
Спасибо.
... и перенаправляет на ту же JSP-страницу...
Здесь надо ставить не редирект, а forward. Т.е. не do
response.sendRedirect("page.jsp");
а do
request.getRequestDispatcher("page.jsp").forward(request, response);
Таким образом, исходный запрос остается живым, включая все параметры и атрибуты. Перенаправление же инструктирует клиента выполнить совершенно новый запрос, тем самым засоряя первоначальный запрос.
В JSP вы можете получить доступ к параметрам запроса с помощью ${param}
в EL, и вы можете получить доступ к атрибутам запроса таким же образом с помощью ${attributeKey}
, где attributeKey
- это ключ атрибута, который вы использовали для установки объекта в области видимости запроса в сервлете следующим образом:
request.setAttribute("attributeKey", someObject);
Что касается сохранения значений HTML ввода в JSP, вам просто нужно установить элемент
value
атрибута соответственно значению параметра запроса:
<input name="foo" value="${param.foo}">
Это печатает результат request. getParameter("foo")
в тексте шаблона. Однако это сопряжено с XSS риском, поэтому лучше экранировать любой управляемый пользователем ввод с помощью fn:escapeXml()
JSTL следующим образом:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input name="foo" value="${fn:escapeXml(param.foo)}">
Сохранение выбранного варианта в выпадающем списке - это немного другая история. В основном вам нужно установить атрибут selected
элемента . Предположим, что вы - как это обычно делается - используете
для отображения Map
или, возможно, List
значений опций, вы можете решить эту проблему следующим образом (предполагая, что ${countries}
является Map
, которую вы поместили в качестве атрибута в область видимости запроса, сессии или приложения):
<select name="country">
<c:forEach items="${countries}" var="country">
<option value="${country.key}" ${country.key == param.country ? 'selected' : ''}>${country.value}</option>
</c:forEach>
</select>
Это печатает атрибут selected
, когда текущий итерируемый ключ опции равен представленному ключу в карте параметров запроса.