Вызов сервлета из JSP

По сути, я хочу отобразить продукты в ArrayList на странице JSP. Я сделал это в коде сервлета. Но нет выхода.

Также я должен поместить products.jsp в папку /WEB-INF? Когда я это делаю, я получаю запрошенную не ресурсную ошибку.

Мой код сервлета (InventoryServlet.java)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    try {
        List<Product> products = new ArrayList<Product>();
        products = Inventory.populateProducts(); // Obtain all products.
        request.setAttribute("products", products); // Store products in request scope.
        request.getRequestDispatcher("/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
    } catch (Exception ex) {
        throw new ServletException("Retrieving products failed!", ex);
    }

}

Моя страница JSP (products.jsp)

<h2>List of Products</h2>

<table>
    <c:forEach items="${products}" var="product">
       <tr>
           <td>${product.Description}</td>
          <td>${product.UnitPrice}</td>
       </tr>
    </c:forEach>
</table>

web.xml

<web-app version="3.0"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

 <servlet>
   <servlet-name>Inventory</servlet-name>
   <servlet-class>com.ShoppingCart.InventoryServlet</servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>Inventory</servlet-name>
    <url-pattern>/products</url-pattern>
  </servlet-mapping>
</web-app>

3 ответа

Решение

Вам нужно открыть страницу, запросив URL-адрес сервлета вместо URL-адреса JSP. Это назовет doGet() метод.

Размещение JSP в /WEB-INF эффективно препятствует тому, чтобы конечный пользователь непосредственно открыл его без участия doGet() метод сервлета. Файлы в /WEB-INF а именно не являются общедоступными. Таким образом, если предварительная обработка сервлета является обязательной, то вам необходимо это сделать. Поместите JSP в /WEB-INF папку и измените requestdispatcher, чтобы указать на него.

request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);

Но вам нужно изменить все существующие ссылки, чтобы они указывали на URL сервлета вместо URL JSP.

Смотрите также:

Вот схема структуры папок веб-приложения. Нет необходимости размещать ваши JSP под WEB-INF.

  • отладьте или поместите print Statememnts в ваш сервлет, чтобы убедиться, что в нем есть элементы.
  • Щелкните правой кнопкой мыши на вашем браузере и просмотрите страницу источника. Есть ли что-нибудь генерируется вообще?

Разница между помещением файла jsp в WebRoot и WEB-INF заключается в следующем: если вы поместите файл в WebRoot, пользователь сможет получить доступ к вашему файлу jsp, используя URL-адрес в адресной строке браузера; если вы введете под WEB-INF, пользователь не сможет получить доступ к файлу, потому что он скрыт от общественности.

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

Другие вопросы по тегам