доступ к переменным сеанса в JavaScript внутри JSP - PullRequest
7 голосов
/ 30 августа 2011

Мне нужно предоставить данные для таблицы API Google ... поэтому я отправлю их из сервлета в 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 в JSP, потому что сервлет находится там, где он должен быть размещен

EDIT: просто, чтобы подвести итог - я бы предпочел "нормальный" цикл JS для цикла здесь ... Обычнопредпочитаю минимизировать код Java и максимизировать JS

Ответы [ 3 ]

21 голосов
/ 30 августа 2011

Преобразуйте его в 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);

(обратите внимание, что я сделал это атрибутом запроса вместо атрибута сеанса, вы можете изменить его, но я считаю, что он неt обязательно должен быть атрибутом сеанса, поскольку он не представляет данные сеанса)

Назначьте его переменной JS в JSP следующим образом:

<script>
    var persons = ${personsJson};
    // ...
</script>

Таким образом, он доступендостойный объект JS.Вы можете передать его прямо в Google API.

Теперь вызовите URL-адрес сервлета вместо JSP.Например, когда он сопоставлен с шаблоном URL-адреса /persons, вызовите его с помощью http://localhost:8080/contextname/persons.

4 голосов
/ 30 августа 2011

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 для экранирования значений.

1 голос
/ 30 августа 2011

, поскольку ArrayList имеет объекты Strings, вы можете просто использовать метод 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]);
}

}

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

...