从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访问的唯一方法。