如何使用 JSTL、JPA、EJB、JSP、Servlet 在 JavaEE 中更新和删除记录

How to Update and Delete record in JavaEE using JSTL, JPA, EJB, JSP, Servlet

我已经设法将数据保存到数据库中,但我无法更新和删除数据。我认为我走错了路或需要修复某些东西。我正在按照 Netbeans 的 JavaEE 电子商务教程自己学习 JavaEE。我已经学习了所有课程,现在向这个应用程序添加功能以使其成为真实世界的应用程序,因为这个示例课程缺少很多东西,但直到现在我才能使数据持久保存到数据库中。 在这里,我想知道我该如何修复它以及使它工作的更好方法是什么。

这是带有删除和更新按钮的阅读部分。它能够显示来自 MySQL 的数据列表。

<c:if test="${!empty categoryList}">

                    <h2>Category List</h2>
                    <table class="table">
                        <tr>
                            <th>Category Id:</th>
                            <th>Category Name:</th>
                            <th>Edit</th>
                            <th>Delete</th>
                        </tr>
                        <c:forEach var="category" items="${categoryList}" varStatus="iter">
                            <tr>
                            <td>${category.id}</td>
                            <td>${category.name}</td>
                            <td><a class="btn btn-danger" alt="Update" href='updateCategory.jsp?id=<c:out value="${category.id}"/>'><i class="fa fa-cut"></i></a></td>
                            <td><a class="btn btn-danger" alt="Delete" href='deleteCategory.jsp?action=delete&id=<c:out value="${category.id}"/>'><i class="fa fa-cut"></i></a></td>
                            </tr>
                        </c:forEach>
                    </table>
            </c:if>

updateCategory.jsp

<h1>Edit Category: </h1>
                <form id ="addCatForm" action="<c:url value='/admin/updateCategory?id=${param.id} '/>" method="post">
                    <c:if test="${!empty validationErrorFlag}">
                        <c:if test="${!empty nameError}"><p>Fill Category Name</p></c:if>
                    </c:if>

            <input type="hidden" name="id" value="${param.id}" />

                    <p><strong>Category Name:</strong>
                    <input class ="form-control" type="text" value ="${param.name}" name="name"></p>
                    <p><input class ="btn-success" type="submit" value="Submit"></p>

                </form>

部分来自 AdminServlet 处理更新:

else if (userPath.equals("/admin/updateCategory")){
             //Integer category_id = Integer.parseInt(request.getParameter("category_id")) ;
            String category_id = request.getParameter("category_id");
             category = categoryFacade.find(Integer.parseInt(category_id));
             String name = request.getParameter("name");
             boolean validationErrorFlag;
                validationErrorFlag = validator.validateForm(name, request);
                // if validation error found, return  to same
                if (validationErrorFlag == true) {
                    request.setAttribute("validationErrorFlag", validationErrorFlag);

                }
                else {
                    try{
                        request.setAttribute("name" , name);
                    //userPath = "/admin/showCategory";
                    //categoryManager.updateCategory(name, category_id);
                        categoryManager.updateCategory(name);
                    }
                    catch(Exception ex){
                        ex.toString();
                    }
                }                                                                        }

从 CategoryManager.java

更新和删除部分
public Category updateCategory(String name) {
        //public Category updateCategory(String name, int category_id) {
            Category category = new Category();

            category.setName(name);
            //category.setId(category_id);
            em.merge(category); 
            return category;


        }
        public Category deleteCategory(int id){
            Category category = new Category();
            category.setId(id);
            em.remove(category); 
            return category;
        }

没有调用删除的代码,所以请确保确实调用了CategoryManager的deleteCategory。

但除此之外,代码应该是:

public Category deleteCategory(int id){
    Category category = em.find(Category.clas,id);
    em.remove(category); 
    return category;
}

要进行更新,您需要知道要更新的类别的 ID

public Category updateCategory(int id, String name) {
    Category category = em.find(Category.class,id);
    category.setName(name);
    return category;
}

这两种方法都必须在事务上下文中调用,但如果您使用的是 Java EE,它会被处理(如果不是,您需要调用 em.getTransaction().begin()... em.getTransaction().commit() )

实际上代码是正确的,但正如我之前猜测的那样,我的 AdminServlet 中缺少了一个小东西。 实际上 url 模式丢失了

urlPatterns = {
                            "/admin/",
                            "/admin/viewOrders",
                            "/admin/viewCustomers",
                            "/admin/customerRecord",
                            //"/admin/customerOrder",
                            "/admin/orderRecord",
                            "/admin/logout",
                            "/admin/showProduct",
                            "/admin/showCategory",
                            "/admin/addCategory",
                            "/admin/addCategory.jsp",
                            "/admin/updateCategory",
                            "/admin/addProduct",
                            "/admin/addProduct.jsp",
                            "/admin/deleteProduct.jsp",
                            "/admin/deleteProduct"

                            })

上面的 categoryManager 的其他方法也可以。

public Category updateCategory(Category category, String name){

        category.setName(name);
        em.merge(category); 

        return category;
    }