RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 831972
Accepted
Vaagn Akopyan
Vaagn Akopyan
Asked:2020-05-23 05:26:03 +0000 UTC2020-05-23 05:26:03 +0000 UTC 2020-05-23 05:26:03 +0000 UTC

如何在 servlet 上添加、编辑、保存对象

  • 772

在 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>
java
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Roman C
    2020-05-23T06:07:01Z2020-05-23T06:07:01Z

    您需要更改促销的名称,这是一个示例,您可以如何使用 EL 进行更改

    <input type="hidden" value="${booking.id == null?'new':'update'}" name="action">
    

    Если вы не хотите этого делать в JSP, то можно смотреть на параметр id в контроллере или куда глубже уровнях. Но принцип остается тем же самым. Вы даже можете использовать одну акцию для этого в POST . с другой стороны если вы уже используете id для редактирования, то нет смысла проверять его в JSP. У Hibernate есть метод, который проверяет id при сохранении и называется он saveOrUpdate насколько мне не изменяет память.

    Когда вы используете saveOrUpdate(), Hibernate проверяет, является ли объект переходным (он не имеет свойства идентификатора), и если это так, он сделает его сохраненным, генерируя его идентификатор и назначая его сеансу. Если у объекта есть идентификатор, он будет выполнять update().

    Из документации:

    saveOrUpdate() выполняет следующие действия:

    • если объект уже сохранен в этом сеансе, ничего не делает
    • если другой объект, связанный с сеансом, имеет один и тот же идентификатор, генерирует исключение
    • если объект не имеет идентификатора, то выполняет save()
    • если идентификатор объекта имеет значение, назначенное для вновь созданного объекта, то выполняет save()
    • если объект имеет версию, или, значение свойства version - это то же значение, присвоенное вновь созданному объекту, то выполняет save(), в противном случае выполняет update() объекта.
    • 2
  2. Bakhuss
    2020-05-23T06:45:56Z2020-05-23T06:45:56Z

    В ServletClass, после проверки на null, добавьте System.out.println( req.getParameter("action") ), и посмотрите, какие параметры поступают при нажатии той или иной кнопки.

    И два уточнения по коду, то, что бросилось в глаза. :)

    Класс Books создаёт экземпляр одной книги, поэтому его лучше назвать Book.

    В ControlClass#getAllData() возвращается ArrayList, поэтому здесь book лучше переименовать в books.

    Лучше сразу привыкать называть единичный экземпляр в единственном числе, множественный - во множественном числе.

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5