Доступ к переменным Java / Servlet / JSP / JSTL / EL в JavaScript
У меня есть форма в JSP. Я должен заполнить его на основе объекта запроса (из сервлета). Как я могу использовать Java Script для доступа к атрибутам объекта запроса или если вы можете предложить мне другой лучший способ динамического заполнения формы?
5 ответов
Вы должны понимать, что Java/JSP - просто производитель кода HTML/CSS/JS. Поэтому все, что вам нужно сделать, это просто позволить JSP напечатать переменную Java, как если бы она была переменной JavaScript, и чтобы сгенерированный вывод кода HTML/JS был синтаксически допустимым.
При условии, что переменная Java доступна в области видимости EL ${foo}
Вот несколько примеров, как его распечатать:
<script>var foo = '${foo}';</script>
<script>someFunction('${foo}');</script>
<div onclick="someFunction('${foo}')">...</div>
Представьте, что переменная Java имеет значение "bar"
затем JSP в конечном итоге сгенерирует этот HTML- код, который вы можете проверить, нажав правую кнопку мыши на View Source в веб-браузере:
<script>var foo = 'bar';</script>
<script>someFunction('bar');</script>
<div onclick="someFunction('bar')">...</div>
Обратите внимание, что эти одинарные кавычки являются обязательными для представления строковой переменной в JS. Если вы использовали var foo = ${foo};
вместо этого тогда это напечатало бы var foo = bar;
, которая может заканчиваться ошибкой "bar is undefined", когда вы пытаетесь получить к нему доступ в коде JS (вы можете увидеть ошибки JS в консоли JS набора инструментов веб-разработчика браузера, которые вы можете открыть, нажав F12 в Chrome/FireFox23+/IE9+). Также обратите внимание, что если переменная представляет число или логическое значение, которое не нужно заключать в кавычки, то оно будет работать нормально.
Если переменная получена из контролируемого пользователем ввода, имейте в виду, что нужно учитывать дыры XSS-атак и JS-экранирование. В нижней части нашей вики-страницы EL вы можете найти пример того, как создать пользовательскую функцию EL, которая экранирует переменную Java для безопасного использования в JS.
Если переменная немного сложнее, например, Java-бин или его список, или карта, то вы можете использовать одну из многих доступных библиотек JSON для преобразования объекта Java в строку JSON. Вот пример, предполагающий Gson.
String someObjectAsJson = new Gson().toJson(someObject);
Обратите внимание, что таким образом вам больше не нужно печатать его как строку в кавычках.
<script>var foo = ${someObjectAsJson};</script>
Смотрите также:
Если вы предварительно заполняете поля формы на основе параметров в HTTP-запросе, то почему бы просто не сделать это на стороне сервера в вашем JSP... а не на стороне клиента с помощью JavaScript? В JSP это будет выглядеть примерно так:
<input type="text" name="myFormField1" value="<%= request.getParameter("value1"); %>"/>
На стороне клиента JavaScript не имеет понятия "объект запроса". Вы в значительной степени должны разобрать строку запроса вручную, чтобы получить параметры CGI. Я подозреваю, что это не то, что вы на самом деле хотите сделать.
Передача JSON из JSP в Javascript.
Я пришел сюда в поисках этого, ответ @BalusC помог в некоторой степени, но не решил проблему в корне. После глубокого копания
<script>
тег, я наткнулся на это решение.
<script id="jsonData" type="application/json">${jsonFromJava}</script>
и в ЖС:
var fetchedJson = JSON.parse(document.getElementById('jsonData').textContent);
В файле JSP:
<head>
...
<%@ page import="com.common.Constants" %>
...
</head>
<script type="text/javascript">
var constant = "<%=Constants.CONSTANT%>"
</script>
Затем эта постоянная переменная будет доступна для файлов.js, объявленных после приведенного выше кода.
Constants.java - это java-файл, содержащий статическую константу с именем CONSTANT.
Сценарий, который у меня был, заключался в том, что мне нужна была одна константа из файла свойств, поэтому вместо создания файла свойств для javascript я сделал это.
На странице JSP:
<c:set var="list_size" value="${list1.size() }"></c:set>
Получите доступ к этому значению на странице Javascipt, используя:
var list_size = parseInt($('#list_size').val());
Я добавил страницу JavaScript в свой проект извне.