Я создал проект в классе, который позволяет вводить ваше имя и комментарий, затем, когда вы нажимаете «Отправить», он помещает имя и комментарий в локальную базу данных, а затем отображает имя, комментарий и дату вприведенная ниже таблица, например, так:
В проекте используются 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} </td>
<td>${m.name} </td>
<td>${m.message} </td>
<td>${m.time} </td>
<!--<td>${m.papildomas} </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, но я просто не могу заставить его работать.