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的框架使用、开发工具等内容。

© 版权声明

相关文章