Как перенести массив Java в массив Java, используя JSP? - PullRequest
9 голосов
/ 05 февраля 2009

У меня есть список строк на моем сервере, которые я пытаюсь получить клиенту в виде массива. Код, который я пытаюсь использовать, следующий:

В JSP у меня есть List<String> столбец

Я пытаюсь ввести следующий код:

<%int j = 0; %>
for(var i = 0; i < <%=columns.size()%>; i++)
{
  colArray[i] = "<%=columns.get(j++)%>";
}

Этот код просто возвращает первый элемент в списке столбцов для каждого элемента в colArray.

Я также пробовал:

colArray = <%=columns.toArray()%>;

, который тоже не работает. Я чувствую, что где-то совершаю небольшую ошибку и просто не вижу ее. Возможно ли то, что я пытаюсь сделать так, как я пытаюсь?

Спасибо.

Ответы [ 6 ]

13 голосов
/ 05 февраля 2009

Вы получаете код JSP, который выполняется на сервере, смешанный с кодом JavaScript, который выполняется на клиенте. Фрагмент <%=columns.get(j++)%> выполняется один раз на сервере, и цикл JavaScript вокруг него не имеет значения на данном этапе. Когда он приходит к клиенту, тело цикла просто говорит colArray[i] = "first entry";, что, конечно, помещает одну и ту же строку в каждый элемент массива.

Вместо этого вам нужно выполнить цикл на сервере, например:

<% for (int i=0; i<columns.size(); i++) { %>
colArray[<%= i %>] = "<%= columns.get(i) %>"; 
<% } %>

Мои навыки JSP ржавые, и синтаксис может быть другим, но я надеюсь, что вы поняли.

Редактировать: Как было отмечено в комментариях, вам нужно ОЧЕНЬ быть очень осторожным, избегая экранирования чего-либо в этих строках, что может привести к их интерпретации как код JavaScript (наиболее заметные кавычки) - особенно они содержат пользовательский контент. В противном случае ваше приложение остается широко открытым для межсайтовых сценариев и подделка межсайтовых запросов атак.

6 голосов
/ 05 февраля 2009

Попробуйте использовать JSON (нотация объектов Javascript), было бы довольно просто кодировать массив и декодировать его в javascript

проверить это здесь

http://www.json.org/java/index.html

5 голосов
/ 05 февраля 2009

Как только JavaScript достигает клиента, серверный код перестает выполняться. Код сервера не выполняется «параллельно» с кодом клиента.

Вы должны построить полную инициализацию JavaScript в Java и отправить ее, полностью и исполняемую, клиенту:

<%
StringBuffer values = new StringBuffer();
for (int i = 0; i < columns.size(); ++i) {
    if (values.length() > 0) {
        values.append(',');
    }
    values.append('"').append(columns.get(i)).append('"');
}
%>
<script type="text/javascript">
var colArray = [ <%= values.toString() %> ];
</script>

Это всего лишь один из способов сделать это, вы также можете создать вывод "на лету", внедрив код сервера в [ и ]. Я использовал этот пример, чтобы попытаться продемонстрировать разделение между созданием строки, содержащей клиентский JavaScript, и выводом ее в браузер.

3 голосов
/ 17 сентября 2012

Язык опыта:

colArray = ${columns}
2 голосов
/ 08 октября 2015

Для меня это решение сработало. Прежде всего, вы должны создать JSONArray и использовать его метод toJSONString (). Этот метод преобразует список в текст JSON. Результатом этого является массив JSON.

<% 
List<String> exampleList = new ArrayList<>();
exampleList.add("Apple");
exampleList.add("Orange");
exampleList.add("Lemon");

JSONArray fruitList = new JSONArray();
fruitList.addAll(exampleList);
%>

На странице JSP вы должны вызвать метод списка toJSONString () и передать текст JSON в массив JavaScript.

<script type="text/javascript"> var fruitArray = <%= fruitList.toJSONString() %>;</script>

(При желании вы можете создать простой метод получения для списка. В случае, если вы создаете экземпляр класса JAVA, который имеет поле списка, на странице JSP.)

2 голосов
/ 06 июня 2013

Приведенные выше решения не сработали в моем случае, для переноса мне потребовалась дополнительная переменная Javascript:

var codesJS=new Array();
<% String[] codes=(String[])request.getAttribute("codes");
if(codes!=null){
    for(int i=0; i<codes.length; i++){ %>
        var code='<%= codes[i] %>';           //--> without this doesnt work
        codesJS[<%= i %>]=code; 
    <%}
}%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...