从JSP调用Servlet

3
基本上,我想在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>

也许你需要将JSP放在WEB-INF之外。 - Nishant
如果你追踪到servlet调用,你确定一些值被放入了“products”中吗? - ethrbunny
只要您使用正确的路径引用它们,JSP 可以放置在任何地方。编译后的文件将位于 WEB-INF/ 下,可能是 classes/ 或类似的目录。 - ethrbunny
2
只是为了确认一下:您导航到的是 /products,而不是 /products.jsp,对吗? - axtavt
好的。现在我遇到了这个错误。javax.el.PropertyNotFoundException: 在 com.ShoppingCart.Product 类型上未找到 'Id' 属性。 - user478636
3个回答

10

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

将JSP放置在/WEB-INF中可以有效防止最终用户直接打开它,除非涉及到servlet的doGet()方法。位于/WEB-INF中的文件无法公开访问。因此,如果必须进行servlet的预处理,则需要这样做。将JSP放入/WEB-INF文件夹中,并更改请求分派程序以指向它。

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

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

另请参阅:


好的。现在我遇到了这个错误。javax.el.PropertyNotFoundException: 在类型com.ShoppingCart.Product上找不到属性'Id'。 - user478636
这是一个新的问题,实际上应该单独提出来作为一个新的问题。要解决这个错误,您需要确保您有一个 getId() 方法,并且您按照 ${product.id} 的方式访问它(因此不是 ${product.Id})。 - BalusC

5

这里是一个Web应用程序文件夹结构的图示。不需要将JSP放在WEB-INF下面。

enter image description here

  • 在您的Servlet中调试或添加打印语句,以确保ArrayList中有元素。
  • 右键单击浏览器并查看页面源代码。是否有任何生成的内容?

我的Java包怎么样?所有的类都属于这个包。并且存储在主项目文件夹中的src文件夹中。 - user478636
好的,我猜你现在还在开发环境中,你的IDE(eclipse、netbeans、Idea)会负责部署Web组件。然而,Java类将放在WEB-INF\classes目录下。 - ring bearer

1
将JSP文件放置在WebRoot和WEB-INF下的区别是: 如果您将其放置在WebRoot下,用户可以使用浏览器地址栏上的URL访问您的JSP文件;如果您将其放置在WEB-INF下,用户无法访问该文件,因为它对公众隐藏。 唯一的访问方式是通过Servlet使用forward或redirect。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接