Как удалить / обновить / отсортировать комментарии в Java EE Servlets EJB - PullRequest
0 голосов
/ 28 октября 2019

Я создал проект в классе, который позволяет вводить ваше имя и комментарий, затем, когда вы нажимаете «Отправить», он помещает имя и комментарий в локальную базу данных, а затем отображает имя, комментарий и дату вприведенная ниже таблица, например, так:

text

В проекте используются NetBeans с Java EE, Java SE, GlassFish и локальной базой данных Apache Derby.

Да, и кстати, яЯ использую виртуальную машину, предоставленную моим университетом.

В проекте 4 основных класса:

Servlet namai.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jlab1.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.UserTransaction;

/**
 *
 * @author Administrator
 */
@WebServlet(name = "namai", urlPatterns = {"/namai"})
public class namai extends HttpServlet {

    private jlab1.beans.Message msg = new jlab1.beans.Message();

    @PersistenceUnit
    private EntityManagerFactory emf;

    @Resource
    private UserTransaction utx;

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        EntityManager em = null;

        try {
            em = emf.createEntityManager(); // sukurti nauja modeliu valdymo objekta
            //Isrinkti esancius komentarus
            List messages = em.createQuery("select m from Message m").getResultList();
            // I uzklausos objekta ideti laikina JavaBean ir EJB pranesimu sarasa
            request.setAttribute("msg", this.msg);
            request.setAttribute("msg_list", messages);
            //Uzklausa perduot i atvaizdavimo lygi
            request.getRequestDispatcher("namai.jsp").forward(request, response);
        } catch(Exception e){
            throw new ServletException(e);
        } finally {
            if(em != null){
                em.close();
            }
        }



        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet namai</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet namai at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String l_name = "";
        l_name = request.getParameter("name");
        String l_msg="";
        l_msg = request.getParameter("message");
        //String l_papildomas="";
        String l_papildomas = request.getParameter("papildomas");
        if(l_msg != null && l_name != null){
            this.msg.setName(l_name);
            this.msg.setMsg(l_msg);
            this.msg.setTime(new Date());
            //dadedam papildoma
            //this.msg.setPapildomas(l_papildomas);
            if(request.getParameter("deleteButton") != null){
               //deleteMsg(request, response);
                String id = request.getParameter("id");
                System.out.println("msg id: " + id);
           }

            EntityManager em = null;
//             if(l_name.length() >= 10){
//                 l_name = "Anon";
//             }

            try {
                jlab1.entities.Message e_msg = new jlab1.entities.Message();
                e_msg.setMessage(l_msg);
                e_msg.setName(l_name);
                e_msg.setTime(new Date());
                //dadedam papildoma
                e_msg.setPapildomas(l_papildomas);
                utx.begin();
                em = emf.createEntityManager();
                em.persist(e_msg);
                utx.commit();
            } catch (Exception e){
                throw new ServletException(e);
            } finally {
                if(em !=null){
                    em.close();
                }
            }
        }
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    public void deleteMsg(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException{
        String id = request.getParameter("id");
//        System.out.println("msg id: " + id);
        try{
        EntityManager em = emf.createEntityManager();
        //String sql =  + id;
        String queryString = "DELETE m FROM Message m WHERE m.id = " + id;
        Query query = em.createQuery(queryString);

        query.executeUpdate();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

}

JavaBean Message.java

package jlab1.beans;

import java.util.Date;

/**
 *
 * @author Administrator
 */
public class Message {

    private String name;
    private String msg;
    private Date time;
    private String papildomas;

    public String getPapildomas() {
        return papildomas;
    }

    public void setPapildomas(String papildomas) {
        this.papildomas = papildomas;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Message() {}


}

EJB Message.java

package jlab1.entities;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Administrator
 */
@Entity
@Table(name = "MESSAGE")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Message.findAll", query = "SELECT m FROM Message m"),
    @NamedQuery(name = "Message.findById", query = "SELECT m FROM Message m WHERE m.id = :id"),
    @NamedQuery(name = "Message.findByName", query = "SELECT m FROM Message m WHERE m.name = :name"),
    @NamedQuery(name = "Message.findByMessage", query = "SELECT m FROM Message m WHERE m.message = :message"),
    @NamedQuery(name = "Message.findByTime", query = "SELECT m FROM Message m WHERE m.time = :time")})
public class Message implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
     @TableGenerator(name = "MSGPkGen",
            table = "SEQUENCE",
            schema = "APP",
            pkColumnName = "SEQ_NAME",
            pkColumnValue = "MESSAGE",
            valueColumnName = "SEQ_COUNT",
            initialValue = 0,
            allocationSize = 1
            )
    @GeneratedValue(generator = "MSGPkGen", strategy=GenerationType.TABLE)
    @Column(name = "ID")
    private Integer id;
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "NAME")
    private String name;
    @Size(max = 120)
    @Column(name = "MESSAGE")
    private String message;
    @Column(name = "TIME")
    @Temporal(TemporalType.TIME)
    private Date time;
    @Size(max = 50)
    @Column(name = "PAPILDOMAS")
    private String papildomas;

