Вызов сервлета из 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>
Ответы
Ответ 1
Вам нужно открыть страницу, запросив URL сервлета вместо URL JSP. Это вызовет метод doGet()
.
Размещение JSP в /WEB-INF
эффективно предотвращает прямое открытие enduser без участия метода doGet()
сервлета. Файлы в /WEB-INF
не являются общедоступными. Поэтому, если предварительная обработка сервлета является обязательной, вам необходимо это сделать. Поместите JSP в папку /WEB-INF
и измените requestdispatcher, чтобы указать на него.
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
Но вам нужно изменить все существующие ссылки, чтобы указать URL-адрес сервлета вместо URL-адреса JSP.
См. также:
Ответ 2
Вот диаграмма для структуры папок веб-приложений. Не нужно размещать свои JSP под WEB-INF.
- отладить или поместить печатные statememnts в ваш Servlet, чтобы убедиться, что у arraylist есть элементы в нем.
- Щелкните правой кнопкой мыши на вашем браузере и просмотрите источник страницы. Есть ли что-нибудь вообще созданное?
Ответ 3
Разница между размещением jsp файла под WebRoot и WEB-INF:
если вы ставите под WebRoot, пользователь может получить доступ к вашему jsp файлу, используя URL-адрес в адресной строке браузера; если вы помещаете под WEB-INF, пользователь не может получить доступ к файлу, потому что он скрыт от общественности.
Единственный способ, которым вы можете получить доступ, - через сервлет, используя переадресацию или перенаправление.