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

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。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;// 注解配置Servlet@WebServlet("/hello")publicclassHelloWorldServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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>");}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,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。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;// 注解配置Servlet@WebServlet("/user")publicclassUserServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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>");}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,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: [email protected]</p> </body> </html> 

✅ 结论:HTTP请求与响应的处理是指Java Web应用中处理HTTP请求与响应的方法,常用对象包括HttpServletRequest、HttpServletResponse。

15.4 会话管理

会话管理是用于处理Web应用中会话的机制。

15.4.1 Session的定义与使用

定义:Session是用于表示Web应用中会话的对象。
常用方法

  • setAttribute():设置会话属性。
  • getAttribute():获取会话属性。
  • removeAttribute():移除会话属性。
  • invalidate():销毁会话。
  • getMaxInactiveInterval():获取会话的最大不活动时间。
  • setMaxInactiveInterval():设置会话的最大不活动时间。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;// 注解配置Servlet@WebServlet("/login")publicclassLoginServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,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")publicclassIndexServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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")publicclassLogoutServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,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" name="username" required> <br> <label for="password">Password:</label> <input type="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的域名。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;// 注解配置Servlet@WebServlet("/cookie")publicclassCookieServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 设置响应类型 response.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = response.getWriter();// 获取CookieCookie[] 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{// 设置CookieCookie cookie =newCookie("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>");}}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doGet(request, response);}}// 移除Cookie的Servlet@WebServlet("/removeCookie")publicclassRemoveCookieServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 移除CookieCookie cookie =newCookie("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():销毁过滤器。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.*;// 注解配置过滤器@WebFilter("/user/*")publicclassUserFilterimplementsFilter{@Overridepublicvoidinit(FilterConfig filterConfig)throwsServletException{System.out.println("UserFilter初始化");}@OverridepublicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsIOException,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>");}@Overridepublicvoiddestroy(){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: [email protected]</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销毁事件。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebListener;importjavax.servlet.http.*;importjava.io.*;// 注解配置监听器@WebListenerpublicclassMyListenerimplementsServletContextListener,HttpSessionListener,ServletRequestListener{@OverridepublicvoidcontextInitialized(ServletContextEvent sce){System.out.println("ServletContext初始化");}@OverridepublicvoidcontextDestroyed(ServletContextEvent sce){System.out.println("ServletContext销毁");}@OverridepublicvoidsessionCreated(HttpSessionEvent se){System.out.println("HttpSession创建");}@OverridepublicvoidsessionDestroyed(HttpSessionEvent se){System.out.println("HttpSession销毁");}@OverridepublicvoidrequestInitialized(ServletRequestEvent sre){System.out.println("ServletRequest初始化");}@OverridepublicvoidrequestDestroyed(ServletRequestEvent sre){System.out.println("ServletRequest销毁");}}

输出结果

ServletContext初始化 ServletRequest初始化 HttpSession创建 ServletRequest销毁 HttpSession销毁 ServletContext销毁 

✅ 结论:监听器是用于监听Web应用中事件的Java程序,常用方法包括contextInitialized()、contextDestroyed()、sessionCreated()、sessionDestroyed()、requestInitialized()、requestDestroyed()。

15.6 Web开发的实际应用场景

在实际开发中,Web开发的应用场景非常广泛,如:

  • 实现用户的登录与登出。
  • 实现商品的展示与购买。
  • 实现订单的管理。
  • 实现博客的发布与管理。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;// 产品类publicclassProduct{privateString productId;privateString productName;privatedouble price;privateint sales;publicProduct(String productId,String productName,double price,int sales){this.productId = productId;this.productName = productName;this.price = price;this.sales = sales;}publicStringgetProductId(){return productId;}publicStringgetProductName(){return productName;}publicdoublegetPrice(){return price;}publicintgetSales(){return sales;}@OverridepublicStringtoString(){return"Product{"+"productId='"+ productId +'\''+",+ productName +'\''+", price="+ price +", sales="+ sales +'}';}}// 产品服务类publicclassProductService{publicList<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 =newArrayList<>();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(newProduct(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")publicclassProductServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 创建产品服务对象ProductService productService =newProductService();// 定义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);}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doGet(request, response);}}// 产品页面<%@ page contentType="text/html;charset=UTF-8" language="java"%><html><head><title>Products</title></head><body><h1>Top3SellingProducts</h1><table border="1"><tr><th>Product ID</th><th>ProductName</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的框架使用、开发工具等内容。

Read more

