Не удается передать объект ArrayList в JSP из сервлета - PullRequest
0 голосов
/ 23 марта 2019

У меня есть мой сервлет

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
    List<String> topics = new ArrayList<>();
    ServletConfig config = getServletConfig();

    topics.add(config.getInitParameter("first"));
    System.out.println(config.getInitParameter("first")); //prints proper value, not null;

    topics.add(config.getInitParameter("second"));
    System.out.println(config.getInitParameter("second")); //prints proper value, not null;

    topics.add(config.getInitParameter("third"));
    System.out.println(config.getInitParameter("third")); //prints proper value, not null;

    req.setAttribute("params", topics); //doesn't show up
    req.setAttribute("name", config.getInitParameter("name")); //works good
    req.getRequestDispatcher("index.jsp").forward(req, resp);
}

и

index.jsp

...
<ol>
    <c:forEach var="param" items="${params}">
        <li>${param}</li>
    </c:forEach>
</ol>
...

Конфигурация сервлета в порядке, инициализация в порядке, отображение и именование также в порядке, поэтому, когда я получаю доступ к соответствующему URL, я печатаю параметры в потоке консоли вывода, и они там. Однако по какой-то странной причине JSP отображает:

 1. {}
 2. {}
 3. {}

N.B. Я не хочу использовать Java-код Scriptlet, я пытаюсь использовать JSTL. Я видел много проектов, работающих таким образом ... что здесь не так? просто устал выяснять.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

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

Важным моментом здесь является имя переменной итерации - идентификатор param.

В начале [вероятно] всех .jsp файлов у нас есть оператор для импорта тегов core, и мы присваиваем ему некоторый префикс

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>



Причина, по которой

...
<ol>
    <c:forEach var="param" items="${params}">
        <li>${param}</li>
    </c:forEach>
</ol>
...

не работал и показывал

 1. {}
 2. {}
 3. {}

, заключается в том, что param является ключевым словом, идентифицирующим один из основных теговот jstl/core.

<c:param> выбирает / получает массив параметров запроса.
Итак, каждый раз, когда цикл forEach повторялся, переменная param назначалась параметру (ам) запроса из строки запроса, а не значению итерации из ${params} переменной / заполнителя, и, поскольку я ничего не передавал - пустой массив

PS Будьте осторожны, не используйте теги JSTL в качестве переменных / идентификаторов в вашем коде.

Надеемся, что некоторые из вас сочтут эту информацию полезной.

0 голосов
/ 23 марта 2019

Полагаю, у вас есть:

<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>

В index.jsp?

...