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"); // 设置响应的内容类型为HTMLresponse.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; // 定义序列化IDprivate 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"; // 定义数据库URLString 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类,用于获取EntityManagerFactorypublic class JPAExample {public static void main(String[] args) {// 获取EntityManagerFactory,指定持久化单元名称为my-puEntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu");// 获取EntityManagerEntityManager 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和EntityManagerFactoryem.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 = 1L; // 定义序列化ID// 重写doPost方法,处理POST请求protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name = request.getParameter("name"); // 获取请求参数nameString email = request.getParameter("email"); // 获取请求参数email// 创建User对象,并设置属性User user = new User(name, email);// 将User对象的属性设置为请求属性request.setAttribute("name", user.getName());request.setAttribute("email", user.getEmail());// 转发请求到user.jsprequest.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"; // 定义数据库URLprivate 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")); // 设置图书IDbook.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.getTitle()); // 设置图书标题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()); // 设置图书IDstmt.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); // 设置图书IDstmt.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; // 定义序列化IDprivate 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"); // 获取请求参数actionif ("add".equals(action)) { // 如果action为addBook book = new Book(); // 创建Book对象book.setTitle(request.getParameter("title")); // 设置图书标题book.setAuthor(request.getParameter("author")); // 设置图书作者bookDao.addBook(book); // 添加图书} else if ("update".equals(action)) { // 如果action为updateBook book = new Book(); // 创建Book对象book.setId(Integer.parseInt(request.getParameter("id"))); // 设置图书IDbook.setTitle(request.getParameter("title")); // 设置图书标题book.setAuthor(request.getParameter("author")); // 设置图书作者bookDao.updateBook(book); // 更新图书} else if ("delete".equals(action)) { // 如果action为deletebookDao.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"); // 获取请求属性booksfor (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. 总结

通过实际项目实践来巩固所学知识,在学习过程中,要注重理论与实践相结合,多动手编写代码,解决实际问题,逐步提高自己的编程能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript-字面量类型

字面量类型 使用 JS字面量 作为类型对变量进行类型注解&#xff0c;这种类型就是字面量类型&#xff0c;字面量类型比普通的类型更加精确 // 普通number类型&#xff0c;可以赋值任何数值 let count: number count 1 count 2 // 字面量类型100 只能赋值为100 let count: 1…

Django革新者:突破传统,构建下一代Web应用

书接上文 —— 家园建筑师&#xff1a;用Django打造你的Web帝国&#xff0c;从前面的学习中&#xff0c;咱们我们经历了一个完整的Django Web开发之旅&#xff0c;涵盖了从基础概念到高级特性的各个方面&#xff1a; 引言&#xff1a;介绍了企业级Web框架的需求&#xff0c;并概…

牛客NC67 汉诺塔问题【中等 递归 Java/Go/PHP/C++】 lintcode 169 · 汉诺塔

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/7d6cab7d435048c4b05251bf44e9f185 https://www.lintcode.com/problem/169/ 思路 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C…

使用Python操作Jenkins

大家好&#xff0c;Python作为一种简洁、灵活且功能丰富的编程语言&#xff0c;可以与各种API轻松集成&#xff0c;Jenkins的API也不例外。借助于Python中的python-jenkins模块&#xff0c;我们可以轻松地编写脚本来连接到Jenkins服务器&#xff0c;并执行各种操作&#xff0c;…

拌合楼系统开发(二十)解决海康DS-TVL224系列屏幕显示二维码思路

前言&#xff1a; 需求是想在通过程序动态控制显示屏显示二维码&#xff0c;最开始有些担心led这种点阵屏会不会对二维码显示出来后无法识别&#xff0c;实际测时候发现是没问题的。对于显示文字和语音播报&#xff0c;csdn上已经有大神有完整的代码。 海康威视道闸进出口LED屏…

100个 Unity小游戏系列三 -Unity 抽奖游戏专题二 水果机游戏