    public Message() {
    }

    public Message(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public String getPapildomas(){
        return papildomas;
    }

    public void setPapildomas(String papildomas) {
        this.papildomas = papildomas;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Message)) {
            return false;
        }
        Message other = (Message) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "jlab1.entities.Message[ id=" + id + " ]";
    }
}

И namai.jsp

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title> My first JSP   </title>
                <style>
                    TABLE, TD, TH, TR {
                        border-collapse:collapse;
                        border-width: 1px;
                        border-style: solid;
                        border-spacing: 5px;
                        padding: 2px 5px;
                    }
                </style>

    </head> 
    <body align="center">       
            <form action="/jlab1" method="POST">            
            Name
            <input type="text" name="name"size="20px">
                        Comment
            <input type="text" name="message"size="20px">

            <input type="submit" value="Send">
        </form> 
            <hr>
            <div>
                <c:if test="${not empty msg}">
                    <jsp:getProperty name="msg" property="name"/>:
                    <jsp:getProperty name="msg" property="msg"/>
                </c:if>
            </div>
            <hr>
            <div align="center">
                <table id="messageTable">
                <tr >
                    <th bgcolor=>ID</th>
                    <th bgcolor=>Name</th>
                    <th bgcolor=>Comment</th>
                    <th bgcolor=>Data</th>

                </tr>
                <c:if test="${not empty msg_list}">
                    <c:forEach var="m" begin="0" items="${msg_list}">
                    <tr>
                        <td>${m.id}&nbsp;&nbsp;</td> 
                        <td>${m.name}&nbsp;&nbsp;</td> 
                        <td>${m.message}&nbsp;&nbsp;</td> 
                        <td>${m.time}&nbsp;&nbsp;</td> 
                        <!--<td>${m.papildomas}&nbsp;&nbsp;</td> 

                        <td><button type="submit" name="deleteButton" value="deleteButton" action="${namai.abc}">Delete</button></td>
                        <td><a name="deleteButton" href="${pageContext.request.contextPath}/Message?action=DELETE&id=${m.id}">Delete</a></td> -->
                    </tr> 

                    </c:forEach>
                </c:if>
                </table>
            </div>
    </body> 
</html>

Теперь я пытаюсь добавить кнопку, которая, например, удаляет выбранноекомментарий из базы данных. Я сделал кнопку довольно простой, добавив <td><a name="deleteButton" href="${pageContext.request.contextPath}/Message?action=DELETE&id=${m.id}">Delete</a> к namai.jsp, однако я просто не могу заставить ее работать.

Я пробовал много способов сделать это, мой самый последнийделать что-то вроде этого:

public void deleteMsg(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException{
        String id = request.getParameter("id");
//        System.out.println("msg id: " + id);
        try{
        EntityManager em = emf.createEntityManager();
        //String sql =  + id;
        String queryString = "DELETE m FROM Message m WHERE m.id = " + id;
        Query query = em.createQuery(queryString);

        query.executeUpdate();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

, но этот не работает (ошибка в запросе). Я следовал многим учебникам на YouTube, но все они используют подключение к БД и операторам, и я просто не могу адаптировать эти вещи в моем текущем проекте. Завтра большой тест от этого, и я действительно отчаянно нуждаюсь в помощи. Я знаю, что мне, вероятно, нужно удалить / отсортировать / обновить операторы JPQL, но я просто не могу заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...