从JSP调用servlet

时间:2011-03-28 19:08:09

标签: java jsp servlets

基本上,我想在JSP页面上的ArrayList中显示产品。我在servlet代码中完成了这个。但是没有输出。

另外,我是否必须将products.jsp放在/ WEB-INF文件夹中?当我这样做时,我得到一个请求的不是资源错误。

我的Servlet代码(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 个答案:

答案 0 :(得分:10)

您需要通过请求servlet URL而不是JSP URL来打开页面。这将调用doGet()方法。

/WEB-INF中放置JSP有效地防止了最终用户直接打开它而不涉及servlet的doGet()方法。 /WEB-INF中的文件无法公开访问。因此,如果servlet的预处理是强制性的,那么您需要这样做。将JSP放在/WEB-INF文件夹中,并将requestdispatcher更改为指向它。

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

但是您需要将所有现有链接更改为指向servlet URL而不是JSP URL。

另见:

答案 1 :(得分:5)

这是Web应用程序文件夹结构的图表。无需将JSP放在WEB-INF下。

enter image description here

  • 调试或将print statememnts放入Servlet中,以确保arraylist中包含元素。
  • 右键单击浏览器并查看页面源。是否有任何产生的东西?

答案 2 :(得分:1)

在WebRoot和WEB-INF下放置一个jsp文件的区别是: 如果你放在WebRoot下,用户可以使用浏览器地址栏上的URL访问你的jsp文件;如果你放在WEB-INF下,用户就无法访问该文件,因为它是公开隐藏的。

您可以使用转发或重定向通过Servlet访问的唯一方法。