Monday, March 30, 2026

Library Management System Project in Java | JSP, Servlet, MySQL

 


Step 1: Created the DB and table in workbeanch.

1. Created DB.

CREATE DATABASE IF NOT EXISTS library_db DEFAULT CHARACTER SET utf8mb4;
USE library_db;

CREATE TABLE IF NOT EXISTS users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    email VARCHAR(120) NOT NULL UNIQUE,
    password VARCHAR(120),
    role VARCHAR(120) NOT NULL DEFAULT 'USER',
    phone_no VARCHAR(120) NOT NULL,
    address text(120),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. Configure the MYSQL in Eclipse.


3. Connection DB code.

/src/main/java/com/lms/util/DbUtil.java

package com.lms.util;

import java.sql.Connection;
import java.sql.DriverManager;

public class DbUtil {
static Connection con;

    public static Connection createConnection() {
        Connection con = null;

        String url = "jdbc:mysql://localhost:3306/library_db?useSSL=false";
        String username = "root";
        String password = "root";

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            con = DriverManager.getConnection(url, username, password);
            System.out.println("Connected to DB");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return con;
    }
}



Step 2: Created the jsp file.
    /libraryManagementSystem/src/main/webapp

1. created jsp folder and 
2. created the jsp file




Step 3: Root file and root route configure using web.xml.


Step 3: Call the controller and created the controller using servelet.

/src/main/java/com/lms/controller/AuthenticationController.java



Step 4: Get the HTML from data in controller and check the logic.

/src/main/webapp/jsp/login.jsp

<form action="AuthenticationController" method="post">

<input type="hidden" name="action" value="checklogin">

           <div class="form-floating">

<input type="text" class="form-control" id="username" name="username" placeholder="Username">

<label for="username"><i class="bi bi-person-fill me-2"></i>Username</label>

</div>


<div class="form-floating">

<input type="password" class="form-control" id="password" name="password" placeholder="Password">

<label for="password"><i class="bi bi-lock-fill me-2"></i>Password</label>

</div>


<button type="submit" class="btn btn-login">

<i class="bi bi-box-arrow-in-right me-2"></i>Sign In

</button>


<div class="divider">

<span>or</span>

</div>


<div class="text-center">

<p class="mb-0">Don't have an account? <a href="register.html" class="forgot-link">Sign up here</a></p>

</div>

</form>




