【问题标题】:Updating database entrys from JSP page从 JSP 页面更新数据库条目
【发布时间】:2012-11-27 00:55:25
【问题描述】:

我的 JSP/Servlet/EclipseLink-JPA 项目遇到了一些奇怪的问题。我直接从 NetBeans(EE 包)7.2.1 在 Apache Tomcat 7.0.27.0 上运行,数据库是 PostgresSQL
这是一些代码:
jsp页面负责展示产品的表格,index.jsp:

<%
            for(Product product:ProductController.getProducts()){
                %><tr>
                    <td><%
                    out.print(product.getName());
                                           %></td>
                    <td><%
                    out.print(product.getPrice());
                                            %></td>
                    <td><%
                    out.print(product.getUnit());
                                           %></td>
                    <td><%
                    out.print(product.getSales().size());
                                           %></td>
                    <td><a target=\"_blank\" href="viewSales.jsp?id=<%=product.getId_product()%>">sales</a> </td>
                    <td>
                        <a target="_blank" href="updateProduct.jsp?id=<%=product.getId_product()%>&name=<%=product.getName()%>&price=<%=product.getPrice()%>&unit=<%=product.getUnit()%>">edit</a>
                    </td>
                </tr><%
            }
        %>

最后一个单元格中的两个链接用于查看销售情况并相应地更新产品。我们对最后一个感兴趣,导致另一个jsp:

<form action="UpdateProduct" method="post">
            <input type="text" name="id" style="display:none" value="<%=request.getParameter("id") %>">            
            <input type="text" name="name" size="30" placeholder="Название" value="<%=request.getParameter("name")%>"><br>
            <input type="text" name="price" size="30" placeholder="Цена" value="<%=request.getParameter("price")%>"><br>
            <input type="text" name="unit" size="30" placeholder="Единица" value="<%=request.getParameter("unit")%>"><br>
            <input type="submit" name="save" value="Сохранить">
        </form>

从这里我们要去servlet UpdateProduct.java:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        Long id = Long.parseLong(request.getParameter("id"));
        String name = request.getParameter("name");
        double price = Double.parseDouble(request.getParameter("price"));
        String units = request.getParameter("unit");            
        ProductController.updateProduct(id, name, price, units);

        response.sendRedirect("");
    } finally {            
        out.close();
    }
}

ProductcController.updateProduct 工作正常(我可以直接在数据库中看到它)。

但是当我返回第一页 (index.jsp) 时,无论我刷新多少次,我都看不到任何变化。我最接近的猜测是Apache Tomcat(我正在运行它)以某种方式将来自第一个请求的数据保存在上下文中的某个位置,并且不会按需刷新它。此外,奇怪的是添加产品效果很好。

【问题讨论】:

  • 你没有展示有趣的部分:ProductController.getProducts()
  • 其实不是很有趣public static List&lt;Product&gt; getProducts(){ EntityManager em = MyEntityManager.getEM(); return em.createQuery("SELECT p FROM Product p ORDER BY p.id_product").getResultList(); }
  • home, ty 指出 getProducts() 有问题 - 它实际上是返回旧数据。所以我想这个问题不是关于 jsp/servlets 而是关于错误的控制器/postgres 中的东西。
  • 您可能不会刷新您的实体经理。首先,插入新产品后尝试em.flush(),查询前尝试em.refresh()
  • home,再次感谢您,我已将 List products = em.createQuery("SELECT p FROM Product p ORDER BY p.id_product").getResultList(); for(Object product:products){ em.refresh(product); } 添加到 getProducts() 中,并且成功了。然而,你能解释一下为什么它没有吗?我现在必须一个一个地刷新项目,它就像自己选择每个项目一样 - 有点贵。

标签: jsp tomcat servlets


【解决方案1】:

通过在显示之前刷新每个产品来解决问题

List products = em.createQuery("SELECT p FROM Product p ORDER BY p.id_product").getResultList(); 
    for(Object product:products){ 
    em.refresh(product);
     }

我想可以通过保存更新后的产品 id 并仅刷新它们来改进它。

问题的根源是未知的,因为在其他实现相同但使用 swing GUI 的项目中,一切正常,无需刷新。也许这与在 Tomcat 上执行类有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2018-06-26
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多