Java Web开发基础与Servlet核心技术
Java Web开发基础与Servlet核心技术

15.1 学习目标与重点提示
学习目标:掌握Java Web开发的核心概念与Servlet技术的使用方法,包括Web应用的结构、Servlet的定义与使用、HTTP请求与响应的处理、会话管理、过滤器与监听器的使用,学会在实际开发中处理Web应用问题。
重点:Web应用的结构(目录结构、配置文件)、Servlet的定义与使用(Servlet接口、HttpServlet类、注解配置)、HTTP请求与响应的处理(Request、Response对象)、会话管理(Session、Cookie)、过滤器与监听器的使用、Web开发的实际应用场景。
15.2 Web开发概述
Java Web开发是用于处理Web应用的机制。
15.2.1 Web开发的定义
定义:Web开发是用于处理Web应用的机制。
作用:
- 实现Web应用的开发。
- 实现客户端与服务器之间的通信。
- 实现动态网页的生成。
- 实现Web应用的部署与维护。
✅ 结论:Web开发是用于处理Web应用的机制,作用是实现Web应用的开发、客户端与服务器之间的通信、动态网页的生成、Web应用的部署与维护。
15.2.2 Web应用的结构
定义:Web应用的结构是指Java Web应用的目录结构。
常用目录:
- webapp:Web应用的根目录。
- WEB-INF:存放Web应用的配置文件和类文件。
- lib:存放Web应用的依赖库。
- classes:存放Web应用的类文件。
- web.xml:Web应用的配置文件。
✅ 结论:Web应用的结构是指Java Web应用的目录结构,常用目录包括webapp、WEB-INF、lib、classes、web.xml。
15.3 Servlet核心技术
Servlet是Java Web开发的核心技术。
15.3.1 Servlet的定义与分类
定义:Servlet是用于处理HTTP请求与响应的Java程序。
分类:
- 继承HttpServlet类的Servlet。
- 实现Servlet接口的Servlet。
常用方法:
- doGet():处理GET请求。
- doPost():处理POST请求。
- doPut():处理PUT请求。
- doDelete():处理DELETE请求。
- init():初始化Servlet。
- destroy():销毁Servlet。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
// 注解配置Servlet
@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 输出响应内容
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
输出结果:
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
✅ 结论:Servlet是用于处理HTTP请求与响应的Java程序,分类包括继承HttpServlet类的Servlet、实现Servlet接口的Servlet。
15.3.2 HTTP请求与响应的处理
定义:HTTP请求与响应的处理是指Java Web应用中处理HTTP请求与响应的方法。
常用对象:
- HttpServletRequest:用于表示HTTP请求的对象。
- HttpServletResponse:用于表示HTTP响应的对象。
常用方法:
- HttpServletRequest:
- getParameter():获取请求参数。
- getParameterValues():获取请求参数数组。
- getMethod():获取请求方法。
- getRequestURI():获取请求URI。
- getSession():获取会话对象。
- HttpServletResponse:
- setContentType():设置响应类型。
- getWriter():获取输出流。
- sendRedirect():重定向到其他页面。
- addCookie():添加Cookie。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
// 注解配置Servlet
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 输出响应内容
out.println("<html>");
out.println("<head>");
out.println("<title>User Information</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>User Information</h1>");
out.println("<p>Name: " + request.getParameter("name") + "</p>");
out.println("<p>Age: " + request.getParameter("age") + "</p>");
out.println("<p>Email: " + request.getParameter("email") + "</p>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
输出结果:
<html>
<head>
<title>User Information</title>
</head>
<body>
<h1>User Information</h1>
<p>Name: 张三</p>
<p>Age: 25</p>
<p>Email: zhangsan@example.com</p>
</body>
</html>
✅ 结论:HTTP请求与响应的处理是指Java Web应用中处理HTTP请求与响应的方法,常用对象包括HttpServletRequest、HttpServletResponse。
15.4 会话管理
会话管理是用于处理Web应用中会话的机制。
15.4.1 Session的定义与使用
定义:Session是用于表示Web应用中会话的对象。
常用方法:
- setAttribute():设置会话属性。
- getAttribute():获取会话属性。
- removeAttribute():移除会话属性。
- invalidate():销毁会话。
- getMaxInactiveInterval():获取会话的最大不活动时间。
- setMaxInactiveInterval():设置会话的最大不活动时间。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
// 注解配置Servlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证用户
if ("admin".equals(username) && "123456".equals(password)) {
// 登录成功,设置会话属性
HttpSession session = request.getSession();
session.setAttribute("username", username);
// 重定向到首页
response.sendRedirect("/index.jsp");
} else {
// 登录失败,重定向到登录页面
response.sendRedirect("/login.jsp");
}
}
}
// 首页Servlet
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取会话属性
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
if (username != null) {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 输出响应内容
out.println("<html>");
out.println("<head>");
out.println("<title>Index</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Welcome, " + username + "!</h1>");
out.println("<a href=\"/logout\">Logout</a>");
out.println("</body>");
out.println("</html>");
} else {
// 会话失效,重定向到登录页面
response.sendRedirect("/login.jsp");
}
}
}
// 登出Servlet
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 销毁会话
HttpSession session = request.getSession();
session.invalidate();
// 重定向到登录页面
response.sendRedirect("/login.jsp");
}
}
输出结果:
登录页面:
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
<br>
<input type="submit" value="Login">
</form>
</body>
</html>
首页:
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>Welcome, admin!</h1>
<a href="/logout">Logout</a>
</body>
</html>
✅ 结论:Session是用于表示Web应用中会话的对象,常用方法包括setAttribute()、getAttribute()、removeAttribute()、invalidate()、getMaxInactiveInterval()、setMaxInactiveInterval()。
15.4.2 Cookie的定义与使用
定义:Cookie是用于表示Web应用中Cookie的对象。
常用方法:
- getName():获取Cookie的名称。
- getValue():获取Cookie的值。
- setValue():设置Cookie的值。
- getMaxAge():获取Cookie的最大存活时间。
- setMaxAge():设置Cookie的最大存活时间。
- setPath():设置Cookie的路径。
- setDomain():设置Cookie的域名。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
// 注解配置Servlet
@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 获取Cookie
Cookie[] cookies = request.getCookies();
String username = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
break;
}
}
}
if (username != null) {
out.println("<html>");
out.println("<head>");
out.println("<title>Cookie Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Welcome, " + username + "!</h1>");
out.println("<a href=\"/removeCookie\">Remove Cookie</a>");
out.println("</body>");
out.println("</html>");
} else {
// 设置Cookie
Cookie cookie = new Cookie("username", "admin");
cookie.setMaxAge(3600);
cookie.setPath("/");
response.addCookie(cookie);
out.println("<html>");
out.println("<head>");
out.println("<title>Cookie Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Welcome, Guest!</h1>");
out.println("</body>");
out.println("</html>");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
// 移除Cookie的Servlet
@WebServlet("/removeCookie")
public class RemoveCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 移除Cookie
Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
// 重定向到Cookie示例页面
response.sendRedirect("/cookie");
}
}
输出结果:
第一次访问:
<html>
<head>
<title>Cookie Example</title>
</head>
<body>
<h1>Welcome, Guest!</h1>
</body>
</html>
第二次访问:
<html>
<head>
<title>Cookie Example</title>
</head>
<body>
<h1>Welcome, admin!</h1>
<a href="/removeCookie">Remove Cookie</a>
</body>
</html>
✅ 结论:Cookie是用于表示Web应用中Cookie的对象,常用方法包括getName()、getValue()、setValue()、getMaxAge()、setMaxAge()、setPath()、setDomain()。
15.5 过滤器与监听器的使用
过滤器与监听器是Java Web开发的重要技术。
15.5.1 过滤器的定义与使用
定义:过滤器是用于处理HTTP请求与响应的Java程序。
作用:
- 对请求进行过滤。
- 对响应进行过滤。
- 对请求与响应进行处理。
常用方法:
- doFilter():处理请求与响应。
- init():初始化过滤器。
- destroy():销毁过滤器。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.*;
// 注解配置过滤器
@WebFilter("/user/*")
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("UserFilter初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 输出响应内容
out.println("<html>");
out.println("<head>");
out.println("<title>User Filter</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>User Filter</h1>");
// 继续处理请求
chain.doFilter(request, response);
out.println("</body>");
out.println("</html>");
}
@Override
public void destroy() {
System.out.println("UserFilter销毁");
}
}
输出结果:
<html>
<head>
<title>User Filter</title>
</head>
<body>
<h1>User Filter</h1>
User Information
<p>Name: 张三</p>
<p>Age: 25</p>
<p>Email: zhangsan@example.com</p>
</body>
</html>
✅ 结论:过滤器是用于处理HTTP请求与响应的Java程序,常用方法包括doFilter()、init()、destroy()。
15.5.2 监听器的定义与使用
定义:监听器是用于监听Web应用中事件的Java程序。
作用:
- 监听ServletContext事件。
- 监听HttpSession事件。
- 监听ServletRequest事件。
常用方法:
- contextInitialized():ServletContext初始化事件。
- contextDestroyed():ServletContext销毁事件。
- sessionCreated():HttpSession创建事件。
- sessionDestroyed():HttpSession销毁事件。
- requestInitialized():ServletRequest初始化事件。
- requestDestroyed():ServletRequest销毁事件。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;
import java.io.*;
// 注解配置监听器
@WebListener
public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSession创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSession销毁");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequest初始化");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequest销毁");
}
}
输出结果:
ServletContext初始化
ServletRequest初始化
HttpSession创建
ServletRequest销毁
HttpSession销毁
ServletContext销毁
✅ 结论:监听器是用于监听Web应用中事件的Java程序,常用方法包括contextInitialized()、contextDestroyed()、sessionCreated()、sessionDestroyed()、requestInitialized()、requestDestroyed()。
15.6 Web开发的实际应用场景
在实际开发中,Web开发的应用场景非常广泛,如:
- 实现用户的登录与登出。
- 实现商品的展示与购买。
- 实现订单的管理。
- 实现博客的发布与管理。
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
// 产品类
public class Product {
private String productId;
private String productName;
private double price;
private int sales;
public Product(String productId, String productName, double price, int sales) {
this.productId = productId;
this.productName = productName;
this.price = price;
this.sales = sales;
}
public String getProductId() {
return productId;
}
public String getProductName() {
return productName;
}
public double getPrice() {
return price;
}
public int getSales() {
return sales;
}
@Override
public String toString() {
return "Product{" +
"productId='" + productId + '\'' +
", productName='" + productName + '\'' +
", price=" + price +
", sales=" + sales +
'}';
}
}
// 产品服务类
public class ProductService {
public List<Product> getTopSellingProducts(String sql, int topN) {
// 数据库连接信息
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String username = "root";
String password = "123456";
List<Product> products = new ArrayList<>();
try {
// 1. 加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 2. 建立数据库连接
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println("数据库连接成功");
// 3. 执行SQL语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, topN);
ResultSet resultSet = preparedStatement.executeQuery();
// 4. 处理结果集
while (resultSet.next()) {
String productId = resultSet.getString("product_id");
String productName = resultSet.getString("product_name");
double price = resultSet.getDouble("price");
int sales = resultSet.getInt("sales");
products.add(new Product(productId, productName, price, sales));
}
// 5. 关闭资源
resultSet.close();
preparedStatement.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return products;
}
}
// 产品Servlet
@WebServlet("/products")
public class ProductServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建产品服务对象
ProductService productService = new ProductService();
// 定义SQL语句
String sql = "SELECT * FROM product ORDER BY sales DESC LIMIT ?";
// 获取销量top3的产品
List<Product> topSellingProducts = productService.getTopSellingProducts(sql, 3);
// 设置请求属性
request.setAttribute("topSellingProducts", topSellingProducts);
// 转发到产品页面
RequestDispatcher dispatcher = request.getRequestDispatcher("/products.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
// 产品页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Products</title>
</head>
<body>
<h1>Top 3 Selling Products</h1>
<table border="1">
<tr>
<th>Product ID</th>
<th>Product Name</th>
<th>Price</th>
<th>Sales</th>
</tr>
<%
List<Product> topSellingProducts = (List<Product>) request.getAttribute("topSellingProducts");
for (Product product : topSellingProducts) {
%>
<tr>
<td><%= product.getProductId() %></td>
<td><%= product.getProductName() %></td>
<td><%= product.getPrice() %></td>
<td><%= product.getSales() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
输出结果:
Top 3 Selling Products
Product ID Product Name Price Sales
P004 手表 500.0 200
P005 耳机 300.0 150
P001 手机 1000.0 100
✅ 结论:在实际开发中,Web开发的应用场景非常广泛,需要根据实际问题选择合适的Web开发方法。
总结
本章我们学习了Java Web开发基础与Servlet核心技术,包括Web应用的结构、Servlet的定义与使用、HTTP请求与响应的处理、会话管理、过滤器与监听器的使用,学会了在实际开发中处理Web应用问题。其中,Web应用的结构(目录结构、配置文件)、Servlet的定义与使用(Servlet接口、HttpServlet类、注解配置)、HTTP请求与响应的处理(Request、Response对象)、会话管理(Session、Cookie)、过滤器与监听器的使用、Web开发的实际应用场景是本章的重点内容。从下一章开始,我们将学习Java的框架使用、开发工具等内容。