一、项目整体结构

src/
├── com/
│   ├── dao/
│   │   └── BookDao.java
│   ├── entity/
│   │   └── Book.java
│   ├── service/
│   │   └── BookService.java
│   ├── servlet/
│   │   ├── BookServlet.java      // 列表页
│   │   └── BookIdServlet.java    // 详情页
│   └── utils/
│       └── DBUtils.java
└── webapp/
    ├── bookList.jsp  // 图书列表页
    └── detail.jsp    // 图书详情页

二、数据库准备

1. 创建图书表 SQL

CREATE TABLE Book (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '图书ID',
    name VARCHAR(255) NOT NULL COMMENT '书名',
    author VARCHAR(255) NOT NULL COMMENT '作者',
    price DECIMAL(10,2) NOT NULL COMMENT '价格',
    publish VARCHAR(255) NOT NULL COMMENT '出版社'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 插入测试数据
INSERT INTO Book(name, author, price, publish) VALUES
('Java编程思想', '布鲁斯·埃克尔', 108.00, '机械工业出版社'),
('Python编程:从入门到实践', '埃里克·马瑟斯', 59.80, '人民邮电出版社'),
('数据库系统概论', '王珊', 49.50, '高等教育出版社'),
('深入理解计算机系统', '兰德尔·布莱恩特', 128.00, '机械工业出版社'),
('MySQL必知必会', '本·福达', 39.90, '人民邮电出版社');

三、实体类:Book.java

package com.entity;

import lombok.Data;

@Data
public class Book {
    private int id;
    private String name;
    private String author;
    private double price;
    private String publish;
}

四、DAO 层:BookDao.java

package com.dao;

import com.entity.Book;
import com.utils.DBUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BookDao {
    // 查询所有图书信息
    public List<Book> getAllBooks(){
        List<Book> bookList=new ArrayList<Book>();
        Connection con=null;
        Statement stmt=null;
        String sql="select * from Book";
        ResultSet rs=null;
        try{
            // 建立连接
            con=DBUtils.getConnection();
            // 获取Statement对象
            stmt=con.createStatement();
            // 执行SQL语句
            rs=stmt.executeQuery(sql);
            while (rs.next()){
                Book book=new Book();
                book.setId(rs.getInt("id"));
                book.setName(rs.getString("name"));
                book.setAuthor(rs.getString("author"));
                book.setPrice(rs.getDouble("price"));
                book.setPublish(rs.getString("publish"));
                bookList.add(book);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtils.close(rs,stmt,con);
        }
        return bookList;
    }

    // 根据ID查询单本图书信息
    public Book getBookById(int id){
        Book book=null;
        Connection con=null;
        PreparedStatement pstmt=null;
        String sql="select * from Book where id=?";
        ResultSet rs=null;
        try{
            con=DBUtils.getConnection();
            pstmt=con.prepareStatement(sql);
            pstmt.setInt(1,id);
            rs=pstmt.executeQuery();
            if(rs.next()){
                book=new Book();
                book.setId(rs.getInt("id"));
                book.setName(rs.getString("name"));
                book.setAuthor(rs.getString("author"));
                book.setPrice(rs.getDouble("price"));
                book.setPublish(rs.getString("publish"));
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtils.close(rs,pstmt,con);
        }
        return book;
    }
}

五、Service 层:BookService.java

package com.service;

import com.dao.BookDao;
import com.entity.Book;
import java.util.List;

public class BookService {
    BookDao bookDao=new BookDao();

    // 查询所有图书
    public List<Book> getAllBooks(){
        return bookDao.getAllBooks();
    }

    // 根据ID查询单本图书
    public Book getBookById(int id){
        return bookDao.getBookById(id);
    }
}

六、Servlet 层(2 个)

1. BookServlet.java(图书列表)

package com.servlet;

import com.entity.Book;
import com.service.BookService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/book")
public class BookServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BookService bs=new BookService();
        List<Book> bookList=bs.getAllBooks();
        req.setAttribute("bookList",bookList);
        req.getRequestDispatcher("/bookList.jsp").forward(req,resp);
    }
}

2. BookIdServlet.java(图书详情)

package com.servlet;

import com.entity.Book;
import com.service.BookService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/bookid")
public class BookIdServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数中的图书ID
        int id=Integer.parseInt(req.getParameter("id"));
        BookService bs=new BookService();
        Book book=bs.getBookById(id);
        req.setAttribute("book",book);
        req.getRequestDispatcher("/detail.jsp").forward(req,resp);
    }
}

3、DBUtils.java(数据库工具类)

package com.utils;

import java.sql.*;

public class DBUtils {
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/mall?useSSL=false&characterEncoding=utf-8";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    static {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

七、JSP 页面(2 个)

1. bookList.jsp(图书列表页,含查看详情链接)

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>图书列表</title>
    <style>
        table {
            width: 90%;
            margin: 20px auto;
            border-collapse: collapse;
            text-align: center;
        }
        th, td {
            border: 1px solid #333;
            padding: 8px;
        }
        th {
            background-color: #f5f5f5;
        }
        a {
            color: blue;
            text-decoration: underline;
        }
    </style>
</head>
<body>
    <h2 style="text-align: center">图书列表</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>书名</th>
            <th>作者</th>
            <th>价格</th>
            <th>出版社</th>
            <th>查看详细信息</th>
        </tr>
        <c:forEach items="${bookList}" var="book">
            <tr>
                <td>${book.id}</td>
                <td>${book.name}</td>
                <td>${book.author}</td>
                <td>${book.price}</td>
                <td>${book.publish}</td>
                <td>
                    <a href="${pageContext.request.contextPath}/bookid?id=${book.id}">查看</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

2. detail.jsp(图书详情页)

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>图书详情</title>
    <style>
        .container {
            width: 50%;
            margin: 50px auto;
        }
        p {
            font-size: 18px;
            line-height: 2;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>图书详情</h2>
        <p>id:${book.id}</p>
        <p>书名:${book.name}</p>
        <p>作者:${book.author}</p>
        <p>价格:${book.price}</p>
        <p>出版社:${book.publish}</p>
    </div>
</body>
</html>

八、运行效果说明

  1. 访问列表页:启动项目后,访问 http://localhost:8080/你的项目名/book,即可看到所有图书的列表,每条数据后都有 “查看” 链接。
  2. 访问详情页:点击任意图书的 “查看” 链接,跳转到 bookid?id=xxx,即可看到该图书的详细信息。

九、核心流程说明

  1. 用户请求列表:访问 /book,触发 BookServlet,调用 BookService 查询所有图书,存入 request 域后转发到 bookList.jsp
  2. 用户点击查看详情:点击 “查看” 链接,请求 /bookid?id=xxx,触发 BookIdServlet,获取参数 id,调用 BookService 查询单本图书,存入 request 域后转发到 detail.jsp
  3. 页面展示数据:JSP 通过 JSTL 和 EL 表达式,遍历或直接取出数据展示。

十、项目显示结果

bookServlet

detail

detail_id

更多推荐