доступ к переменным сеанса в javascript внутри jsp
Мне нужно предоставить данные для таблицы Google APIs... поэтому я отправлю его из сервлета в JSP
но как я могу получить доступ к этим данным в javascript" googles"?
я предоставлю образец другого JS-очень простой - просто, чтобы я узнал, как сделать то, что говорит тема
<script>
function showTable()
{
<%
Object obj = session.getAttribute("list");
List<String> list = new ArrayList<String>();
int size = 0;
if (obj != null) {
list = (ArrayList<String>) obj;
size = (Integer) session.getAttribute("size");
}
for (int i = 0 ; i < size ; i++) {
String value = list.get(i);
%>
alert('<%= i %> = <%= value %> ');
<%
}
%>
}
</script>
Он должен печатать элементы данного списка... но теперь это просто большая сумочка с надписью "Тревога" внутри... для рефакторинга? Мне не нравится иметь много java в JSPs, потому что сервлет где он должен быть помещен
EDIT: просто подводя итог - я бы предпочел "нормальный" JS для цикла здесь... Обычно я предпочитаю минимизировать java-код и максимизировать js
3 ответов
преобразовать его в JSON на doGet()
сервлета предварительной обработки. Вы можете использовать среди других Google Gson для этого. Предполагая, что у вас есть List<Person>
:
List<Person> persons = createItSomehow();
String personsJson = new Gson().toJson(persons);
request.setAttribute("personsJson", personsJson);
request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response);
(обратите внимание, что я сделал его атрибутом запроса вместо атрибута сеанса, вы можете его изменить, но я считаю, что он не обязательно должен быть атрибутом сеанса, поскольку он не представляет данные sessionwide)
назначьте его переменной JS в JSP как следует:
<script>
var persons = ${personsJson};
// ...
</script>
таким образом, он доступен как объект fullworthy JS. Вы можете отправить его прямо в Google API.
теперь вызовите URL сервлета вместо JSP. Например, когда он сопоставлен с шаблоном URL /persons
, вызвать его http://localhost:8080/contextname/persons.
JavaScript выполняется на стороне клиента, а теги скриптов, EL и JSP-на стороне сервера. С точки зрения серверного кода, JavaScript-это просто сгенерированный текст, как HTML-разметку.
Итак, если вы хотите иметь цикл JavaScript, который петляет по массиву JavaScript на сгенерированной странице HTML, вам нужно сгенерировать код JavaScript, который инициализирует массив, и цикл JavaScript.
вот код JSP
var theArray = [<c:forEach items="${sessionScope.list}" var="item" varStatus="loopStatus">'${item}' <c:if ${!loopStatus.last}>, </c:if></c:forEach>];
for (var i = 0; i < theArray.length; i++) {
alert(theArray[i]);
}
это JSP код будет генерировать следующий код JavaScript, предполагая, что список в атрибуте сеанса содержит "банан", "яблоко"и " оранжевый":
var theArray = ['banana', 'apple', 'orange', ];
for (var i = 0; i < theArray.length; i++) {
alert(theArray[i]);
}
убедитесь, что, однако, правильно избежать значений списка для создания допустимого кода JavaScript. Например, если одно из значений было "I'm cool"
, сгенерированный JavaScript будет
var theArray = ['I'm cool', 'apple', 'orange', ];
который больше не действует. Используйте commons-lang StringEscapeUtils.escapeEcmaScript чтобы избежать ценности.
поскольку ArrayList имеет объекты строк, вы можете просто использовать метод split () для значения списка массивов. Что-то вроде как ниже;
function showTable() {
<%
Object obj = session.getAttribute("list");
List list = null;
if (obj != null) {
list = (ArrayList<String>) obj;
} else list = new ArrayList<String>(); %>
var jsList = <%=list.toString()%>
//remove [] from content
jsList = jsList.replace("[","");
jsList = jsList.replace("]","");
//split the contents
var splitContent = jsList.split(","); //an array of element
for(var i=0;i<splitContent.length;++i) {
alert(splitContent[i]);
}
}
Я надеюсь, что это поможет вам решить эту проблему.