在 JSP 页面上实现了一个简单的书目录,其数据是使用 Hibernate 从 OracleSQL 数据库中提取的。在同一页面上,有一个带有字段 ( input) "name"、"author"的表单"year"和一个用于添加到数据库的提交按钮。目录中每个条目的对面都有按钮update, delete。从数据库中添加和删除数据没有问题,但更新不起作用。
问题是方法中的servletdoPost条件不if成立(我通过debug发现,),即else if (action.equals("update")) ..... 我马上说ID正确的书挑对的那一行,没有问题,不要伤脑筋(调试)。
我承认我可能正在尝试执行一个完全幼稚的操作,但请帮助我弄清楚如何仍然实现从数据库输出数据并在同一个 JSP 页面上进行编辑。到目前为止,事实证明是删除和添加。我请您在需要添加或更改的地方戳一下手指。在此先感谢大家的详细解答。对于我的实用建议,两瓶啤酒放在你的钱包里)
我将给出所有代码页,但首先是 servlet 本身(Servletclass.class)和 JSP 类(BookStore.jsp)。
package ru.home.echo;
import ru.home.echo.control.ControlClass;
import ru.home.echo.entity.Books;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ServletClass extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ControlClass controlClass= new ControlClass();
RequestDispatcher rd = null;
resp.setContentType("text/html");
if (req.getParameter("action" )!=null) {
if (req.getParameter("action").equals("delete")) {
int id = Integer.parseInt(req.getParameter("id"));
Books books = new Books();
books.setId(id);
controlClass.deleteBook(books);
List<Books> book = controlClass.getAllData();
req.setAttribute("Books", book);
rd = req.getRequestDispatcher("BookStore.jsp");
}
else if (req.getParameter("action").equals("update")){
int id = Integer.parseInt(req.getParameter("id").toString());
Books book = controlClass.getBooksById(id);
req.setAttribute("booking", book);
req.setAttribute("action", "update");
List<Books> books = controlClass.getAllData();
req.setAttribute("Books", books);
rd = req.getRequestDispatcher("BookStore.jsp");
}
}
else {
List<Books> books = controlClass.getAllData();
req.setAttribute("Books", books);
rd = req.getRequestDispatcher("BookStore.jsp");
}
rd.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action").toString();
resp.setContentType("text/html");
RequestDispatcher rd=null;
if(action.equals("new")) {
Books books = new Books();
ControlClass controlClass = new ControlClass();
req.setAttribute("booking", books);
books.setName(req.getParameter("bookname").toString());
books.setAuthor(req.getParameter("bookauthor").toString());
books.setYear(Integer.parseInt(req.getParameter("bookyear")));
controlClass.saveBook(books);
List<Books> booksList = controlClass.getAllData();
req.setAttribute("Books", booksList);
rd = req.getRequestDispatcher("BookStore.jsp");
}
else if(action.equals("update")){
Books book= new Books();
book.setName(req.getParameter("bookname").toString());
book.setAuthor(req.getParameter("bookauthor").toString());
book.setYear(Integer.parseInt(req.getParameter("bookyear")));
book.setId(Integer.parseInt(req.getParameter("bookingid").toString()));
ControlClass controlClass= new ControlClass();
controlClass.updateBook(book);
List<Books>booksList= controlClass.getAllData();
req.setAttribute("Books",booksList);
rd=req.getRequestDispatcher("BookStore.jsp");
}
rd.forward(req,resp);
}
}
BookStore.jsp 页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta charset="UTF-8">
<title>BooksStore</title>
<style type="text/css">
.tdser {background: #cccccc;}
td {
font-family: Arial, sans-serif;
font-size: 14px;
padding: 10px 5px;
border-style: solid;
border-width: 1px;
overflow: hidden;
word-break: normal;
border-color: black;
color: #333;
background-color: #fff;
}
table { border-collapse: collapse;
border-spacing: 0;
border-color: #ccc;}
</style>
</head>
<body>
<table >
<tr id="toptr">
<td class="tdser">ID</td>
<td class="tdser">NAME</td>
<td class="tdser">AUTHOR</td>
<td class="tdser">YEAR</td>
</tr>
<c:forEach items="${Books}" var="book">
<tr id="downtr">
<td>${book.id}</td>
<td>${book.name}</td>
<td>${book.author}</td>
<td>${book.year}</td>
<td><a href="/books?action=delete&id=${book.id}">delete</a></td>
<td><a href="/books?action=update&id=${book.id}">update</a></td>
</tr>
</c:forEach>
</table>
<br>
<br>
<form action="/books" method="post">
Book name:<input type="text" name="bookname" value="${booking.name}"><br><br>
Book author:<input type="text" name="bookauthor" value="${booking.author}"><br><br>
Book year:<input type="text" name="bookyear" value="${booking.year}"><br><br>
<input type="hidden" value="new" name="action">
<input type="hidden" value="${booking.id}" name="bookingid">
<input type="submit" value="submit">
</form>
</body>
</html>
Books.class(实体):
package ru.home.echo.entity;
import javax.persistence.*;
@Entity
@Table(name = "BOOKS")
public class Books {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "bookIdGen")
@SequenceGenerator(name = "bookIdGen", sequenceName = "BOOK_SEQ",allocationSize = 1)
long id;
@Column(name = "NAME")
String name;
@Column(name = "AUTHOR")
String author;
@Column(name = "YEAR")
int year;
public Books() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "Entity{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", year=" + year +
'}';
}
}
ControlClass 类(控制器):
package ru.home.echo.control;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ru.home.echo.DAO.GetSession;
import ru.home.echo.entity.Books;
import java.util.ArrayList;
import java.util.List;
public class ControlClass {
public List<Books> getAllData(){
GetSession getSession= new GetSession();
Session session= getSession.getSessionFactory().openSession();
List<Books>book=new ArrayList<>();
Query query=session.createQuery("from Books book");
book= query.list();
return book;
}
public void saveBook(Books book) {
GetSession getSession= new GetSession();
Session session= getSession.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.save(book);
t.commit();
System.out.println("inserted.......");
}
public void deleteBook(Books book) {
GetSession getSession= new GetSession();
Session session= getSession.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.delete(book);
t.commit();
}
public void updateBook(Books book) {
GetSession getSession= new GetSession();
Session session= getSession.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.update(book);
t.commit();
}
public Books getBooksById(int id){
String query = "from Books book where book.id="+id;
GetSession getSession= new GetSession();
Session session= getSession.getSessionFactory().openSession();
Query query2 = session.createQuery(query);
Books book= (Books) query2.list().get(0);
return book;
}
}
获取 SessionFactory 的类:
package ru.home.echo.DAO;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import java.util.Locale;
public class GetSession {
private static SessionFactory sessionFactory=createSessionFactory();
private static ServiceRegistry serviceRegistry;
public static SessionFactory createSessionFactory() {
try {
Locale.setDefault(Locale.ENGLISH);
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}
最后是 WEB.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>HibernateExampleWithServlets</display-name>
<servlet>
<servlet-name>BooksServlet</servlet-name>
<servlet-class>ru.home.echo.ServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BooksServlet</servlet-name>
<url-pattern>/books</url-pattern>
</servlet-mapping>
</web-app>
您需要更改促销的名称,这是一个示例,您可以如何使用 EL 进行更改
Если вы не хотите этого делать в JSP, то можно смотреть на параметр
idв контроллере или куда глубже уровнях. Но принцип остается тем же самым. Вы даже можете использовать одну акцию для этого вPOST. с другой стороны если вы уже используетеidдля редактирования, то нет смысла проверять его в JSP. У Hibernate есть метод, который проверяетidпри сохранении и называется онsaveOrUpdateнасколько мне не изменяет память.В
ServletClass, после проверки наnull, добавьтеSystem.out.println( req.getParameter("action") ), и посмотрите, какие параметры поступают при нажатии той или иной кнопки.И два уточнения по коду, то, что бросилось в глаза. :)
Класс
Booksсоздаёт экземпляр одной книги, поэтому его лучше назватьBook.В
ControlClass#getAllData()возвращаетсяArrayList, поэтому здесьbookлучше переименовать вbooks.Лучше сразу привыкать называть единичный экземпляр в единственном числе, множественный - во множественном числе.