Доступ к переменным Java / Servlet / JSP / JSTL / EL в JavaScript - PullRequest
14 голосов
/ 30 сентября 2010

У меня есть форма в JSP.Я должен заполнить его на основе объекта запроса (из сервлета).Как я могу использовать Java Script для доступа к атрибутам объекта запроса или если вы можете предложить мне другой лучший способ динамического заполнения формы?

Ответы [ 4 ]

19 голосов
/ 30 сентября 2010

Вы должны понимать, что 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-код, который вы можете проверить, нажав правую кнопку мыши, Просмотреть источник в веб-браузере:

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

Смотри также:

6 голосов
/ 30 сентября 2010

Если вы предварительно заполняете поля формы на основе параметров в HTTP-запросе, то почему бы просто не сделать это на стороне сервера в вашем JSP ... а не на стороне клиента с JavaScript? В JSP это будет выглядеть примерно так:

<input type="text" name="myFormField1" value="<%= request.getParameter("value1"); %>"/>

На стороне клиента JavaScript не имеет понятия «объект запроса». Вы в значительной степени должны проанализировать строку запроса самостоятельно, чтобы получить параметры CGI. Я подозреваю, что это не то, что вы на самом деле хотите сделать.

0 голосов
/ 13 июня 2019

В файле JSP:

<head>
...
<%@ page import="com.common.Constants" %>
...
</head>
<script type="text/javascript"> 
        var constant = "<%=Constants.CONSTANT%>"
</script>

Эта константа будет доступна для файлов .js, которые объявлены после кода выше.

Constants.java - это javaфайл, содержащий статическую константу с именем CONSTANT.

В моем сценарии мне нужна была одна константа из файла свойств, поэтому вместо создания файла свойств для javascript я сделал это.

0 голосов
/ 17 ноября 2017

На странице JSP:

<c:set var="list_size" value="${list1.size() }"></c:set>

Для доступа к этому значению на странице Javascipt используйте:

var list_size = parseInt($('#list_size').val());

Я добавил страницу javascript в свой проект извне.

...