JavaWeb 实战:图书列表 + 详情页(MVC 分层完整实现)
·
一、项目整体结构
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>
八、运行效果说明
- 访问列表页:启动项目后,访问
http://localhost:8080/你的项目名/book,即可看到所有图书的列表,每条数据后都有 “查看” 链接。 - 访问详情页:点击任意图书的 “查看” 链接,跳转到
bookid?id=xxx,即可看到该图书的详细信息。
九、核心流程说明
- 用户请求列表:访问
/book,触发BookServlet,调用BookService查询所有图书,存入request域后转发到bookList.jsp。 - 用户点击查看详情:点击 “查看” 链接,请求
/bookid?id=xxx,触发BookIdServlet,获取参数id,调用BookService查询单本图书,存入request域后转发到detail.jsp。 - 页面展示数据:JSP 通过 JSTL 和 EL 表达式,遍历或直接取出数据展示。
十、项目显示结果
bookServlet
detail

detail_id

更多推荐

所有评论(0)