Flutter 三方库 algolia_client_recommend 的鸿蒙化适配指南 - 打造 AI 驱动的个性化推荐引擎、助力鸿蒙端电商与内容应用转化率倍增

Flutter 三方库 algolia_client_recommend 的鸿蒙化适配指南 - 打造 AI 驱动的个性化推荐引擎、助力鸿蒙端电商与内容应用转化率倍增

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 algolia_client_recommend 的鸿蒙化适配指南 - 打造 AI 驱动的个性化推荐引擎、助力鸿蒙端电商与内容应用转化率倍增 前言 在 OpenHarmony 鸿蒙应用全场景连接的商业版图中,“信息找人”已成为提升流量价值的核心逻辑。无论是电商应用的“经常一起购买”,还是内容平台的“相关推荐”,高质量的个性化算法能显著降低用户的决策成本。algolia_client_recommend 作为一个连接 Algolia 顶尖 AI 推荐服务的专业客户端,为开发者提供了一套开箱即用的推荐逻辑封装。本文将详述如何在鸿蒙端利用此库构建“读懂用户”的智能化交互。 一、原原理分析 / 概念介绍 1.1 基础原理 algolia_client_recommend 的核心逻辑是 基于意图建模的异步推荐查询与联合过滤机制

By Ne0inhk
新一代 AI 编程工具 Google Antigravity 下载与安装指南

新一代 AI 编程工具 Google Antigravity 下载与安装指南

Google Antigravity 下载与安装指南 2025 年 11 月 18 日,Google 向开发者社区投下了一颗重磅炸弹:在发布 Gemini 3 最强大语言模型的同时,同步推出了 Antigravity——一款免费的「智能体化」开发平台。 这并不是一次临时起意的突袭。早在 2025 年 7 月,Google 就斥资 24 亿美元收购了 Windsurf 团队,CEO Varun Mohan 及核心工程人才悉数加入 Google DeepMind。Antigravity 正是这次战略布局的结晶——它不只是提供代码建议,而是能自主规划、编写、测试并验证整个应用程序。这意味着,开发者可以从繁琐的语法细节中解放出来,将精力聚焦于系统架构与核心业务逻辑。 接下来,我们将详细介绍如何在 Mac、

By Ne0inhk
【TRAE】AI 编程:AI 驱动下的 Vue 全栈实战——从 TRAE 工具入门到项目落地

【TRAE】AI 编程:AI 驱动下的 Vue 全栈实战——从 TRAE 工具入门到项目落地

目录 一、TRAE 简介 (1)产品愿景 (2)核心定位 (3)核心模式 ① SOLO 模式 / Builder 模式 ② IDE 模式 / Chat 模式 (4)核心功能与体验 ① 全场景开发支持 ② Cue 智能续写(升级) ③ 深度上下文感知 ④ 智能排查 Bug (5)智能体生态 ① 可自定义智能体 ② 工具自由装配 (via MCP) ③ Trae Rules ④ 智能体市场 (6)支持模型 (7)平台与获取 (8)隐私与安全 ① 原则 ② 数据隐私 ③ 安全控制 ④ 区域化部署 (9)核心价值 二、TRAE

By Ne0inhk
Flutter 组件 tavily_dart 的适配 鸿蒙Harmony 深度进阶 - 驾驭 AI 原生聚合搜索、实现鸿蒙端跨域知识发现与垂直领域语义降噪方案

Flutter 组件 tavily_dart 的适配 鸿蒙Harmony 深度进阶 - 驾驭 AI 原生聚合搜索、实现鸿蒙端跨域知识发现与垂直领域语义降噪方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 tavily_dart 的适配 鸿蒙Harmony 深度进阶 - 驾驭 AI 原生聚合搜索、实现鸿蒙端跨域知识发现与垂直领域语义降噪方案 前言 在前文中,我们领略了 tavily_dart 在鸿蒙(OpenHarmony)生态中实现基础互联网 AI 搜索集成的魅力。但在真正的“跨国科研智能辅助”、“政务决策舆情态势感知”以及“需要接入高精密专业数据库”的场景中。简单的单次查询往往不足以触达知识的核心。面对需要在大规模并发环境下,针对特定行业域名(如 .gov / .edu)执行深层内容的并行嗅探,并且要求对回显的数万字内容执行基于 AI 强语义的重排序(Re-ranking)与引用链路审计的高阶需求。如果缺乏一套完善的聚合搜索策略与语义降噪模型。不仅会导致 AI 智能体出现由于“信息泛滥”

By Ne0inhk