/src/main/java/com/lms/controller/AuthenticationController.java

        /**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String action = request.getParameter("action");

if("checklogin".equalsIgnoreCase(action)) {

String username = request.getParameter("username");

String password = request.getParameter("password");

UserService userService = new UserServiceImpl();

User user = userService.checkLogin(username, password);

if(user != null) {

System.out.println("User Found");

}else {

System.out.println("No User Found");

}

}else {

System.out.println("No action found");

}

} Step 5: Now download and configure jstl jar file.


Download jstl api:- 





Download servlet api:- 



Now configure the  JSTL - JSP Standard Tag Library



Why Use JSTL?

  • Eliminates the need for scriptlets (<% %>) in JSP pages
  • Improves readability and maintainability of JSP files
  • Provides built-in tags for iteration, conditional checks, and data formatting
  • Supports internationalization (i18n) and localization
  • Enables XML data processing and database interactions
Step 5: Dynamic Error message show on frontend end.



Code :- 

/libraryManagementSystem/src/main/webapp/jsp/login.jsp


<c:if test="${not empty errorMessage}">

<div class="alert alert-danger alert-dismissible fade show" role="alert">

<c:out value="${errorMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>




/libraryManagementSystem/src/main/java/com/lms/controller/AuthenticationController.java


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String action = request.getParameter("action");

if("checklogin".equalsIgnoreCase(action)) {

String username = request.getParameter("username");

String password = request.getParameter("password");

UserService userService = new UserServiceImpl();

User user = userService.checkLogin(username, password);

if(user != null) {

System.out.println("User Found");

}else {

// System.out.println("No User Found");

request.setAttribute("errorMessage", "Invalid username or password");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/login.jsp");

dispacher.forward(request, response);

}

}else {

System.out.println("No action found");

}


Step 6: Added one entry inside the mysql.



-- Seed an admin user (password should be re-hashed in production)


INSERT INTO users (first_name, last_name, email, password, role, phone_no)

VALUES ('Admin', 'test', 'admin@library.com', 'admin123', 'ADMIN', "84848454545")

ON DUPLICATE KEY UPDATE email = email;


SELECT * FROM users;


Step 7: Check the login condition.




Step 8: Now we are going to make a dashboard page when user login success.



Copy and past the html inside dashboard.html


Output:-



Step 9: Now we are going to made Header and footer Sidebar.

1. Created one folder inside the JSP the name of folder "Include"


2. Inside the include folder created one file the name of file named header.jsp




code: - include file inside the dashboard file

<%@ include file ="include/header.jsp" %>



                Add Book


Step 1: Add the book functionality.


1. Create a book table

CREATE TABLE IF NOT EXISTS books (

book_id INT AUTO_INCREMENT PRIMARY KEY,

    title VARCHAR(250) NOT NULL,

    author VARCHAR(250) NOT NULL,

    category VARCHAR(120),

    isbn VARCHAR(30),

    publisher VARCHAR(250),

    total_copies INT NOT NULL,

    available_copies INT NOT NULL,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);


Step 2. Create a variable and setter getter method like encapsulation:-

/src/main/java/com/lms/pojo/Book.java




Code:- 

package com.lms.pojo;


import java.util.Date;


public class Book {

private long bookID;

private String title;

private String author;

private String category;

private String isbn;

private String publisher;

private int totalcopies;

private int availablecopies;

private Date createdAt;

public long getBookID() {

return bookID;

}

public void setBookID(long bookID) {

this.bookID = bookID;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public String getCategory() {

return category;

}

public void setCategory(String category) {

this.category = category;

}

public String getIsbn() {

return isbn;

}

public void setIsbn(String isbn) {

this.isbn = isbn;

}

public String getPublisher() {

return publisher;

}

public void setPublisher(String publisher) {

this.publisher = publisher;

}

public int getTotalCopies() {

return totalcopies;

}

public void setTotalCopies(int totalcopies) {

this.totalcopies = totalcopies;

}

public int getAvailableCopies() {

return availablecopies;

}

public void setAvailableCopies(int availablecopies) {

this.availablecopies = availablecopies;

}

public Date getCreatedAt() {

return createdAt;

}

public void setCreatedAt(Date createdAt) {

this.createdAt = createdAt;

}


}


Step 3. We have created the interface for the book:-





Code:- 

package com.lms.pojo;


import java.util.List;


import com.lms.pojo.Book;

public interface BookDao { public boolean addBook(Book book); public boolean updateBook(Book book); public List<Book> getAllBookList(); public List<Book> getAllBookByStatus(String status); }


Step 4. Created one class for interface implementation, build logic for the book like MODEL:-



Code:-


package com.lms.daoImpl; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import com.lms.dao.BookDao; import com.lms.pojo.Book; import com.lms.util.DbUtil; public class BookDaoImpl implements BookDao{ @Override public boolean addBook(Book book) { Connection con = null ; PreparedStatement prepareStatement = null; ResultSet rs = null; try { String sql = "INSERT INTO books(title, author, category, isbn, publisher, total_copies, available_copies, created_at)" +" VALUES(?,?,?,?,?,?,?,?)"; con = DbUtil.createConnection(); prepareStatement = con.prepareStatement(sql); prepareStatement.setString(1, book.getTitle()); prepareStatement.setString(2, book.getAuthor()); prepareStatement.setString(3, book.getCategory()); prepareStatement.setString(4, book.getIsbn()); prepareStatement.setString(5, book.getPublisher()); prepareStatement.setInt(6, book.getTotalCopies()); prepareStatement.setInt(7, book.getAvailableCopies()); // java.sql.Date sqlDate = new java.sql.Date(book.getCreatedAt().getTime()); // prepareStatement.setDate(8, sqlDate); // Handle date safely if (book.getCreatedAt() != null) { java.sql.Date sqlDate = new java.sql.Date(book.getCreatedAt().getTime()); prepareStatement.setDate(8, sqlDate); } else { prepareStatement.setDate(8, new java.sql.Date(System.currentTimeMillis())); } int i = prepareStatement.executeUpdate(); if(i>0) { return true; } }catch(Exception e) { e.printStackTrace(); } return false; } @Override public boolean updateBook(Book book) { // TODO Auto-generated method stub return false; } @Override public List<Book> getAllBookList() { // TODO Auto-generated method stub return null; } @Override public List<Book> getAllBookByStatus(String status) { // TODO Auto-generated method stub return null; } }


Step 5. Created the Services interface for calling the controller:-

/libraryManagementSystem/src/main/java/com/lms/service/BookService.java 



Code:-

package com.lms.service;

import java.util.List;

import com.lms.pojo.Book;

public interface BookService {
public boolean addBook(Book book);
public boolean updateBook(Book book);
public List<Book> getAllBookList();
public List<Book> getAllBookByStatus(String status);
}

Step 6. Created one class for interface implementation, built logic for the service like MODEL:-

/libraryManagementSystem/src/main/java/com/lms/servicelmpl/BookServiceImpl.java


code :-

package com.lms.servicelmpl;

import java.util.List;

import com.lms.dao.BookDao;
import com.lms.daoImpl.BookDaoImpl;
import com.lms.pojo.Book;
import com.lms.service.BookService;

public class BookServiceImpl implements BookService{

BookDao bookDao = new BookDaoImpl();
@Override
public boolean addBook(Book book) {
return bookDao.addBook(book);
}

@Override
public boolean updateBook(Book book) {
// TODO Auto-generated method stub
return false;
}

@Override
public List<Book> getAllBookList() {
// TODO Auto-generated method stub
return null;
}

@Override
public List<Book> getAllBookByStatus(String status) {
// TODO Auto-generated method stub
return null;
}

}

Step 7. Created the Services interface for calling the controller:-





/libraryManagementSystem/src/main/java/com/lms/controller/BookController.java

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String action = request.getParameter("action");

System.out.println("action: " +action);

if("showAddBook".equalsIgnoreCase(action)) {

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/addBook.jsp");

dispacher.forward(request, response);

} else if("addbook".equalsIgnoreCase(action)) {

String bookTitle = request.getParameter("bookTitle");

String author = request.getParameter("author");

String isbn = request.getParameter("isbn");

String category = request.getParameter("category");

String publisher = request.getParameter("publisher");

String availableCopies = request.getParameter("numberOfPages");

String numberofcopies = request.getParameter("numberofcopies");

//System.out.println(bookTitle + "\n" + author + "\n" + isbn +

"\n" + category + "\n" + publisher + "\n" + availableCopies + "\n" + numberofcopies);

Book book = new Book();

book.setTitle(bookTitle);

book.setAuthor(author);

book.setCategory(category);

book.setIsbn(isbn);

book.setPublisher(publisher);

book.setTotalCopies(Integer.parseInt(numberofcopies));

book.setAvailableCopies(Integer.parseInt(availableCopies));


BookService bookService = new BookServiceImpl();

boolean flag = bookService.addBook(book);

if(flag) {

request.setAttribute("successMessage", "Book added successfully!!");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/addBook.jsp");

dispacher.forward(request, response);

}else {

// System.out.println("No User Found");

request.setAttribute("errorMessage", "Invalid username or password");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/addBook.jsp");

dispacher.forward(request, response);

}

}else {

System.out.println("No action found");

}

}

Output Before the summit:-


Output after the summit:-


                

                Add a new field status


Step 1. Added a new field for status-



/libraryManagementSystem/src/main/java/com/lms/pojo/Book.java

package com.lms.pojo;


import java.util.Date;


public class Book {

private String status;

public String getStatus() {

return status;

}

public void setStatus(String status) {

this.status = status;

}

}



/libraryManagementSystem/src/main/java/com/lms/controller/BookController.java

else if("addbook".equalsIgnoreCase(action)) {

String bookTitle = request.getParameter("bookTitle");

String author = request.getParameter("author");

String isbn = request.getParameter("isbn");

String category = request.getParameter("category");

String publisher = request.getParameter("publisher");

String availableCopies = request.getParameter("numberOfPages");

String numberofcopies = request.getParameter("numberofcopies");

String status = "Available";

//System.out.println(bookTitle + "\n" + author + "\n" + isbn + "\n" + category + "\n" + publisher + "\n" + availableCopies + "\n" + numberofcopies);

Book book = new Book();

book.setTitle(bookTitle);

book.setAuthor(author);

book.setCategory(category);

book.setIsbn(isbn);

book.setPublisher(publisher);

book.setTotalCopies(Integer.parseInt(numberofcopies));

book.setAvailableCopies(Integer.parseInt(availableCopies));

book.setStatus(status);


BookService bookService = new BookServiceImpl();

boolean flag = bookService.addBook(book);

if(flag) {

List<Book> booklist = new ArrayList<>();

booklist = bookService.getAllBookList();

if(booklist != null && booklist.size() >0) {

request.setAttribute("booklist", booklist); //send the data on bookList page.

request.setAttribute("successMessage", "Book added successfully!!");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/bookList.jsp");

dispacher.forward(request, response);

}

else {

request.setAttribute("errorMessage", "Invalid username or password");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/addBook.jsp");

dispacher.forward(request, response);

}

}else {

// System.out.println("No User Found");

request.setAttribute("errorMessage", "Invalid username or password");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/addBook.jsp");

dispacher.forward(request, response);

}

}


/libraryManagementSystem/src/main/java/com/lms/daoImpl/BookDaoImpl.java

public class BookDaoImpl implements BookDao{


@Override

public boolean addBook(Book book) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "INSERT INTO books(title, author, category, isbn, publisher, total_copies, available_copies, created_at, status)"

+" VALUES(?,?,?,?,?,?,?,?,?)";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setString(1, book.getTitle());

prepareStatement.setString(2, book.getAuthor());

prepareStatement.setString(3, book.getCategory());

prepareStatement.setString(4, book.getIsbn());

prepareStatement.setString(5, book.getPublisher());

prepareStatement.setInt(6, book.getTotalCopies());

prepareStatement.setInt(7, book.getAvailableCopies());

// java.sql.Date sqlDate = new java.sql.Date(book.getCreatedAt().getTime());

// prepareStatement.setDate(8, sqlDate);

// Handle date safely

if (book.getCreatedAt() != null) {

java.sql.Date sqlDate = new java.sql.Date(book.getCreatedAt().getTime());

prepareStatement.setDate(8, sqlDate);

} else {

prepareStatement.setDate(8, new java.sql.Date(System.currentTimeMillis()));

}

prepareStatement.setString(9, book.getStatus());

int i = prepareStatement.executeUpdate();

if(i>0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}


@Override

public boolean updateBook(Book book) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

// String sql = "update books set title = ?, author = ?, category = ?, isbn = ?, publisher = ?, total_copies=?"

// + " Where book_id = ?";

String sql = "UPDATE books SET title = ?, author = ?, category = ?, isbn = ?, publisher = ?, total_copies = ? "

+ "WHERE book_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setString(1, book.getTitle());

prepareStatement.setString(2, book.getAuthor());

prepareStatement.setString(3, book.getCategory());

prepareStatement.setString(4, book.getIsbn());

prepareStatement.setString(5, book.getPublisher());

prepareStatement.setInt(6, book.getTotalCopies());

prepareStatement.setLong(7, book.getBookID());

int i = prepareStatement.executeUpdate();

if(i > 0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}


@Override

public List<Book> getAllBookList() {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

ArrayList<Book> bookList = new ArrayList<>();//new array initialization

try {

String sql = "Select * from books order by book_id desc";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

rs = prepareStatement.executeQuery();

while(rs.next()) {

Book book = new Book();

book.setBookID(rs.getLong("book_id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setCategory(rs.getString("category"));

book.setIsbn(rs.getString("isbn"));

book.setPublisher(rs.getString("publisher"));

book.setTotalCopies(rs.getInt("total_copies"));

book.setAvailableCopies(rs.getInt("available_copies"));

book.setStatus(rs.getString("status"));

//added the list in the array

bookList.add(book);

}

//System.out.println(bookList);

} catch (Exception e) {

e.printStackTrace();

}finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return bookList;

}


@Override

public List<Book> getAllBookByStatus(String status) {

// TODO Auto-generated method stub

return null;

}


@Override

public Book getBookById(long bookId) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "Select * from books where book_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setLong(1, bookId);

rs = prepareStatement.executeQuery();

while(rs.next()) {

Book book = new Book();

book.setBookID(rs.getLong("book_id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setCategory(rs.getString("category"));

book.setIsbn(rs.getString("isbn"));

book.setPublisher(rs.getString("publisher"));

book.setTotalCopies(rs.getInt("total_copies"));

book.setAvailableCopies(rs.getInt("available_copies"));

book.setStatus(rs.getString("status"));

//added the list in the array

System.out.println(book);

return book;

}

} catch (Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return null;

}


}


                Show List Book




Step 1. Created the routing for controller:-


/libraryManagementSystem/src/main/webapp/jsp/include/sidebar.jsp

<ul class="nav flex-column">

<li class="nav-item"><a class="nav-link ${activePage == 'dashboard' ? 'active' : ''}" href="AuthenticationController"><i class="bi bi-speedometer2"></i>Dashboard</a></li>

<li class="nav-item"><a class="nav-link ${param.action == 'allBookList' ? 'active' : ''}" href="BookController?action=allBookList"><i class="bi bi-book"></i>Books</a></li>

<li class="nav-item"><a class="nav-link ${param.action == 'showAddBook' ? 'active' : ''}" href="BookController?action=showAddBook"><i class="bi bi-plus-circle"></i>Add Book</a></li>

</ul>



Step 2:- Controller

/libraryManagementSystem/src/main/java/com/lms/controller/BookController.java

else if("allBookList".equalsIgnoreCase(action)) {

List<Book> booklist = new ArrayList<>();

BookService bookService = new BookServiceImpl();

booklist = bookService.getAllBookList();

if(booklist != null && booklist.size() >0) {

request.setAttribute("booklist", booklist); //send the data on bookList page.

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/bookList.jsp");

dispacher.forward(request, response);

}

}


Step 3:- HTML page


/libraryManagementSystem/src/main/webapp/jsp/bookList.jsp


<div class="container-fluid">

<div class="row">

<!-- Sidebar -->

<%@ include file ="include/sidebar.jsp" %>


<!-- Main content -->

<main class="col-md-9 ms-sm-auto col-lg-10">

<div class="page-header header-with-btn">

<h1 class="h2"><i class="bi bi-book-fill me-2"></i>Books Library</h1>

<a href="BookController?action=showAddBook" class="btn-modern"><i class="bi bi-plus-circle"></i>Add New Book</a>

</div>

<c:if test="${not empty successMessage}">

<div class="alert alert-success alert-dismissible fade show" role="alert">

<c:out value="${successMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>


<!-- Books Table -->

<c:choose>

<c:when test="${not empty booklist}">

<div class="table-container">

<div class="table-responsive">

<table class="table table-hover align-middle">

<thead>

<tr>

<th>#</th>

<th>Title</th>

<th>Author</th>

<th>Category</th>

<th>ISBN</th>

<th>Status</th>

<th>Actions</th>

</tr>

</thead>

<tbody>

<c:forEach var="book" items="${booklist}" varStatus="status">

<tr>

<td><span class="badge bg-primary">${status.index + 1 }</span></td>

<td><strong>${book.title}</strong></td>

<td>${book.author}</td>

<td><span class="badge badge-modern badge-fiction">${book.category}</span></td>

<td><code>${book.isbn}</code></td>

<td><span class="badge bg-success">${book.status}</span></td>

<td>

<a href="BookController?action=viewBook&bookId=${book.bookID}" class="action-btn edit" title="Edit Book"><i class="bi bi-pencil-square"></i></a>

<button class="action-btn delete" title="Delete Book"><i class="bi bi-trash-fill"></i></button>

</td>

</tr>

</c:forEach>

</tbody>

</table>

</div>

</div>

</c:when>

<c:otherwise>

<h6>No Data Found</h6>

</c:otherwise>

</c:choose>

</main>

</div>

</div>


                    

                 Edit Button






/libraryManagementSystem/src/main/webapp/jsp/bookList.jsp

<a href="BookController?action=viewBook&bookId=${book.bookID}" class="action-btn edit" title="Edit Book"><i class="bi bi-pencil-square"></i></a>


/src/main/java/com/lms/controller/BookController.java

else if("viewBook".equalsIgnoreCase(action)) {

long bookId = Integer.parseInt(request.getParameter("bookId"));

BookService bookService = new BookServiceImpl();

Book book = bookService.getBookById(bookId);

if(book != null) {

request.setAttribute("book", book);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editBook.jsp");

dispacher.forward(request, response);

}else {

List<Book> booklist = new ArrayList<>();

booklist = bookService.getAllBookList();

if(booklist != null && booklist.size() >0) {

request.setAttribute("errorMessage", "Book Data Not Found.!!");

request.setAttribute("booklist", booklist); //send the data on bookList page.

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/bookList.jsp");

dispacher.forward(request, response);

}

}

}


/src/main/java/com/lms/servicelmpl/BookServiceImpl.java


@Override

public Book getBookById(long bookId) {

// TODO Auto-generated method stub

return bookDao.getBookById(bookId);

}


/libraryManagementSystem/src/main/java/com/lms/dao/BookDao.java

import java.util.List;

import com.lms.pojo.Book; public interface BookDao { public boolean addBook(Book book); public boolean updateBook(Book book); public List<Book> getAllBookList(); public List<Book> getAllBookByStatus(String status); public Book getBookById(long bookId); }


/libraryManagementSystem/src/main/java/com/lms/daoImpl/BookDaoImpl.java


@Override

public Book getBookById(long bookId) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "Select * from books where book_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setLong(1, bookId);

rs = prepareStatement.executeQuery();

while(rs.next()) {

Book book = new Book();

book.setBookID(rs.getLong("book_id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setCategory(rs.getString("category"));

book.setIsbn(rs.getString("isbn"));

book.setPublisher(rs.getString("publisher"));

book.setTotalCopies(rs.getInt("total_copies"));

book.setAvailableCopies(rs.getInt("available_copies"));

book.setStatus(rs.getString("status"));

//added the list in the array

System.out.println(book);

return book;

}

} catch (Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return null;

}


/libraryManagementSystem/src/main/webapp/jsp/editBook.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ include file ="include/header.jsp" %>



<div class="container-fluid">

<div class="row">

<!-- Sidebar -->

<%@ include file ="include/sidebar.jsp" %>


<!-- Main content -->

<main class="col-md-9 ms-sm-auto col-lg-10">

<div class="page-header">

<h1 class="h2"><i class="bi bi-book-fill me-2"></i>Add New Book</h1>

</div>

<c:if test="${not empty errorMessage}">

<div class="alert alert-danger alert-dismissible fade show" role="alert">

<c:out value="${errorMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>

<c:if test="${not empty successMessage}">

<div class="alert alert-success alert-dismissible fade show" role="alert">

<c:out value="${successMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>


<div class="form-container">

<form action="BookController" method="post">

<input type="hidden" name="action" value="updateBook">

<input type="hidden" name="bookId" value="${book.bookID}">

<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="bookTitle" name="bookTitle" placeholder="Book Title" value="${book.title}">

<label for="bookTitle"><i class="bi bi-book me-2"></i>Book Title</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="author" name="author" placeholder="Author" value="${book.author}">

<label for="author"><i class="bi bi-person me-2"></i>Author</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="isbn" name="isbn" placeholder="ISBN" value="${book.isbn}">

<label for="isbn"><i class="bi bi-hash me-2"></i>ISBN Number</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<select class="form-select" id="category" name="category">

<option selected disabled value="">Select category</option>

<option value="fiction" <c:if test="${book.category == 'fiction' }"> selected </c:if>>Fiction</option>

<option value="non-fiction" <c:if test="${book.category == 'non-fiction' }"> selected </c:if>>Non-fiction</option>

<option value="science" <c:if test="${book.category == 'science' }"> selected </c:if>>Science</option>

<option value="technology" <c:if test="${book.category == 'technology' }"> selected </c:if>>Technology</option>

<option value="history" <c:if test="${book.category == 'history' }"> selected </c:if>>History</option>

<option value="biography" <c:if test="${book.category == 'biography' }"> selected </c:if>>Biography</option>

<option value="mystery" <c:if test="${book.category == 'mystery' }"> selected </c:if>>Mystery</option>

<option value="romance" <c:if test="${book.category == 'romance' }"> selected </c:if>>Romance</option>

</select>

<label for="category"><i class="bi bi-collection me-2"></i>Category</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="publisher" name="publisher" placeholder="Publisher" value="${book.publisher}">

<label for="publisher"><i class="bi bi-building me-2"></i>Publisher</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="number" class="form-control" id="numberOfPages" name="numberOfPages" placeholder="Pages" value="${book.availableCopies}" readonly="readonly">

<label for="pages"><i class="bi bi-file-text me-2"></i>Number of Pages</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<input type="number" class="form-control" id="numberofcopies" name="numberofcopies" placeholder="Copies" min="1" value="${book.totalCopies}">

<label for="copies"><i class="bi bi-stack me-2"></i>Number of Copies</label>

</div>

</div>

</div>



<div class="form-actions">

<button type="submit" class="btn-modern">

<i class="bi bi-save"></i>Update Book

</button>

</div>

</form>

</div>

</main>

</div>

</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>

</body>

</html>

                    Update Button

Step 1. Update the data that was clicked on the edit button to open:-

/webapp/jsp/editBook.jsp


<form action="BookController" method="post">

<input type="hidden" name="action" value="updateBook">

<input type="hidden" name="bookId" value="${book.bookID}">


/lms/controller/BookController.java


else if("updateBook".equalsIgnoreCase(action)) {

String bookTitle = request.getParameter("bookTitle");

String author = request.getParameter("author");

String isbn = request.getParameter("isbn");

String category = request.getParameter("category");

String publisher = request.getParameter("publisher");

String numberofcopies = request.getParameter("numberofcopies");

String availableCopies = request.getParameter("numberOfPages");

long bookId = Integer.parseInt(request.getParameter("bookId"));

Book book = new Book();

book.setTitle(bookTitle);

book.setAuthor(author);

book.setCategory(category);

book.setIsbn(isbn);

book.setPublisher(publisher);

book.setTotalCopies(Integer.parseInt(numberofcopies));

book.setBookID(bookId);

BookService bookService = new BookServiceImpl();

boolean updatedFlag = bookService.updateBook(book);

if(updatedFlag) {

book.setAvailableCopies(Integer.parseInt(availableCopies));

request.setAttribute("book", book);

request.setAttribute("successMessage", "Book updated successfully.!!");

RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/editBook.jsp");

dispatcher.forward(request, response);

}else {

request.setAttribute("errorMessage", "Some thing went wrong.!!");


RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editBook.jsp");

dispacher.forward(request, response);

}

}



/com/lms/service/BookService.java


package com.lms.service; import java.util.List; import com.lms.pojo.Book; public interface BookService { public boolean updateBook(Book book); }


/com/lms/service/BookServiceImpl.java


package com.lms.servicelmpl;


import java.util.List;


import com.lms.dao.BookDao;

import com.lms.daoImpl.BookDaoImpl;

import com.lms.pojo.Book;

import com.lms.service.BookService;


public class BookServiceImpl implements BookService{


BookDao bookDao = new BookDaoImpl();


@Override

public boolean updateBook(Book book) {

// TODO Auto-generated method stub

return bookDao.updateBook(book);

}



}


/lms/daoImpl/BookDao.java

public interface BookDao {

public boolean updateBook(Book book);


}


/lms/daoImpl/BookDaoImpl.java


@Override

public boolean updateBook(Book book) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

// String sql = "update books set title = ?, author = ?, category = ?, isbn = ?, publisher = ?, total_copies=?"

// + " Where book_id = ?";

String sql = "UPDATE books SET title = ?, author = ?, category = ?, isbn = ?, publisher = ?, total_copies = ? "

+ "WHERE book_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setString(1, book.getTitle());

prepareStatement.setString(2, book.getAuthor());

prepareStatement.setString(3, book.getCategory());

prepareStatement.setString(4, book.getIsbn());

prepareStatement.setString(5, book.getPublisher());

prepareStatement.setInt(6, book.getTotalCopies());

prepareStatement.setLong(7, book.getBookID());

int i = prepareStatement.executeUpdate();

if(i > 0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}



                Add USER


Step 1. Set up and configure the HTML page and controller:-


Step 1:- 

/libraryManagementSystem/src/main/webapp/jsp/include/sidebar.jsp

<li class="nav-item"><a class="nav-link ${param.action == 'showAddUser' ? 'active' : ''}"" href="UserController?action=showAddUser"><i class="bi bi-people"></i>Users</a></li>


Step 2:- 


/libraryManagementSystem/src/main/java/com/lms/controller/UserController.java


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String action = request.getParameter("action");

System.out.println("action: " +action);


if("showAddUser".equalsIgnoreCase(action)) {

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/addUser.jsp");

dispacher.forward(request, response);

}

}


Step 3:- Static






/libraryManagementSystem/src/main/webapp/jsp/addUser.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ include file ="include/header.jsp" %>

<style>

.info-card {

background: linear-gradient(135deg, rgba(52, 152, 219, 0.1) 0%, rgba(155, 89, 182, 0.1) 100%);

border: 1px solid rgba(52, 152, 219, 0.2);

border-radius: var(--border-radius);

padding: 1.5rem;

margin-bottom: 2rem;

}


.info-card .icon {

font-size: 2rem;

color: #3498db;

margin-bottom: 1rem;

}


.user-type-card {

border: 2px solid #e9ecef;

border-radius: var(--border-radius);

padding: 1.5rem;

margin-bottom: 1rem;

cursor: pointer;

transition: var(--transition);

background: rgba(255, 255, 255, 0.8);

}


.user-type-card:hover {

border-color: #1ABC9C;

background: rgba(26, 188, 156, 0.05);

transform: translateY(-2px);

box-shadow: var(--card-shadow);

}


.user-type-card.selected {

border-color: #1ABC9C;

background: rgba(26, 188, 156, 0.1);

box-shadow: var(--card-shadow);

}


.user-type-card .icon {

font-size: 2.5rem;

margin-bottom: 1rem;

}


.user-type-card h6 {

margin-bottom: 0.5rem;

color: #2c3e50;

}


.user-type-card p {

font-size: 0.9rem;

color: #6c757d;

margin-bottom: 0;

}

</style>

</head>

<body>


<div class="container-fluid">

<div class="row">

<!-- Sidebar -->

<%@ include file ="include/sidebar.jsp" %>


<!-- Main content -->

<main class="col-md-9 ms-sm-auto col-lg-10">

<div class="page-header">

<h1 class="h2"><i class="bi bi-person-plus me-2"></i>Add New User</h1>

</div>


<!-- Info Card -->

<!-- <div class="info-card">

<div class="icon">

<i class="bi bi-info-circle"></i>

</div>

<h5>User Registration</h5>

<p class="mb-0">Register new library members and staff. Choose the appropriate user type and fill in the required information to create a new account.</p>

</div> -->


<!-- User Type Selection -->

<div class="form-container">

<form id="userForm">

<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="firstName" name="firstName" placeholder="First Name">

<label for="firstName"><i class="bi bi-person me-2"></i>First Name</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="lastName" name="lastName" placeholder="Last Name">

<label for="lastName"><i class="bi bi-person me-2"></i>Last Name</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="email" class="form-control" id="email" name="email" placeholder="Email">

<label for="email"><i class="bi bi-envelope me-2"></i>Email Address</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<input type="tel" class="form-control" id="phone" name="phone" placeholder="Phone">

<label for="phone"><i class="bi bi-telephone me-2"></i>Phone Number</label>

</div>

</div>

</div>


<div class="form-floating">

<textarea class="form-control" id="address" name="address" placeholder="Address"></textarea>

<label for="address"><i class="bi bi-geo-alt me-2"></i>Address</label>

</div>


<div class="form-actions">

<button type="submit" class="btn-modern">

<i class="bi bi-person-plus"></i>Create User

</button>

</div>

</form>

</div>

</main>


</div>

</div>


Step 2. Created the user and put the data inside the database:-

Step 1: Created the Dao Interface.

/libraryManagementSystem/src/main/java/com/lms/dao/UserDao.java

package com.lms.dao;


import com.lms.pojo.User;


public interface UserDao {

public User checkLogin(String username, String password);

public boolean addUser(User user);


}


Step 2: Implement the DAO interface.

/libraryManagementSystem/src/main/java/com/lms/daoImpl/BookDaoImpl.java

@Override

public boolean addUser(User user) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "INSERT INTO Users(first_name, last_name, email, password, role, phone_no, address, created_at)"

+" VALUES(?,?,?,?,?,?,?,?)";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

//Get the data Form input(user)

prepareStatement.setString(1, user.getFirstName());

prepareStatement.setString(2, user.getLastName());

prepareStatement.setString(3, user.getEmail());

prepareStatement.setString(4, user.getPassword());

prepareStatement.setString(5, user.getRole());

prepareStatement.setString(6, user.getPhoneNo());

prepareStatement.setString(7, user.getAddress());

java.sql.Date sqlDate = new java.sql.Date(user.getCreatedAt().getTime());

prepareStatement.setDate(8, sqlDate);

int i = prepareStatement.executeUpdate();

if(i>0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}


Step 3: Created the DAO interface.

/libraryManagementSystem/src/main/java/com/lms/service/UserService.java

package com.lms.service;


import com.lms.pojo.User;


public interface UserService {

public User checkLogin(String username, String password);

public boolean addUser(User user);

}


Step 4: Implement the DAO interface.

/libraryManagementSystem/src/main/java/com/lms/servicelmpl/UserServiceImpl.java

public class UserServiceImpl implements UserService{


UserDao userDao = new UserDaolmpl();

@Override

public User checkLogin(String username, String password) {

return userDao.checkLogin(username, password);

}


@Override

public boolean addUser(User user) {

// TODO Auto-generated method stub

return userDao.addUser(user);

}


}


Step 5: Controller.

/libraryManagementSystem/src/main/java/com/lms/controller/UserController.java

else if("addUser".equalsIgnoreCase(action)) {

String firstName = request.getParameter("firstName"); // input name in html

String lastName = request.getParameter("lastName");

String email = request.getParameter("email");

String phoneNo = request.getParameter("phone");

String address = request.getParameter("address");

User user = new User();

user.setFirstName(firstName); //set name above

user.setLastName(lastName);

user.setEmail(email);

user.setPhoneNo(phoneNo);

user.setAddress(address);

user.setRole("USER");

String randomPass = UUID.randomUUID().toString().replace("-", "").substring(0, 8);

user.setPassword(randomPass);

user.setCreatedAt(new Date());

UserService userService = new UserServiceImpl();

boolean addFlag = userService.addUser(user);

if(addFlag) {

System.out.println("User Added");

}

else {

request.setAttribute("errorMessage", "Some thing went wrong.!!");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editBook.jsp");

dispacher.forward(request, response);

}

}


Output


                 Display User


Step 1: Controller. (after creating the user, all users show )

/libraryManagementSystem/src/main/java/com/lms/controller/UserController.java

UserService userService = new UserServiceImpl();

boolean addFlag = userService.addUser(user);

if(addFlag) {

List<User> userlist = new ArrayList<>();

userlist = userService.getAllUserList();

if(userlist != null && userlist.size() > 0) {

//System.out.println("User Added");

request.setAttribute("userlist", userlist); //send the data on bookList page.

request.setAttribute("successMessage", "User added successfully!!");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/userList.jsp");

dispacher.forward(request, response);

}else {

request.setAttribute("errorMessage", "Some thing went wrong.!!");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editUser.jsp");

dispacher.forward(request, response);

}

}

else {

request.setAttribute("errorMessage", "Some thing went wrong.!!");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editUser.jsp");

dispacher.forward(request, response);

}


Step 2: Display the user when clicking on User.



<li class="nav-item"><a class="nav-link ${param.action == 'showAddUser' ? 'active' : ''}" href="UserController?action=showAddUser"><i class="bi bi-person-plus"></i>Add User</a></li>


/libraryManagementSystem/src/main/java/com/lms/controller/UserController.java


Step 3: Display the user when clicking on User.

else if("allUserList".equalsIgnoreCase(action)) {

List<User> userlist = new ArrayList<>();

UserService userService = new UserServiceImpl();

userlist = userService.getAllUserList();

//System.out.println("User Added");

request.setAttribute("userlist", userlist); //send the data on bookList page.

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/userList.jsp");

dispacher.forward(request, response);

}


                

               Debug User List

/libraryManagementSystem/src/main/java/com/lms/controller/UserController.java


Step 1: Display the user when clicking on User.

else if("allUserList".equalsIgnoreCase(action)) {

List<User> userlist = new ArrayList<>();

UserService userService = new UserServiceImpl();

userlist = userService.getAllUserList();


request.setAttribute("userlist", userlist); //send the data on bookList page.


                            System.out.println(userlist);


RequestDispatcher dispacher = request.getRequestDispatcher("jsp/userList.jsp");

dispacher.forward(request, response);

}

Output:-

        [com.lms.pojo.User@1b0e37e, com.lms.pojo.User@72be572d, com.lms.pojo.User@52f27048]


Step 2: We need to clean the output for the added toString.



/libraryManagementSystem/src/main/java/com/lms/pojo/User.java


@Override

public String toString() {

return "User [userId=" + userId + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email

+ ", password=" + password + ", role=" + role + ", phoneNo=" + phoneNo + ", address=" + address

+ ", createdAt=" + createdAt + "]";

}

Output:-

[User [userId=7, firstName=test3, lastName=test, email=test@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null],

User [userId=4, firstName=Lakhan 2, lastName=thakur, email=test2@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null],

User [userId=3, firstName=Lakhan, lastName=Thakur, email=lakhnt99@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null]]


                 User Edit Button

Step 1: When you click the edit button showing the URL.

Step 2: Now, we have created the Controller route.

http://localhost:8080/libraryManagementSystem/UserController?action=viewUser&userId=7

-> Get the user ID from the URL.
long userId = Integer.parseInt(request.getParameter("userId"));

-> Print the userId.

System.out.println(userId);

->Added the jsp page named editUser.jsp


else if("viewBook".equalsIgnoreCase(action)) {

long userId = Integer.parseInt(request.getParameter("userId"));

System.out.println(userId);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editUser.jsp");

dispacher.forward(request, response);

}


After adding the code, click on the edit button.


output:-

Step 3: Now, work on the editUser.jsp page fetch the data from the database and shows it using Id.

                                        Fetch User Data


1:- Create one method inside the DAO interface.

public interface UserDao {

public User getUserById(long userId);


}


2:- Build the logic inside the DAO implementation.


@Override

public User getUserById(long userId) {

// TODO Auto-generated method stub

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "Select * from user where user_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setLong(1, userId);

rs = prepareStatement.executeQuery();

while(rs.next()) {

User user = new User();

user.setUserId(rs.getLong("user_id"));

user.setFirstName(rs.getString("first_name"));

user.setLastName(rs.getString("email"));

user.setEmail(rs.getString("phone_no"));

user.setAddress(rs.getString("address"));

user.setRole(rs.getString("role"));

//added the list in the array

System.out.println(user);

return user;

}

} catch (Exception e) {

e.printStackTrace();

}


2:- Now we have to pass the data though the services.


->Create one method inside the Service interface.


public interface UserService {

public User getUserById(long userId);

}


->pass the method to controller.


import java.util.List; import com.lms.dao.UserDao; import com.lms.daoImpl.UserDaolmpl; import com.lms.pojo.User; import com.lms.service.UserService; public class UserServiceImpl implements UserService{ UserDao userDao = new UserDaolmpl(); @Override public User getUserById(long userId) { // TODO Auto-generated method stub return userDao.getUserById(userId); } }


3:- Get the user data inside the controller code.

else if("viewUser".equalsIgnoreCase(action)) {

long userId = Integer.parseInt(request.getParameter("userId"));

//System.out.println(userId);

UserService userService = new UserServiceImpl();

User user = userService.getUserById(userId);

System.out.println(user);

//RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editUser.jsp");

//dispacher.forward(request, response);

}

Output:-

                                 Pass User Data in HTML


Step 3: Pass data through the controller.

else if("viewUser".equalsIgnoreCase(action)) {

long userId = Integer.parseInt(request.getParameter("userId"));

//System.out.println(userId);

UserService userService = new UserServiceImpl();

User user = userService.getUserById(userId);

if(user != null) {

request.setAttribute("user", user);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editUser.jsp");

dispacher.forward(request, response);

}

System.out.println(user);

}

output:-




Step 4: Now editUser.jsp page.





<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ include file ="include/header.jsp" %>

<body>



<div class="container-fluid">

<div class="row">

<!-- Sidebar -->

<%@ include file ="include/sidebar.jsp" %>


<!-- Main content -->

<main class="col-md-9 ms-sm-auto col-lg-10">

<div class="page-header">

<h1 class="h2"><i class="bi bi-person-fill me-2"></i>Edit User</h1>

</div>

<c:if test="${not empty errorMessage}">

<div class="alert alert-danger alert-dismissible fade show" role="alert">

<c:out value="${errorMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>

<c:if test="${not empty successMessage}">

<div class="alert alert-success alert-dismissible fade show" role="alert">

<c:out value="${successMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>


<div class="form-container">

<form action="BookController" method="post">

<input type="hidden" name="action" value="userBook">

<input type="hidden" name="bookId" value="${user.userId}">

<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="firstName" placeholder="First Name" value="${user.firstName}">

<label for="firstName"><i class="bi bi-person me-2"></i>First Name</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<input type="text" class="form-control" id="lastName" placeholder="Last Name" value="${user.lastName}">

<label for="lastName"><i class="bi bi-person me-2"></i>Last Name</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="email" class="form-control" id="email" placeholder="Email" value="${user.email}">

<label for="email"><i class="bi bi-envelope me-2"></i>Email Address</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<input type="tel" class="form-control" id="phone" placeholder="Phone" value="${book.phoneNo}">

<label for="phone"><i class="bi bi-telephone me-2"></i>Phone Number</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<select class="form-select" id="userRole">

<option value="USER" <c:if test="${user.role == 'USER' }"> selected </c:if>>User</option>

<option value="member" <c:if test="${user.role == 'member' }"> selected </c:if>>Library Member</option>

<option value="librarian" <c:if test="${user.role == 'librarian' }"> selected </c:if>>Librarian</option>

<option value="admin" <c:if test="${user.role == 'admin' }"> selected </c:if>>Administrator</option>

</select>

<label for="userRole"><i class="bi bi-person-check me-2"></i>User Role</label>

</div>

</div>

</div>


<div class="form-floating">

<textarea class="form-control" id="address" placeholder="Address">${user.address}</textarea>

<label for="address"><i class="bi bi-geo-alt me-2"></i>Address</label>

</div>



<div class="form-actions">

<button type="submit" class="btn-modern">

<i class="bi bi-save"></i>Update User

</button>

</div>

</form>

</div>

</main>


</div>

</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>

</body>

</html> output:-



             Update User Button

Step 1. Update the data that was clicked on the update button :-

1. /src/main/java/com/lms/controller/UserController.java

else if("updateUser".equalsIgnoreCase(action)) {

String firstName = request.getParameter("firstName");

String lastName = request.getParameter("lastName");

String email = request.getParameter("email");

String phone = request.getParameter("phone");

String userRole = request.getParameter("userRole");

String address = request.getParameter("address");


long userId = Integer.parseInt(request.getParameter("userId"));

User user = new User();

user.setFirstName(firstName);

user.setLastName(lastName);

user.setEmail(email);

user.setPhoneNo(phone);

user.setRole(userRole);

user.setAddress(address);

user.setUserId(userId);

UserService userService = new UserServiceImpl();

boolean updatedFlag = userService.updateUser(user);

if(updatedFlag) {

request.setAttribute("user", user);

request.setAttribute("successMessage", "User updated successfully.!!");

RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/editUser.jsp");

dispatcher.forward(request, response);

}else {

request.setAttribute("errorMessage", "Some thing went wrong.!!");


RequestDispatcher dispacher = request.getRequestDispatcher("jsp/editUser.jsp");

dispacher.forward(request, response);

}

}

else {

System.out.println("No action found");

}



2. /src/main/java/com/lms/daoImpl/UserDaolmpl.java



@Overrideb

public boolean updateUser(User user) {

// TODO Auto-generated method stub2.

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

// String sql = "update books set title = ?, author = ?, category = ?, isbn = ?, publisher = ?, total_copies=?"

// + " Where book_id = ?";

String sql = "UPDATE Users SET first_name = ?, last_name = ?, email = ?, role = ?, phone_no = ?, address = ? "

+ "WHERE user_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setString(1, user.getFirstName());

prepareStatement.setString(2, user.getLastName());

prepareStatement.setString(3, user.getEmail());

prepareStatement.setString(4, user.getRole());

prepareStatement.setString(5, user.getPhoneNo());

prepareStatement.setString(6, user.getAddress());

prepareStatement.setLong(7, user.getUserId());

int i = prepareStatement.executeUpdate();

if(i > 0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

             Assign Book

Now, we are going to create a Controller route to open a static page.




Step 1:- Now we are going to create a JSP static page, assignBook.jsp

Step 2:- Configure the menu route.


<a class="nav-link ${param.action == 'showAssignBook' ? 'active' : ''}"" href="BookController?action=showAssignBook">Assign Book</a></li>

c

//Show Assign Book

else if("showAssignBook".equalsIgnoreCase(action)) {

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/assignBook.jsp");

dispacher.forward(request, response);

}

else {

System.out.println("No action found");

}

output:-


Now, we are going to get the dynamic data from the database inside the from and assignBook.jsp page.

Step 2:- Pass the user and book dropdown form controller.


Controller logic:- 

//Show Assign Book

else if("showAssignBook".equalsIgnoreCase(action)) {

UserService userService = new UserServiceImpl();

BookService bookService = new BookServiceImpl();

List<Book> bookList = new ArrayList<>();

bookList = bookService.getAllBookList();

List<User> userList = new ArrayList<>();

userList = userService.getAllUserList();

//debug

System.out.println(userList);

System.out.println(bookList);

if(bookList != null && bookList.size() > 0 && userList !=null && userList.size() > 0) {

request.setAttribute("bookList", bookList);

request.setAttribute("userList", userList);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/assignBook.jsp");

dispacher.forward(request, response);

}

else {

request.setAttribute("errorMessage", "Either book or user not available. Please try again.");

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/assignBook.jsp");

dispacher.forward(request, response);

}

}



assigBook.jsp


<main class="col-md-9 ms-sm-auto col-lg-10">

<div class="page-header">

<h1 class="h2"><i class="bi bi-arrow-right-circle me-2"></i>Assign Book to Member</h1>

</div>

<c:if test="${not empty errorMessage}">

<div class="alert alert-danger alert-dismissible fade show" role="alert">

<c:out value="${errorMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>

<c:if test="${not empty successMessage}">

<div class="alert alert-success alert-dismissible fade show" role="alert">

<c:out value="${successMessage}"/>

<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>

</c:if>


<!-- Info Card -->

<!-- <div class="info-card">

<div class="icon">

<i class="bi bi-info-circle"></i>

</div>

</div> -->


<div class="form-container">

<form action="BookController" method="post">

<input type="hidden" name="action" value="assignBook">

<div class="row">

<div class="col-md-6">

<div class="form-floating">

<!-- <select class="form-select" id="selectBook">

<option value="" selected disabled>Choose a book</option>

<option value="1">The Great Gatsby - F. Scott Fitzgerald</option>

<option value="2">Clean Code - Robert C. Martin</option>

<option value="3">A Brief History of Time - Stephen Hawking</option>

<option value="4">To Kill a Mockingbird - Harper Lee</option>

<option value="5">1984 - George Orwell</option>

</select> -->

<select class="form-select" id="bookId" name="bookId">

<option value="" selected disabled>Choose a book</option>

<c:choose>

<c:when test="${not empty bookList}">

<c:forEach var="book" items="${bookList}" varStatus="status">

<option value="${book.bookID}">

<c:out value="${book.title}" /> - <c:out value="${book.author}" /> (Available - <c:out value="${book.availableCopies}" /> )

</option>

</c:forEach>

</c:when>

</c:choose>

</select>

<label for="selectBook"><i class="bi bi-book-fill me-2"></i>Select Book</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<!-- <select class="form-select" id="selectMember">

<option value="" selected disabled>Choose a member</option>

<option value="1">John Doe - john@example.com</option>

<option value="2">Jane Smith - jane@example.com</option>

<option value="3">Michael Brown - michael@example.com</option>

<option value="4">Sarah Johnson - sarah@example.com</option>

<option value="5">David Wilson - david@example.com</option>

</select> -->

<select class="form-select" id="userId" name="userId">

<option value="" selected disabled>Choose a member</option>

<!--<option value="1">John Doe - john@example.com</option>-->

<c:forEach var="user" items="${userList}">

<option value="${user.userId}">

<c:out value="${user.firstName}" /> <c:out value="${user.lastName}" /> - <c:out value="${user.email}" />

</option>

</c:forEach>

</select>

<label for="selectMember"><i class="bi bi-person-fill me-2"></i>Select Member</label>

</div>

</div>

</div>


<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="date" class="form-control" id="dueDate" name="dueDate">

<label for="dueDate"><i class="bi bi-calendar-event me-2"></i>Due Date</label>

</div>

</div>

</div>


<div class="form-floating">

<textarea class="form-control" id="assignmentNotes" name="assignmentNotes" placeholder="Notes"></textarea>

<label for="notes"><i class="bi bi-card-text me-2"></i>Assignment Notes (Optional)</label>

</div>


<div class="form-actions">

<button type="submit" class="btn-modern">

<i class="bi bi-check-circle"></i>Assign Book

</button>

</div>

</form>

</div>

</main>

</div>

</div>


Step 3:- Array and object data print.



Object Print:-

[Book{bookID=40, title='1984', author='George Orwell', category='mystery', isbn='ISBN0005', publisher='User', totalCopies=8, availableCopies=10, status='Available'}, Book{bookID=39, title='To Kill a Mockingbird', author='Harper Lee', category='biography', isbn='ISBN0004', publisher='USER', totalCopies=2, availableCopies=10, status='Available'}, Book{bookID=38, title='A Brief History of Time', author='Stephen Hawking', category='history', isbn='ISBN0003', publisher='ADMIN', totalCopies=2, availableCopies=10, status='Available'}, Book{bookID=37, title='Clean Code', author='Robert C. Martin', category='technology', isbn='ISBN0002', publisher='USER', totalCopies=4, availableCopies=10, status='Available'}, Book{bookID=36, title='The Great Gatsby', author='F. Scott Fitzgerald', category='science', isbn='ISBN0001', publisher='USER', totalCopies=3, availableCopies=5, status='Available'}]




Array Print:-

[User [userId=12, firstName=Lucky, lastName=Thakur, email=Lucky.thakur@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null], User [userId=7, firstName=Me, lastName=test@gmail.com, email=sads@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null], User [userId=4, firstName=Lakhan 2, lastName=thakur, email=test2@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null], User [userId=3, firstName=Lakhan, lastName=Thakur, email=lakhnt99@gmail.com, password=null, role=USER, phoneNo=null, address=null, createdAt=null]]



available
Step 4: Hide the book that is not available.




/src/main/java/com/lms/servicelmpl/BookServiceImpl.java


@Override

public List<Book> getAllAvailableBookList() { //dao impletation BookDaoImp

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

ArrayList<Book> bookList = new ArrayList<>();//new array initialization

try {

String sql = "Select * from books where available_copies > 0";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

rs = prepareStatement.executeQuery();

while(rs.next()) {

Book book = new Book();

book.setBookID(rs.getLong("book_id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setCategory(rs.getString("category"));

book.setIsbn(rs.getString("isbn"));

book.setPublisher(rs.getString("publisher"));

book.setTotalCopies(rs.getInt("total_copies"));

book.setAvailableCopies(rs.getInt("available_copies"));

book.setStatus(rs.getString("status"));

//added the list in the array

bookList.add(book);

}

//System.out.println(bookList);

} catch (Exception e) {

e.printStackTrace();

}finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return bookList;

}

            Assign Book Button

Now we are going to click on the assign button, then we have to 

follows some steps which are.


-> Created the table inside the DB.
-> Also, we need to create one pogo (encapsulation concept) getter and setter.
->We need to create a DAO  as well as a book Service.


Step 1: Created the table inside the library_db.

CREATE TABLE IF NOT EXISTS book_issued (
issue_id INT AUTO_INCREMENT PRIMARY KEY,
    book_id INT NOT NULL,
    user_id INT NOT NULL,
    issue_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    due_date TIMESTAMP NULL,
    return_date TIMESTAMP NULL,
    status VARCHAR(20) NOT NULL,
    book_condition VARCHAR(1024),
    assignment_notes VARCHAR(1024),
    return_notes VARCHAR(1024),
    CONSTRAINT fk_book FOREIGN KEY (book_id) REFERENCES books(book_id),
    CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(user_id)
);

Step 2: Created the getter and setter for set the data into the database.


/libraryManagementSystem/src/main/java/com/lms/pojo/BookIssued.java

package com.lms.pojo;

import java.time.LocalDate;
import java.util.Date;

public class BookIssued {
private int issueId;
    private Book book;
    private User user;
    private Date issueDate;
    private LocalDate dueDate;
    private LocalDate returnDate;
    private String status;
    private String bookCondition;
    private String assignmentNotes; 
    private String returnNotes;
    
public int getIssueId() {
return issueId;
}
public void setIssueId(int issueId) {
this.issueId = issueId;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Date getIssueDate() {
return issueDate;
}
public void setIssueDate(Date issueDate) {
this.issueDate = issueDate;
}
public LocalDate getDueDate() {
return dueDate;
}
public void setDueDate(LocalDate dueDate) {
this.dueDate = dueDate;
}
public LocalDate getReturnDate() {
return returnDate;
}
public void setReturnDate(LocalDate returnDate) {
this.returnDate = returnDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getBookCondition() {
return bookCondition;
}
public void setBookCondition(String bookCondition) {
this.bookCondition = bookCondition;
}
public String getAssignmentNotes() {
return assignmentNotes;
}
public void setAssignmentNotes(String assignmentNotes) {
this.assignmentNotes = assignmentNotes;
}
public String getReturnNotes() {
return returnNotes;
}
public void setReturnNotes(String returnNotes) {
this.returnNotes = returnNotes;
}
@Override
public String toString() {
return "BookIssued [issueId=" + issueId + ", book=" + book + ", user=" + user + ", issueDate=" + issueDate
+ ", dueDate=" + dueDate + ", returnDate=" + returnDate + ", status=" + status + ", bookCondition="
+ bookCondition + ", assignmentNotes=" + assignmentNotes + ", returnNotes=" + returnNotes + "]";

}
Step 3: Code to assign the book and update the book count.



/libraryManagementSystem/src/main/java/com/lms/dao/BookDao.java



package com.lms.dao;


import java.util.List;


import com.lms.pojo.Book;

import com.lms.pojo.BookIssued;


public interface BookDao {

public boolean addBook(Book book);

public boolean updateBook(Book book);

public List<Book> getAllBookList();

public List<Book> getAllBookByStatus(String status);

public Book getBookById(long bookId);

public List<Book> getAllAvailableBookList();

public boolean assignBook(BookIssued bookIssued);

public boolean updateAvailableBook(long bookId, int availableCopies);


}


/libraryManagementSystem/src/main/java/com/lms/daoImpl/BookDaoImpl.java


@Override

public boolean assignBook(BookIssued bookIssued) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "INSERT INTO book_issued(book_id, user_id, issue_date, due_date, status, assignment_notes )"

+" VALUES(?,?,?,?,?,?)";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setLong(1, bookIssued.getBook().getBookID());

prepareStatement.setLong(2, bookIssued.getUser().getUserId());

Date sqlIssueDate = new Date(bookIssued.getIssueDate().getTime());

prepareStatement.setDate(3, sqlIssueDate);

prepareStatement.setDate(4, Date.valueOf(bookIssued.getDueDate()));

prepareStatement.setString(5, bookIssued.getStatus());

prepareStatement.setString(6, bookIssued.getAssignmentNotes());

int i = prepareStatement.executeUpdate();

if(i>0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}


@Override

public boolean updateAvailableBook(long bookId, int availableCopies) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "UPDATE books SET available_copies = ? WHERE book_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setInt(1, availableCopies);

prepareStatement.setLong(2, bookId);

int i = prepareStatement.executeUpdate();

if(i > 0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}


/src/main/java/com/lms/service/BookService.java


@Override

public interface BookService {

public boolean addBook(Book book);

public boolean updateBook(Book book);

public List<Book> getAllBookList();

public List<Book> getAllBookByStatus(String status);

public Book getBookById(long bookId);

public boolean assignBook(BookIssued bookIssued);

public List<Book> getAllAvailableBookList();// Service interface BookService.java

}


/libraryManagementSystem/src/main/java/com/lms/servicelmpl/BookServiceImpl.java

@Override

public boolean assignBook(BookIssued bookIssued) {

bookIssued.setIssueDate(new Date());

bookIssued.setStatus("ISSUED");

boolean assignFlag = false;

Book book = bookDao.getBookById(bookIssued.getBook().getBookID());

if(book != null) {

int availableCopies = book.getAvailableCopies() - 1;

boolean updateflag = bookDao.updateAvailableBook(bookIssued.getBook().getBookID(), availableCopies);

if(updateflag) {

assignFlag = bookDao.assignBook(bookIssued);

if(!assignFlag) {

Book book1 = bookDao.getBookById(bookIssued.getBook().getBookID());

int newavailableCopies = book.getAvailableCopies() + 1;

bookDao.updateAvailableBook(bookIssued.getBook().getBookID(), availableCopies);

}

}

}

return assignFlag;

}

      

                Return Book


Step 1:- Now we are going to create a JSP static page, assignBook.jsp

Step 2:- Configure the menu route.


<a class="nav-link ${(param.action == 'showReturnBook') || (param.action == 'showReturnBook') ? 'active' : ''}"
href="BookController?action=showReturnBook"><i class="bi bi-arrow-left-circle"></i>Return Book</a>

//Show Assign Book

else if("showReturnBook".equalsIgnoreCase(action)) {

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/returnBook.jsp");

dispacher.forward(request, response);

}

else {

System.out.println("No action found");

}

output:-


Now, we are going to get the dynamic data from the database inside.



1. /src/main/java/com/lms/controller/UserController.java

else if("showReturnBook".equalsIgnoreCase(action)) {

BookService bookService = new BookServiceImpl();

List<BookIssued> issuedList = bookService.getAllIssuedBookList();

System.out.println(issuedList);

if(issuedList != null && issuedList.size() > 0) {

LocalDate today = LocalDate.now();

for(BookIssued bookIssued : issuedList ) {

LocalDate dueDate = bookIssued.getDueDate();

if(dueDate.isBefore(today)) {

bookIssued.setDueDayStatus("Overdue");

}

else if(dueDate.isEqual(today)) {

bookIssued.setDueDayStatus("Due Today");

}

else {

bookIssued.setDueDayStatus("On Time");

}

}

request.setAttribute("issuedList", issuedList);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/returnBook.jsp");

dispacher.forward(request, response);

}

}

2. /src/main/java/com/lms/dao/BookDao.java

public interface BookDao {

//Return book

public List<BookIssued> getAllIssuedBookList();


}

3. src/main/java/com/lms/daoImpl/BookDaoImpl.java

@Override

public List<BookIssued> getAllIssuedBookList() {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

List<BookIssued> issuedList = new ArrayList<>();

try {

String sql = "SELECT bi.issue_id, bi.book_id, bi.user_id, bi.issue_date, bi.due_date, bi.return_date, bi.status, "

+ "bi.book_condition, bi.assignment_notes, bi.return_notes, "

+ "u.first_name, u.last_name, u.email, u.address, u.phone_no, "

+ "b.title, b.author, b.category, b.isbn, b.publisher, b.total_copies, b.available_copies "

+ "FROM book_issued bi "

+ "JOIN books b ON bi.book_id = b.book_id "

+ "JOIN users u ON bi.user_id = u.user_id";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

rs = prepareStatement.executeQuery();

if(rs.next()) {

issuedList.add(mapIssuedRecord(rs));

}

}catch(Exception e) {

e.printStackTrace();

}

return issuedList;

}


private BookIssued mapIssuedRecord(ResultSet rs) throws SQLException{

// System.out.println(rs);

BookIssued bookIssued = new BookIssued();

bookIssued.setIssueId(rs.getInt("Issue_id"));

bookIssued.setIssueDate(rs.getDate("issue_date"));

bookIssued.setDueDate(rs.getDate("due_date").toLocalDate());

//bookIssued.setReturnDate(rs.getDate("return_date").toLocalDate());

bookIssued.setStatus(rs.getString("status"));

bookIssued.setBookCondition(rs.getString("book_condition"));;

bookIssued.setAssignmentNotes(rs.getString("assignment_notes"));

bookIssued.setReturnNotes(rs.getString("return_notes"));

Book book = new Book();

book.setBookID(rs.getLong("book_id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setCategory(rs.getString("category"));

book.setIsbn(rs.getString("isbn"));

book.setPublisher(rs.getString("publisher"));

book.setTotalCopies(rs.getInt("total_copies"));

book.setAvailableCopies(rs.getInt("available_copies"));

bookIssued.setBook(book);

User user = new User();

user.setFirstName(rs.getString("first_name"));

user.setLastName(rs.getString("last_name"));

user.setEmail(rs.getString("email"));

user.setAddress(rs.getString("address"));

user.setPhoneNo(rs.getString("phone_no"));

bookIssued.setUser(user);

return bookIssued;

}

4. /src/main/java/com/lms/service/BookService.javaa

public interface BookDao {

//Return book

public List<BookIssued> getAllIssuedBookList();


}


5. /src/main/java/com/lms/servicelmpl/BookServiceImpl.java

@Override

public List<BookIssued> getAllIssuedBookList() {

// TODO Auto-generated method stub

return bookDao.getAllIssuedBookList();

}



6. /src/main/webapp/jsp/returnBook.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:choose>

<c:when test="${not empty issuedList}">

<div class="table-container">

<div class="table-responsive">

<table class="table table-hover align-middle">

<thead>

<tr>

<th>#</th>

<th>Book</th>

<th>Member</th>

<th>Issued On</th>

<th>Due Date</th>

<th>Status</th>

<th>Action</th>

</tr>

</thead>

<tbody>

<c:forEach var="bookIssue" items="${issuedList}" varStatus="status">

<tr>

<td><span class="badge bg-primary">${status.index + 1 }</span></td>

<td>

<strong><c:out value="${bookIssue.book.title}" /></strong>

<div class="text-muted small">ISBN: <code><c:out value="${bookIssue.book.isbn}" /></code></div>

</td>

<td>

<div><c:out value="${bookIssue.user.firstName}" /> <c:out value="${bookIssue.user.lastName}" /></div>

<div class="text-muted small"><c:out value="${bookIssue.user.email}" /></div>

</td>

<td><c:out value="${bookIssue.issueDate}" /></td>

<td><c:out value="${bookIssue.dueDate}" /></td>

<td><span class="badge ${bookIssue.dueDayStatus == 'Overdue' ? 'bg-danger' : bookIssue.dueDayStatus == 'Due Today' ? 'bg-warning text-dark' : 'bg-success'} "><c:out value="${bookIssue.dueDayStatus}" /></span></td>

<td>

<a href="show_return_book_detail.html" class="btn btn-sm btn-outline-primary">

<i class="bi bi-arrow-return-left me-1"></i>Return

</a>

</td>

</tr>

</c:forEach>

                </c:when>

<c:otherwise>

<h6>No Data Found</h6>

</c:otherwise>

</c:choose>



   Set variable to pass the data Book





1. /src/main/java/com/lms/pojo/BookIssued.java

private String DueDayStatus;

public String getDueDayStatus() {

return DueDayStatus;

}

public void setDueDayStatus(String dueDayStatus) {

DueDayStatus = dueDayStatus;

}


2. /src/main/java/com/lms/controller/UserController.java

else if("showReturnBook".equalsIgnoreCase(action)) {

BookService bookService = new BookServiceImpl();

List<BookIssued> issuedList = bookService.getAllIssuedBookList();

System.out.println(issuedList);

if(issuedList != null && issuedList.size() > 0) {

LocalDate today = LocalDate.now();

for(BookIssued bookIssued : issuedList ) {

LocalDate dueDate = bookIssued.getDueDate();

if(dueDate.isBefore(today)) {

bookIssued.setDueDayStatus("Overdue");

}

else if(dueDate.isEqual(today)) {

bookIssued.setDueDayStatus("Due Today");

}

else {

bookIssued.setDueDayStatus("On Time");

}

}

request.setAttribute("issuedList", issuedList);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/returnBook.jsp");

dispacher.forward(request, response);

}

}

1. /src/main/webapp/jsp/returnBook.jsp

<td><span class="badge ${bookIssue.dueDayStatus == 'Overdue' ? 'bg-danger' : bookIssue.dueDayStatus == 'Due Today' ? 'bg-warning text-dark' : 'bg-success'} ">

<c:out value="${bookIssue.dueDayStatus}" /></span></td>



            Clikc on Return button



1. /src/main/java/com/lms/controller/UserController.java

else if("showReturnBookDetail".equalsIgnoreCase(action)) {

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/shwoReturnBookDetail.jsp");

dispacher.forward(request, response);

}

2. /src/main/webapp/jsp/returnBook.jsp

<a href="BookController?action=showReturnBookDetail&issuedId=<c:out value="${bookIssue.issueId}" />" class="btn btn-sm btn-outline-primary">

<i class="bi bi-arrow-return-left me-1"></i>Return

</a> Pass the data


1. /src/main/java/com/lms/controller/UserController.java

else if("showReturnBookDetail".equalsIgnoreCase(action)) {

long issuedId = Long.parseLong(request.getParameter("issuedId"));

BookService bookService = new BookServiceImpl();

BookIssued bookIssued = bookService.getIssuedBookById(issuedId);

if(bookIssued != null) {

request.setAttribute("bookIssued", bookIssued);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/showReturnBookDetail.jsp");

dispacher.forward(request, response);

}

}

2. /libraryManagementSystem/src/main/java/com/lms/dao/BookDao.java

public interface BookDao {


//Return book


public BookIssued getIssuedBookById(long issueId);


}

3. /src/main/java/com/lms/dao/BookDaoImpl.java

@Override

public BookIssued getIssuedBookById(long issueId) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "SELECT bi.issue_id, bi.book_id, bi.user_id, bi.issue_date, bi.due_date, bi.return_date, bi.status, "

+ "bi.book_condition, bi.assignment_notes, bi.return_notes, "

+ "b.title, b.author, b.category, b.isbn, b.publisher, b.total_copies, b.available_copies, "

+ "u.first_name, u.last_name, u.email, u.phone_no "

+ "FROM book_issued bi "

+ "JOIN books b ON bi.book_id = b.book_id "

+ "JOIN users u ON bi.user_id = u.user_id "

+ "WHERE bi.issue_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setLong(1, issueId);

rs = prepareStatement.executeQuery();

if(rs.next()) {

return mapIssuedRecord(rs);

}

}catch(Exception e) {

e.printStackTrace();

}

return null;

}


private BookIssued mapIssuedRecord(ResultSet rs) throws SQLException{

// System.out.println(rs);

BookIssued bookIssued = new BookIssued();

bookIssued.setIssueId(rs.getInt("Issue_id"));

bookIssued.setIssueDate(rs.getDate("issue_date"));

bookIssued.setDueDate(rs.getDate("due_date").toLocalDate());

//bookIssued.setReturnDate(rs.getDate("return_date").toLocalDate());

bookIssued.setStatus(rs.getString("status"));

bookIssued.setBookCondition(rs.getString("book_condition"));;

bookIssued.setAssignmentNotes(rs.getString("assignment_notes"));

bookIssued.setReturnNotes(rs.getString("return_notes"));

Book book = new Book();

book.setBookID(rs.getLong("book_id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setCategory(rs.getString("category"));

book.setIsbn(rs.getString("isbn"));

book.setPublisher(rs.getString("publisher"));

book.setTotalCopies(rs.getInt("total_copies"));

book.setAvailableCopies(rs.getInt("available_copies"));

bookIssued.setBook(book);

User user = new User();

user.setFirstName(rs.getString("first_name"));

user.setLastName(rs.getString("last_name"));

user.setEmail(rs.getString("email"));

// user.setAddress(rs.getString("address"));

user.setPhoneNo(rs.getString("phone_no"));

bookIssued.setUser(user);

return bookIssued;

}

4. /src/main/java/com/lms/service/BookService.java


public interface BookService {

public BookIssued getIssuedBookById(long issueId);

}

5. /src/main/java/com/lms/service/BookServiceImpl.java


@Override

public BookIssued getIssuedBookById(long issueId) {

// TODO Auto-generated method stub

return bookDao.getIssuedBookById(issueId);

}


UserController.java

if(bookIssued != null) {

request.setAttribute("bookIssued", bookIssued);

RequestDispatcher dispacher = request.getRequestDispatcher("jsp/showReturnBookDetail.jsp");

dispacher.forward(request, response);



5. /src/main/webapp/jsp/showReturnBookDetail.jsp


<div class="row g-4">

<div class="col-lg-4">

<div class="card shadow-sm h-100">

<div class="card-body">

<div class="d-flex align-items-start justify-content-between mb-3">

<div>

<h5 class="card-title mb-1">${bookIssued.book.title}</h5>

<p class="card-subtitle text-muted">${bookIssued.book.author}</p>

</div>

</div>

<div class="border-top pt-3">

<p class="text-muted text-uppercase small mb-2">Quick Details</p>

<ul class="list-unstyled mb-0">

<li class="mb-2">

<i class="bi bi-hash me-2 text-primary"></i>

ISBN: <code>${bookIssued.book.isbn}</code>

</li>

<li class="mb-2">

<i class="bi bi-calendar-event me-2 text-primary"></i>

Issued on: <strong>${bookIssued.issueDate}</strong>

</li>

<li class="mb-2">

<i class="bi bi-calendar2-check me-2 text-primary"></i>

Due date: <strong>${bookIssued.dueDate}</strong>

</li>

<li class="mb-0">

<i class="bi bi-person me-2 text-primary"></i>

Borrower: <strong>${bookIssued.user.firstName } ${bookIssued.user.lastName }</strong>

</li>

</ul>

</div>

</div>

</div>

</div>

Output:-





Confirm Return button




1. /src/main/webapp/jsp/showReturnBookDetail.jsp


<form action="BookController" method="post">

<input type="hidden" name="action" value="returnBook">

<input type="hidden" name="issuedId" value="${bookIssued.issueId }">

<div class="row">

<div class="col-md-6">

<div class="form-floating">

<input type="date" class="form-control" id="returnDate" name="returnDate">

<label for="returnDate"><i class="bi bi-calendar-check me-2"></i>Return Date</label>

</div>

</div>

<div class="col-md-6">

<div class="form-floating">

<select class="form-select" id="bookCondition" name="bookCondition">

<option value="good" selected>Good</option>

<option value="fair">Fair</option>

<option value="damaged">Damaged</option>

<option value="lost">Lost</option>

</select>

<label for="bookCondition"><i class="bi bi-clipboard-check me-2"></i>Book Condition</label>

</div>

</div>

</div>


<div class="form-floating">

<textarea class="form-control" id="returnNotes" name="returnNotes" placeholder="Return Notes" style="height: 140px;"></textarea>

<label for="returnNotes"><i class="bi bi-card-text me-2"></i>Return Notes</label>

</div>


<div class="alert alert-info d-flex align-items-center" role="alert">

<i class="bi bi-info-circle-fill me-2"></i>

<span>Record any damages or remarks in the notes to keep the member history up to date.</span>

</div>


<div class="form-actions">

<button type="submit" class="btn-modern">

<i class="bi bi-check2-circle"></i>Confirm Return

</button>

</div>

</form>


2. /src/main/java/com/lms/controller/BookController.java


else if("returnBook".equalsIgnoreCase(action)) {

int issueId = Integer.parseInt(request.getParameter("issuedId"));

String returnDate = request.getParameter("returnDate");

String bookCondition = request.getParameter("bookCondition");

String returnNotes = request.getParameter("returnNotes");

BookIssued bookIssued = new BookIssued();

bookIssued.setIssueId(issueId);

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

LocalDate localReturnDate = null;

try {

localReturnDate = LocalDate.parse(returnDate, dateFormatter);

System.out.println("Parse localDueDate: " + localReturnDate);

} catch(DateTimeParseException e) {

System.out.println("Error parseing date: " + e.getMessage());

}

bookIssued.setReturnDate(localReturnDate);

bookIssued.setBookCondition(bookCondition);

bookIssued.setReturnNotes(returnNotes);

BookService bookService = new BookServiceImpl();

boolean flag = bookService.updateBookReturn(bookIssued);

if(flag) {

HttpSession session = request.getSession();

session.setAttribute("successMessage", "Book return successfull!!");

response.sendRedirect("BookController?action=showReturnBook");

}else {

HttpSession session = request.getSession();

session.setAttribute("errorMessage", "Some thing went wrong");

response.sendRedirect("BookController?action=showReturnBook");

}


3./libraryManagementSystem/src/main/java/com/lms/dao/BookDao.java

public interface BookDao {

public boolean addBook(Book book);

public boolean updateBook(Book book);

public List<Book> getAllBookList();

public List<Book> getAllBookByStatus(String status);

public Book getBookById(long bookId);

public List<Book> getAllAvailableBookList();

public boolean assignBook(BookIssued bookIssued);

public boolean updateAvailableBook(long bookId, int availableCopies);

//Return book

public List<BookIssued> getAllIssuedBookList();

public BookIssued getIssuedBookById(long issueId);

public boolean updateBookReturn(BookIssued bookIssued);


}


4. src/main/java/com/lms/daoImpl/BookDaoImpl.java

@Override

public boolean updateBookReturn(BookIssued bookIssued) {

Connection con = null ;

PreparedStatement prepareStatement = null;

ResultSet rs = null;

try {

String sql = "UPDATE book_issued SET return_date = ?, book_condition = ?, return_notes = ?, status = ? WHERE issue_id = ?";

con = DbUtil.createConnection();

prepareStatement = con.prepareStatement(sql);

prepareStatement.setDate(1, Date.valueOf(bookIssued.getReturnDate()));

prepareStatement.setString(2, bookIssued.getBookCondition());

prepareStatement.setString(3, bookIssued.getReturnNotes());

prepareStatement.setString(4, bookIssued.getStatus());

prepareStatement.setInt(5, bookIssued.getIssueId());

int i = prepareStatement.executeUpdate();

if(i > 0) {

return true;

}

}catch(Exception e) {

e.printStackTrace();

}

finally {

try {

if(rs != null) {

rs.close();

}

if(prepareStatement != null) {

prepareStatement.close();

}

if(con != null) {

con.close();

}

}catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}

5./src/main/java/com/lms/service/BookService.java

public interface BookDao {

public boolean addBook(Book book);

public boolean updateBook(Book book);

public List<Book> getAllBookList();

public List<Book> getAllBookByStatus(String status);

public Book getBookById(long bookId);

public List<Book> getAllAvailableBookList();

public boolean assignBook(BookIssued bookIssued);

public boolean updateAvailableBook(long bookId, int availableCopies);

//Return book

public List<BookIssued> getAllIssuedBookList();

public BookIssued getIssuedBookById(long issueId);

public boolean updateBookReturn(BookIssued bookIssued);


}

5./src/main/java/com/lms/servicelmpl/BookServiceImpl.java

@Override

public boolean updateBookReturn(BookIssued bookIssued) {

// TODO Auto-generated method stub

bookIssued.setStatus("RETURN");

BookIssued bookIssued2 = bookDao.getIssuedBookById(bookIssued.getIssueId());

boolean returnflag = false;

if(bookIssued2 != null) {

int availableCopies = bookIssued2.getBook().getAvailableCopies() + 1;

boolean updateflag = bookDao.updateAvailableBook(bookIssued2.getBook().getBookID(), availableCopies);

if(updateflag) {

returnflag = bookDao.updateBookReturn(bookIssued);

if(!returnflag) {

BookIssued bookIssued3 = bookDao.getIssuedBookById(bookIssued.getIssueId());

int newavailableCopies = bookIssued3.getBook().getAvailableCopies() - 1;

bookDao.updateAvailableBook(bookIssued3.getBook().getBookID(), newavailableCopies);

}

}

}

return returnflag;

}

Output:-






Dashboard









No comments:

Post a Comment

If you have any problem please let me know.