从JSP调用servlet

基本上,我想在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 products = new ArrayList(); 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)

 

List of Products

${product.Description} ${product.UnitPrice}

在web.xml

   Inventory com.ShoppingCart.InventoryServlet   Inventory /products   

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

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

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

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

也可以看看:

  • Servlets信息页面

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

在此处输入图像描述

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

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

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