一、演示效果 二、知识点 2.1 布局 private void CreateItems(){for (int i 0; i < rewardDatas.Length; i){var reward_data rewardDatas[i];GameObject fruitOjb;if (i < itemRoot.childCount){fruitOjb itemRoot.GetChild(i).gameObject;}else{fruitOjb Instant…

数据中台建设方案(Word版源文档)

建设大数据管理中台&#xff0c;按照统一的数据规范和标准体系&#xff0c;构建统一数据采集&#xfe63;治理&#xfe63;共享标准、统一技术开发体系、统一接口 API &#xff0c;实现数据采集、平台治理&#xff0c;业务应用三层解耦&#xff0c;并按照统一标准格式提供高效的…

最新!!2024年上半年软考【中级软件设计师】综合知识真题解析

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的软件设计师真题及答案&#xff0c;总共30道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01…

[集群聊天服务器]----(十)Nginx的tcp负载均衡配置--附带截图

接着上文&#xff0c;我们剖析了服务端和客户端的代码&#xff0c;但是单台服务器的并发量是有限的&#xff0c;面对并发量的要求&#xff0c;我们就需要引入Nginx来实现并发量的要求&#xff0c;将用户请求分发到不同的服务器上分担压力&#xff0c;这就是负载均衡。 选择负…

汽车制造业安全有效的设计图纸文件外发系统是什么样的?

在汽车制造的世界里&#xff0c;那些设计图不仅仅是公司智慧的闪光点&#xff0c;更是它们竞争的秘密武器。但问题来了&#xff0c;当公司需要和供应商、合作伙伴频繁交换数据时&#xff0c;怎样安全又高效地发送这些设计图&#xff0c;就成了一个头疼的问题。这篇文章会深挖一…

python常用镜像

#1. 阿里云镜像&#xff1a;https://mirrors.aliyun.com/pypi/simple/ #2. 清华大学镜像&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple #3. 豆瓣镜像&#xff1a;https://pypi.doubanio.com/simple/ #4. 中科大镜像&#xff1a;https://pypi.mirrors.ustc.edu.cn/simp…

计算机网络——在地址栏输入网址(URL)之后都发生了什么

网址&#xff0c;也叫域名&#xff0c;域名就像一个 IP 地址的可读版本&#xff0c;比如&#xff0c;百度的域名 www.baidu.com&#xff0c;他的 ip 是 110.242.68.3&#xff0c;输入 IP 一样可以跳转到百度搜索的页面&#xff0c;我想没有一个人没去记百度的 IP 吧。其实我们真…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

符合车规级漏电流检测的磁通门传感器KTD1100

电动车充电桩 在政策出台后&#xff0c;充电桩类产品按要求需装配B端漏电流检测装置。它可以有效防止充电桩等设备中的漏电流对用户造成危害&#xff0c;保障用户的用电安全。其次&#xff0c;它可以促进充电桩等产品的质量提升&#xff0c;提高市场的公平竞争&#xff0c;让消…

无线领夹麦克风哪个品牌好?本期文章揭秘无线麦克风哪个品牌好用

​在当下这个全民皆为媒体的时代大潮中&#xff0c;视频分享已然成为了引领风尚的指向标。在自媒体领域竞争愈发激烈的态势下&#xff0c;若要在这片广阔海洋中扬帆远航&#xff0c;优秀的作品毫无疑问是吸引观众的关键所在。而想要塑造出这样的卓越之作&#xff0c;除了需要创…

npm 版本号指定标识符

关于依赖的版本 我们可以先来了解依赖的版本 {"dependencies": {"nestjs/common": "^10.0.0","nestjs/core": "^10.0.0",} } 比如我们常见的依赖版本一般长这样&#xff0c;它一般由三部分组成&#xff1a;major.minor.p…

代谢组数据分析六:基于报告分数的功能分析

代谢组数据分析六:基于报告分数的功能分析 受经典“RSA”方法的启发,我们开发了改进的“基于广义报告者得分的分析(GRSA)”方法,并将其实现在R包“ReporterScore”中,同时配套了全面的可视化方法和通路数据库。“GRSA”是一种无需阈值的方法,适用于所有类型的生物医学特…

unity生命值有时候不会减少,即使明显被击中

碰撞检测不一致&#xff1a; 确保所有敌人对象都有正确设置的标签&#xff08;Tag&#xff09;&#xff0c;并且这个标签是在 OnCollisionEnter 中检查的 "Enemy"。此外&#xff0c;检查敌人和直升机的碰撞器&#xff08;Collider&#xff09;设置是否正确&#xff0…

K8s 小白入门|从电影配乐谈起,聊聊容器编排和 K8s

来听听音乐 电影&#xff0c;是我们生活中的重要调味剂。 配乐&#xff0c;是电影中不可或缺的一部分。 有的时候&#xff0c;配乐可以跟剧情共振&#xff0c;让你按捺不住自己的情绪&#xff0c;或眼含热泪、或慷慨激昂、或人仰马翻、或怅然若失&#xff1b; 有的时候&…

偏微分方程算法之抛物型方程差分格式编程示例一

目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 从本节开始将对具体的抛物型偏微分问题算例进行C++编程,以加深对抛物型偏微分方程差分格式构造的理解和应用。 采用向前欧拉格式计算抛物型方程初边值问题: