доступ к переменным сеанса в 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]);
}

}

Я надеюсь, что это поможет вам решить эту проблему.