Java Web(入门)
Java Web
1. 入门基础
1.1 Java Web简介
Java Web开发是指使用Java技术来创建动态网站或Web应用程序。Java Web开发主要使用Servlet、JSP(JavaServer Pages)、JavaBeans等技术来实现动态页面和处理业务逻辑。
1.2 环境搭建
为了开发Java Web应用程序,需要安装以下软件:
- JDK(Java Development Kit):Java开发工具包。提供Java开发所需的编译器和运行时环境。
- Eclipse或IntelliJ IDEA:集成开发环境(IDE)。用于编写、调试和运行Java代码。
- Apache Tomcat:一个常用的Servlet容器。用于部署和运行Java Web应用程序。
- Maven或Gradle:项目构建工具。用于管理项目依赖和构建过程。
2. 核心技术
2.1 Servlet
Servlet是一种用于扩展服务器功能的小程序,主要用于处理HTTP请求。Servlet通过实现javax.servlet.http.HttpServlet
类来处理客户端的请求和生成响应。
以下是一个简单的Servlet例子,并且包含详细注释:
import java.io.IOException; // 导入IOException类,用于处理输入输出异常
import javax.servlet.ServletException; // 导入ServletException类,用于处理Servlet特有的异常
import javax.servlet.annotation.WebServlet; // 导入WebServlet注解,用于定义Servlet的URL映射
import javax.servlet.http.HttpServlet; // 导入HttpServlet类,所有Servlet类都继承自这个类
import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类,用于处理请求数据
import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse类,用于处理响应数据
@WebServlet("/hello") // 使用@WebServlet注解定义Servlet的URL映射为/hello
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L; // 定义序列化ID,用于序列化和反序列化对象
// 重写doGet方法,处理GET请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html"); // 设置响应的内容类型为HTML
response.getWriter().println("<h1>Hello, World!</h1>"); // 输出HTML内容
}
}
代码详解:
import java.io.IOException;
:导入IOException类,用于处理输入输出异常。import javax.servlet.ServletException;
:导入ServletException类,用于处理Servlet特有的异常。import javax.servlet.annotation.WebServlet;
:导入WebServlet注解,用于定义Servlet的URL映射。import javax.servlet.http.HttpServlet;
:导入HttpServlet类,所有Servlet类都继承自这个类。import javax.servlet.http.HttpServletRequest;
:导入HttpServletRequest类,用于处理请求数据。import javax.servlet.http.HttpServletResponse;
:导入HttpServletResponse类,用于处理响应数据。@WebServlet("/hello")
:使用@WebServlet注解定义Servlet的URL映射为/hello。public class HelloServlet extends HttpServlet
:定义一个继承HttpServlet的类。private static final long serialVersionUID = 1L;
:定义序列化ID,用于序列化和反序列化对象。protected void doGet(HttpServletRequest request, HttpServletResponse response)
:重写doGet方法,处理GET请求。response.setContentType("text/html");
:设置响应的内容类型为HTML。response.getWriter().println("<h1>Hello, World!</h1>");
:输出HTML内容。
2.2 JSP(JavaServer Pages)
JSP是一种用于创建动态网页的技术,允许将Java代码嵌入到HTML中。JSP页面最终被转换成Servlet,并由Servlet容器执行。
以下是一个简单的JSP例子,并且包含详细注释:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 指定JSP页面使用Java语言,内容类型为HTML,字符编码为UTF-8 -->
<!DOCTYPE html>
<html>
<head>
<title>Hello JSP</title> <!-- 页面标题 -->
</head>
<body>
<h1>Hello, <%= request.getParameter("name") %>!</h1> <!-- 输出请求参数name的值 -->
</body>
</html>
代码详解:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
:页面指令,指定JSP页面使用Java语言,内容类型为HTML,字符编码为UTF-8。<!DOCTYPE html>
:定义文档类型为HTML5。<html>
:HTML文档的根元素。<head>
:HTML文档的头部,包含文档的元数据。<title>Hello JSP</title>
:定义页面标题。<body>
:HTML文档的主体,包含页面的内容。<h1>Hello, <%= request.getParameter("name") %>!</h1>
:输出请求参数name的值,<%= %>
用于在页面中输出Java表达式的结果。
2.3 JavaBeans
JavaBeans是一种可重用的组件模型,通常用于表示应用程序中的数据。JavaBean需要实现Serializable
接口,具有无参构造方法,并提供getter和setter方法。
以下是一个简单的JavaBean例子,并且包含详细注释:
import java.io.Serializable; // 导入Serializable接口,用于实现序列化
public class User implements Serializable { // 实现Serializable接口以支持序列化
private static final long serialVersionUID = 1L; // 定义序列化ID
private String name; // 定义name属性
private String email; // 定义email属性
// 无参构造方法
public User() {
}
// 有参构造方法
public User(String name, String email) {
this.name = name;
this.email = email;
}
// getter方法
public String getName() {
return name;
}
// setter方法
public void setName(String name) {
this.name = name;
}
// getter方法
public String getEmail() {
return email;
}
// setter方法
public void setEmail(String email) {
this.email = email;
}
}
代码详解:
import java.io.Serializable;
:导入Serializable接口,用于实现序列化。public class User implements Serializable
:定义一个实现Serializable接口的User类。private static final long serialVersionUID = 1L;
:定义序列化ID,用于序列化和反序列化对象。private String name;
:定义name属性。private String email;
:定义email属性。public User()
:无参构造方法。public User(String name, String email)
:有参构造方法,初始化name和email属性。public String getName()
:getter方法,返回name属性。public void setName(String name)
:setter方法,设置name属性。public String getEmail()
:getter方法,返回email属性。public void setEmail(String email)
:setter方法,设置email属性。
3. 数据持久化
3.1 JDBC(Java Database Connectivity)
JDBC是一种用于执行SQL语句的Java API。通过JDBC,可以连接数据库,执行SQL查询和更新操作,并处理结果集。
以下是一个简单的JDBC例子,并且包含详细注释:
import java.sql.Connection; // 导入Connection接口,用于管理数据库连接
import java.sql.DriverManager; // 导入DriverManager类,用于获取数据库连接
import java.sql.ResultSet; // 导入ResultSet接口,用于处理结果集
import java.sql.Statement; // 导入Statement接口,用于执行SQL语句
public class JDBCExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb"; // 定义数据库URL
String user = "root"; // 定义数据库用户名
String password = "password"; // 定义数据库密码
try (Connection conn = DriverManager.getConnection(url, user, password); // 获取数据库连接
Statement stmt = conn.createStatement(); // 创建Statement对象
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) { // 执行SQL查询语句,并返回结果集
while (rs.next()) { // 遍历结果集
System.out.println(rs.getString("username")); // 输出结果集中的用户名
}
} catch (Exception e) { // 捕获异常
e.printStackTrace(); // 打印异常信息
}
}
}
代码详解:
-
import java.sql.Connection;
:导入Connection接口,用于管理数据库连接。 -
import java.sql.DriverManager;
:导入DriverManager类,用于获取数据库连接。 -
import java.sql.ResultSet;
:导入ResultSet接口,用于处理结果集。 -
import java.sql.Statement;
:导入Statement接口,用于执行SQL语句。 -
String url = "jdbc:mysql://localhost:3306/testdb";
:定义数据库URL。 -
String user = "root";
:定义数据库用户名。 -
String password = "password";
:定义数据库密码。 -
try (Connection conn = DriverManager.getConnection(url, user, password);
:获取数据库连接。 -
Statement stmt = conn.createStatement();
:创建Statement对象。 -
ResultSet rs = stmt.executeQuery("SELECT * FROM users"))
:执行SQL查询语句,并返回结果集。 -
while (rs.next()) {
:遍历结果集。 -
System.out.println(rs.getString("username"));
:输出结果集中的用户名。 -
} catch (Exception e) {
:捕获异常。 -
e.printStackTrace();
:打印异常信息。
3.2 JPA(Java Persistence API)
JPA是一种用于管理Java对象和关系数据库数据之间映射的API。通过JPA,可以简化持久层的开发,避免大量的JDBC代码。
以下是一个简单的JPA例子,并且包含详细注释:
import javax.persistence.Entity; // 导入Entity注解,用于定义实体类
import javax.persistence.Id; // 导入Id注解,用于定义主键
@Entity // 使用@Entity注解定义实体类
public class User {
@Id // 使用@Id注解定义主键
private Long id; // 定义实体类的ID属性
private String username; // 定义实体类的用户名属性
// 定义getter和setter方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
import javax.persistence.EntityManager; // 导入EntityManager接口,用于管理实体
import javax.persistence.EntityManagerFactory; // 导入EntityManagerFactory接口,用于创建EntityManager
import javax.persistence.Persistence; // 导入Persistence类,用于获取EntityManagerFactory
public class JPAExample {
public static void main(String[] args) {
// 获取EntityManagerFactory,指定持久化单元名称为my-pu
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu");
// 获取EntityManager
EntityManager em = emf.createEntityManager();
// 开始事务
em.getTransaction().begin();
// 创建并设置User对象
User user = new User();
user.setId(1L);
user.setUsername("john");
// 持久化User对象
em.persist(user);
// 提交事务
em.getTransaction().commit();
// 关闭EntityManager和EntityManagerFactory
em.close();
emf.close();
}
}
代码详解:
-
import javax.persistence.Entity;
:导入Entity注解,用于定义实体类。 -
import javax.persistence.Id;
:导入Id注解,用于定义主键。 -
@Entity
:使用@Entity注解定义实体类。 -
public class User {
:定义User类。 -
@Id
:使用@Id注解定义主键。 -
private Long id;
:定义实体类的ID属性。 -
private String username;
:定义实体类的用户名属性。 -
public Long getId() {
:getter方法,返回ID属性。 -
public void setId(Long id) {
:setter方法,设置ID属性。 -
public String getUsername() {
:getter方法,返回用户名属性。 -
public void setUsername(String username) {
:setter方法,设置用户名属性。 -
import javax.persistence.EntityManager;
:导入EntityManager接口,用于管理实体。 -
import javax.persistence.EntityManagerFactory;
:导入EntityManagerFactory接口,用于创建EntityManager。 -
import javax.persistence.Persistence;
:导入Persistence类,用于获取EntityManagerFactory。 -
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu");
:获取EntityManagerFactory,指定持久化单元名称为my-pu。 -
EntityManager em = emf.createEntityManager();
:获取EntityManager。 -
em.getTransaction().begin();
:开始事务。 -
User user = new User();
:创建User对象。 -
user.setId(1L);
:设置User对象的ID属性。 -
user.setUsername("john");
:设置User对象的用户名属性。 -
em.persist(user);
:持久化User对象。 -
em.getTransaction().commit();
:提交事务。 -
em.close();
:关闭EntityManager。 -
emf.close();
:关闭EntityManagerFactory。
4. 高级主题
4.1 MVC架构
MVC(Model-View-Controller)是一种常用的设计模式,用于分离应用程序的业务逻辑、数据和显示。MVC模式将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。
以下是一个简单的Java Web MVC架构示例,并且包含详细注释。
Model(User.java)
public class User {
private String name; // 定义用户的名称属性
private String email; // 定义用户的邮箱属性
// 无参构造方法
public User() {
}
// 有参构造方法
public User(String name, String email) {
this.name = name;
this.email = email;
}
// getter方法
public String getName() {
return name;
}
// setter方法
public void setName(String name) {
this.name = name;
}
// getter方法
public String getEmail() {
return email;
}
// setter方法
public void setEmail(String email) {
this.email = email;
}
}
代码详解:
public class User {
:定义User类。private String name;
:定义用户的名称属性。private String email;
:定义用户的邮箱属性。public User() {
:无参构造方法。public User(String name, String email) {
:有参构造方法,初始化名称和邮箱属性。public String getName() {
:getter方法,返回名称属性。public void setName(String name) {
:setter方法,设置名称属性。public String getEmail() {
:getter方法,返回邮箱属性。public void setEmail(String email) {
:setter方法,设置邮箱属性。
View(user.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 指定JSP页面使用Java语言,内容类型为HTML,字符编码为UTF-8 -->
<!DOCTYPE html>
<html>
<head>
<title>User Info</title> <!-- 页面标题 -->
</head>
<body>
<h1>User Info</h1>
<p>Name: <%= request.getAttribute("name") %></p> <!-- 显示用户名称 -->
<p>Email: <%= request.getAttribute("email") %></p> <!-- 显示用户邮箱 -->
</body>
</html>
代码详解:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
:页面指令,指定JSP页面使用Java语言,内容类型为HTML,字符编码为UTF-8。<!DOCTYPE html>
:定义文档类型为HTML5。<html>
:HTML文档的根元素。<head>
:HTML文档的头部,包含文档的元数据。<title>User Info</title>
:定义页面标题。<body>
:HTML文档的主体,包含页面的内容。<h1>User Info</h1>
:页面标题。<p>Name: <%= request.getAttribute("name") %></p>
:显示用户名称,<%= %>
用于在页面中输出Java表达式的结果。<p>Email: <%= request.getAttribute("email") %></p>
:显示用户邮箱。
Controller(UserServlet.java)
import java.io.IOException; // 导入IOException类,用于处理输入输出异常
import javax.servlet.ServletException; // 导入ServletException类,用于处理Servlet特有的异常
import javax.servlet.annotation.WebServlet; // 导入WebServlet注解,用于定义Servlet的URL映射
import javax.servlet.http.HttpServlet; // 导入HttpServlet类,所有Servlet类都继承自这个类
import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类,用于处理请求数据
import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse类,用于处理响应数据
@WebServlet("/user") // 使用@WebServlet注解定义Servlet的URL映射为/user
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1
L; // 定义序列化ID
// 重写doPost方法,处理POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name"); // 获取请求参数name
String email = request.getParameter("email"); // 获取请求参数email
// 创建User对象,并设置属性
User user = new User(name, email);
// 将User对象的属性设置为请求属性
request.setAttribute("name", user.getName());
request.setAttribute("email", user.getEmail());
// 转发请求到user.jsp
request.getRequestDispatcher("/user.jsp").forward(request, response);
}
}
代码详解:
import java.io.IOException;
:导入IOException类,用于处理输入输出异常。import javax.servlet.ServletException;
:导入ServletException类,用于处理Servlet特有的异常。import javax.servlet.annotation.WebServlet;
:导入WebServlet注解,用于定义Servlet的URL映射。import javax.servlet.http.HttpServlet;
:导入HttpServlet类,所有Servlet类都继承自这个类。import javax.servlet.http.HttpServletRequest;
:导入HttpServletRequest类,用于处理请求数据。import javax.servlet.http.HttpServletResponse;
:导入HttpServletResponse类,用于处理响应数据。@WebServlet("/user")
:使用@WebServlet注解定义Servlet的URL映射为/user。public class UserServlet extends HttpServlet
:定义一个继承HttpServlet的类。private static final long serialVersionUID = 1L;
:定义序列化ID,用于序列化和反序列化对象。protected void doPost(HttpServletRequest request, HttpServletResponse response)
:重写doPost方法,处理POST请求。String name = request.getParameter("name");
:获取请求参数name。String email = request.getParameter("email");
:获取请求参数email。User user = new User(name, email);
:创建User对象,并设置属性。request.setAttribute("name", user.getName());
:将User对象的名称属性设置为请求属性。request.setAttribute("email", user.getEmail());
:将User对象的邮箱属性设置为请求属性。request.getRequestDispatcher("/user.jsp").forward(request, response);
:转发请求到user.jsp。
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 定义Servlet -->
<servlet>
<servlet-name>UserServlet</servlet-name> <!-- Servlet名称 -->
<servlet-class>com.example.UserServlet</servlet-class> <!-- Servlet类 -->
</servlet>
<!-- 定义Servlet映射 -->
<servlet-mapping>
<servlet-name>UserServlet</servlet-name> <!-- Servlet名称 -->
<url-pattern>/user</url-pattern> <!-- URL模式 -->
</servlet-mapping>
</web-app>
代码详解:
<web-app>
:根元素,定义Web应用程序。<servlet>
:定义Servlet。<servlet-name>UserServlet</servlet-name>
:Servlet名称。<servlet-class>com.example.UserServlet</servlet-class>
:Servlet类。<servlet-mapping>
:定义Servlet映射。<url-pattern>/user</url-pattern>
:URL模式。
5. 实战项目
通过实际项目来巩固学习内容。以下是一个简单的在线图书管理系统项目:
- 功能:用户可以添加、查看、更新和删除图书信息。
- 技术栈:Servlet、JSP、JDBC、Tomcat。
5.1 项目结构
BookManagement
├── src
│ └── com
│ └── example
│ ├── Book.java
│ ├── BookDao.java
│ ├── BookServlet.java
│ └── DBUtil.java
├── WebContent
│ ├── index.jsp
│ └── WEB-INF
│ └── web.xml
└── lib
└── mysql-connector-java.jar
5.2 代码实现
Book.java
public class Book {
private int id; // 定义图书的ID属性
private String title; // 定义图书的标题属性
private String author; // 定义图书的作者属性
// 定义getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 class Book {
:定义Book类。private int id;
:定义图书的ID属性。private String title;
:定义图书的标题属性。private String author;
:定义图书的作者属性。public int getId() {
:getter方法,返回ID属性。public void setId(int id) {
:setter方法,设置ID属性。public String getTitle() {
:getter方法,返回标题属性。public void setTitle(String title) {
:setter方法,设置标题属性。public String getAuthor() {
:getter方法,返回作者属性。public void setAuthor(String author) {
:setter方法,设置作者属性。
DBUtil.java
import java.sql.Connection; // 导入Connection接口,用于管理数据库连接
import java.sql.DriverManager; // 导入DriverManager类,用于获取数据库连接
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/bookdb"; // 定义数据库URL
private static final String USER = "root"; // 定义数据库用户名
private static final String PASSWORD = "password"; // 定义数据库密码
// 获取数据库连接
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver"); // 加载数据库驱动
return DriverManager.getConnection(URL, USER, PASSWORD); // 返回数据库连接
}
}
代码详解:
import java.sql.Connection;
:导入Connection接口,用于管理数据库连接。import java.sql.DriverManager;
:导入DriverManager类,用于获取数据库连接。public class DBUtil {
:定义DBUtil类。private static final String URL = "jdbc:mysql://localhost:3306/bookdb";
:定义数据库URL。private static final String USER = "root";
:定义数据库用户名。private static final String PASSWORD = "password";
:定义数据库密码。public static Connection getConnection() throws Exception {
:定义获取数据库连接的方法。Class.forName("com.mysql.cj.jdbc.Driver");
:加载数据库驱动。return DriverManager.getConnection(URL, USER, PASSWORD);
:返回数据库连接。
BookDao.java
import java.sql.Connection; // 导入Connection接口,用于管理数据库连接
import java.sql.PreparedStatement; // 导入PreparedStatement接口,用于执行预编译的SQL语句
import java.sql.ResultSet; // 导入ResultSet接口,用于处理结果集
import java.util.ArrayList; // 导入ArrayList类,用于创建动态数组
import java.util.List; // 导入List接口,用于定义列表
public class BookDao {
// 获取所有图书
public List<Book> getAllBooks() throws Exception {
List<Book> books = new ArrayList<>(); // 创建图书列表
try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM books"); // 创建预编译的SQL语句
ResultSet rs = stmt.executeQuery()) { // 执行查询,并返回结果集
while (rs.next()) { // 遍历结果集
Book book = new Book(); // 创建图书对象
book.setId(rs.getInt("id")); // 设置图书ID
book.setTitle(rs.getString("title")); // 设置图书标题
book.setAuthor(rs.getString("author")); // 设置图书作者
books.add(book); // 将图书添加到列表中
}
}
return books; // 返回图书列表
}
// 添加图书
public void addBook(Book book) throws Exception {
try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
PreparedStatement stmt = conn.prepareStatement("INSERT INTO books (title, author) VALUES (?, ?)")) { // 创建预编译的SQL语句
stmt.setString(1, book.get
Title()); // 设置图书标题
stmt.setString(2, book.getAuthor()); // 设置图书作者
stmt.executeUpdate(); // 执行更新
}
}
// 更新图书
public void updateBook(Book book) throws Exception {
try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
PreparedStatement stmt = conn.prepareStatement("UPDATE books SET title = ?, author = ? WHERE id = ?")) { // 创建预编译的SQL语句
stmt.setString(1, book.getTitle()); // 设置图书标题
stmt.setString(2, book.getAuthor()); // 设置图书作者
stmt.setInt(3, book.getId()); // 设置图书ID
stmt.executeUpdate(); // 执行更新
}
}
// 删除图书
public void deleteBook(int id) throws Exception {
try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
PreparedStatement stmt = conn.prepareStatement("DELETE FROM books WHERE id = ?")) { // 创建预编译的SQL语句
stmt.setInt(1, id); // 设置图书ID
stmt.executeUpdate(); // 执行删除
}
}
}
代码详解:
import java.sql.Connection;
:导入Connection接口,用于管理数据库连接。import java.sql.PreparedStatement;
:导入PreparedStatement接口,用于执行预编译的SQL语句。import java.sql.ResultSet;
:导入ResultSet接口,用于处理结果集。import java.util.ArrayList;
:导入ArrayList类,用于创建动态数组。import java.util.List;
:导入List接口,用于定义列表。public class BookDao {
:定义BookDao类。public List<Book> getAllBooks() throws Exception {
:定义获取所有图书的方法。List<Book> books = new ArrayList<>();
:创建图书列表。try (Connection conn = DBUtil.getConnection();
:获取数据库连接。PreparedStatement stmt = conn.prepareStatement("SELECT * FROM books");
:创建预编译的SQL语句。ResultSet rs = stmt.executeQuery()) {
:执行查询,并返回结果集。while (rs.next()) {
:遍历结果集。Book book = new Book();
:创建图书对象。book.setId(rs.getInt("id"));
:设置图书ID。book.setTitle(rs.getString("title"));
:设置图书标题。book.setAuthor(rs.getString("author"));
:设置图书作者。books.add(book);
:将图书添加到列表中。} return books;
:返回图书列表。public void addBook(Book book) throws Exception {
:定义添加图书的方法。PreparedStatement stmt = conn.prepareStatement("INSERT INTO books (title, author) VALUES (?, ?)");
:创建预编译的SQL语句。stmt.setString(1, book.getTitle());
:设置图书标题。stmt.setString(2, book.getAuthor());
:设置图书作者。stmt.executeUpdate();
:执行更新。public void updateBook(Book book) throws Exception {
:定义更新图书的方法。PreparedStatement stmt = conn.prepareStatement("UPDATE books SET title = ?, author = ? WHERE id = ?");
:创建预编译的SQL语句。stmt.setString(1, book.getTitle());
:设置图书标题。stmt.setString(2, book.getAuthor());
:设置图书作者。stmt.setInt(3, book.getId());
:设置图书ID。stmt.executeUpdate();
:执行更新。public void deleteBook(int id) throws Exception {
:定义删除图书的方法。PreparedStatement stmt = conn.prepareStatement("DELETE FROM books WHERE id = ?");
:创建预编译的SQL语句。stmt.setInt(1, id);
:设置图书ID。stmt.executeUpdate();
:执行删除。
BookServlet.java
import java.io.IOException; // 导入IOException类,用于处理输入输出异常
import javax.servlet.ServletException; // 导入ServletException类,用于处理Servlet特有的异常
import javax.servlet.annotation.WebServlet; // 导入WebServlet注解,用于定义Servlet的URL映射
import javax.servlet.http.HttpServlet; // 导入HttpServlet类,所有Servlet类都继承自这个类
import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类,用于处理请求数据
import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse类,用于处理响应数据
@WebServlet("/books") // 使用@WebServlet注解定义Servlet的URL映射为/books
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = 1L; // 定义序列化ID
private BookDao bookDao = new BookDao(); // 创建BookDao对象
// 重写doGet方法,处理GET请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
request.setAttribute("books", bookDao.getAllBooks()); // 获取所有图书,并设置为请求属性
request.getRequestDispatcher("/index.jsp").forward(request, response); // 转发请求到index.jsp
} catch (Exception e) { // 捕获异常
throw new ServletException(e); // 抛出Servlet异常
}
}
// 重写doPost方法,处理POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String action = request.getParameter("action"); // 获取请求参数action
if ("add".equals(action)) { // 如果action为add
Book book = new Book(); // 创建Book对象
book.setTitle(request.getParameter("title")); // 设置图书标题
book.setAuthor(request.getParameter("author")); // 设置图书作者
bookDao.addBook(book); // 添加图书
} else if ("update".equals(action)) { // 如果action为update
Book book = new Book(); // 创建Book对象
book.setId(Integer.parseInt(request.getParameter("id"))); // 设置图书ID
book.setTitle(request.getParameter("title")); // 设置图书标题
book.setAuthor(request.getParameter("author")); // 设置图书作者
bookDao.updateBook(book); // 更新图书
} else if ("delete".equals(action)) { // 如果action为delete
bookDao.deleteBook(Integer.parseInt(request.getParameter("id"))); // 删除图书
}
response.sendRedirect("books"); // 重定向到/books
} catch (Exception e) { // 捕获异常
throw new ServletException(e); // 抛出Servlet异常
}
}
}
代码详解:
import java.io.IOException;
:导入IOException类,用于处理输入输出异常。import javax.servlet.ServletException;
:导入ServletException类,用于处理Servlet特有的异常。import javax.servlet.annotation.WebServlet;
:导入WebServlet注解,用于定义Servlet的URL映射。import javax.servlet.http.HttpServlet;
:导入HttpServlet类,所有Servlet类都继承自这个类。import javax.servlet.http.HttpServletRequest;
:导入HttpServletRequest类,用于处理请求数据。import javax.servlet.http.HttpServletResponse;
:导入HttpServletResponse类,用于处理响应数据。@WebServlet("/books")
:使用@WebServlet注解定义Servlet的URL映射为/books。public class BookServlet extends HttpServlet
:定义一个继承HttpServlet的类。private static final long serialVersionUID = 1L;
:定义序列化ID,用于序列化和反序列化对象。private BookDao bookDao = new BookDao();
:创建BookDao对象。protected void doGet(HttpServletRequest request, HttpServletResponse response)
:重写doGet方法,处理GET请求。request.setAttribute("books", bookDao.getAllBooks());
:获取所有图书,并设置为请求属性。request.getRequestDispatcher("/index.jsp").forward(request, response);
:转发请求到index.jsp。catch (Exception e) {
:捕获异常。throw new ServletException(e);
:抛出Servlet异常。protected void doPost(HttpServletRequest request, HttpServletResponse response)
:重写doPost方法,处理POST请求。String action = request.getParameter("action");
:获取请求参数action。if ("add".equals(action)) {
:如果action为add。Book book = new Book();
:创建Book对象。book.setTitle(request.getParameter("title"));
:设置图书标题。book.setAuthor(request.getParameter("author"));
:设置图书作者。bookDao.addBook(book);
:添加图书。} else if ("update".equals(action)) {
:如果action为update。Book book = new Book();
:创建Book对象。- `book.setId(Integer.parseInt
(request.getParameter(“id”)));`:设置图书ID。
book.setTitle(request.getParameter("title"));
:设置图书标题。book.setAuthor(request.getParameter("author"));
:设置图书作者。bookDao.updateBook(book);
:更新图书。} else if ("delete".equals(action)) {
:如果action为delete。bookDao.deleteBook(Integer.parseInt(request.getParameter("id")));
:删除图书。response.sendRedirect("books");
:重定向到/books。catch (Exception e) {
:捕获异常。throw new ServletException(e);
:抛出Servlet异常。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 指定JSP页面使用Java语言,内容类型为HTML,字符编码为UTF-8 -->
<!DOCTYPE html>
<html>
<head>
<title>Book Management</title> <!-- 页面标题 -->
</head>
<body>
<h1>Book Management</h1>
<form action="books" method="post"> <!-- 表单,用于添加图书 -->
<input type="hidden" name="action" value="add"/> <!-- 隐藏域,用于指定操作类型为add -->
Title: <input type="text" name="title"/><br/> <!-- 文本框,用于输入图书标题 -->
Author: <input type="text" name="author"/><br/> <!-- 文本框,用于输入图书作者 -->
<input type="submit" value="Add Book"/> <!-- 提交按钮,用于提交表单 -->
</form>
<hr/>
<table border="1"> <!-- 表格,用于显示图书列表 -->
<tr>
<th>ID</th>
<th>Title</th>
<th>Author</th>
<th>Actions</th>
</tr>
<%-- 使用JSP脚本元素嵌入Java代码 --%>
<%
List<Book> books = (List<Book>) request.getAttribute("books"); // 获取请求属性books
for (Book book : books) { // 遍历图书列表
%>
<tr>
<td><%= book.getId() %></td> <!-- 显示图书ID -->
<td><%= book.getTitle() %></td> <!-- 显示图书标题 -->
<td><%= book.getAuthor() %></td> <!-- 显示图书作者 -->
<td>
<form action="books" method="post" style="display:inline;"> <!-- 表单,用于更新图书 -->
<input type="hidden" name="action" value="update"/> <!-- 隐藏域,用于指定操作类型为update -->
<input type="hidden" name="id" value="<%= book.getId() %>"/> <!-- 隐藏域,用于指定图书ID -->
Title: <input type="text" name="title" value="<%= book.getTitle() %>"/><br/> <!-- 文本框,用于输入图书标题 -->
Author: <input type="text" name="author" value="<%= book.getAuthor() %>"/><br/> <!-- 文本框,用于输入图书作者 -->
<input type="submit" value="Update"/> <!-- 提交按钮,用于提交表单 -->
</form>
<form action="books" method="post" style="display:inline;"> <!-- 表单,用于删除图书 -->
<input type="hidden" name="action" value="delete"/> <!-- 隐藏域,用于指定操作类型为delete -->
<input type="hidden" name="id" value="<%= book.getId() %>"/> <!-- 隐藏域,用于指定图书ID -->
<input type="submit" value="Delete"/> <!-- 提交按钮,用于提交表单 -->
</form>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
代码详解:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
:页面指令,指定JSP页面使用Java语言,内容类型为HTML,字符编码为UTF-8。<!DOCTYPE html>
:定义文档类型为HTML5。<html>
:HTML文档的根元素。<head>
:HTML文档的头部,包含文档的元数据。<title>Book Management</title>
:页面标题。<body>
:HTML文档的主体,包含页面的内容。<h1>Book Management</h1>
:页面标题。<form action="books" method="post">
:表单,用于添加图书。<input type="hidden" name="action" value="add"/>
:隐藏域,用于指定操作类型为add。Title: <input type="text" name="title"/><br/>
:文本框,用于输入图书标题。Author: <input type="text" name="author"/><br/>
:文本框,用于输入图书作者。<input type="submit" value="Add Book"/>
:提交按钮,用于提交表单。<hr/>
:水平分割线。<table border="1">
:表格,用于显示图书列表。<tr>
:表格行。<th>ID</th>
:表格标题单元格,显示ID。<th>Title</th>
:表格标题单元格,显示Title。<th>Author</th>
:表格标题单元格,显示Author。<th>Actions</th>
:表格标题单元格,显示Actions。<% List<Book> books = (List<Book>) request.getAttribute("books"); %>
:使用JSP脚本元素嵌入Java代码,获取请求属性books。<% for (Book book : books) { %>
:遍历图书列表。<tr>
:表格行。<td><%= book.getId() %></td>
:表格单元格,显示图书ID。<td><%= book.getTitle() %></td>
:表格单元格,显示图书标题。<td><%= book.getAuthor() %></td>
:表格单元格,显示图书作者。<td>
:表格单元格。<form action="books" method="post" style="display:inline;">
:表单,用于更新图书。<input type="hidden" name="action" value="update"/>
:隐藏域,用于指定操作类型为update。<input type="hidden" name="id" value="<%= book.getId() %>"/>
:隐藏域,用于指定图书ID。Title: <input type="text" name="title" value="<%= book.getTitle() %>"/><br/>
:文本框,用于输入图书标题。Author: <input type="text" name="author" value="<%= book.getAuthor() %>"/><br/>
:文本框,用于输入图书作者。<input type="submit" value="Update"/>
:提交按钮,用于提交表单。<form action="books" method="post" style="display:inline;">
:表单,用于删除图书。<input type="hidden" name="action" value="delete"/>
:隐藏域,用于指定操作类型为delete。<input type="hidden" name="id" value="<%= book.getId() %>"/>
:隐藏域,用于指定图书ID。<input type="submit" value="Delete"/>
:提交按钮,用于提交表单。
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 定义Servlet -->
<servlet>
<servlet-name>BookServlet</servlet-name> <!-- Servlet名称 -->
<servlet-class>com.example.BookServlet</servlet-class> <!-- Servlet类 -->
</servlet>
<!-- 定义Servlet映射 -->
<servlet-mapping>
<servlet-name>BookServlet</servlet-name> <!-- Servlet名称 -->
<url-pattern>/books</url-pattern> <!-- URL模式 -->
</servlet-mapping>
</web-app>
代码详解:
<web-app>
:根元素,定义Web应用程序。<servlet>
:定义Servlet。<servlet-name>BookServlet</servlet-name>
:Servlet名称。<servlet-class>com.example.BookServlet</servlet-class>
:Servlet类。<servlet-mapping>
:定义Servlet映射。<url-pattern>/books</url-pattern>
:URL模式。
6. 参考资料
- 《Java Web编程详解》
- 《Java Web高级编程》
- Oracle官方JavaEE文档
7. 总结
通过实际项目实践来巩固所学知识,在学习过程中,要注重理论与实践相结合,多动手编写代码,解决实际问题,逐步提高自己的编程能力。
原文地址:https://blog.csdn.net/m0_74824802/article/details/144384438
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!