【问题标题】:Calling servlet from JSP [duplicate]从 JSP 调用 servlet [重复]
【发布时间】:2011-07-24 17:51:20
【问题描述】:

基本上,我想在 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
  • 如果您追踪到 servlet 调用 - 您确定“产品”中有一些价值吗?
  • 只要您使用正确的路径来引用它们,JSP 几乎可以去任何地方。您的编译位最终将在 WEB-INF/ 下 - 可能是 classes/ 或类似的
  • 只是为了确保:您导航到/products,而不是/products.jsp,对吧?
  • 好的。现在我收到了这个错误。 javax.el.PropertyNotFoundException:在类型 com.ShoppingCart.Product 上找不到属性“Id”

标签: java jsp servlets


【解决方案1】:

您需要通过请求 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。

另见:

【讨论】:

  • 好的。现在我收到了这个错误。 javax.el.PropertyNotFoundException:在类型 com.ShoppingCart.Product 上找不到属性“Id”
  • 这是一个新问题,实际上值得提出自己的问题,但是唉。要修复此错误,您需要确保您有一个 getId() 方法,并且您可以按以下方式访问它 ${product.id}(因此不是 ${product.Id})。
【解决方案2】:

这是一个网络应用程序文件夹结构图。无需将您的 JSP 放在 WEB-INF 下。

  • 在您的 Servlet 中调试或放入 print statememnts 以确保 arraylist 中包含元素。
  • 右键单击浏览器并查看页面源代码。有什么生成的吗?

【讨论】:

  • 我的 java 包呢……所有的类都属于那个包。并且存放在项目主文件夹的src文件夹中。
  • 好吧,我猜你还在你的开发环境中,你的 IDE(eclipse、netbeans、Idea)正在负责部署 Web 组件。但是,java 类将位于 WEB-INF\classes
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2021-06-24
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多