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

仅限今日开源!基于Python的高性能JSON结构化编辑器架构详解

第一章:Python高性能JSON编辑器概述 在现代软件开发中,JSON(JavaScript Object Notation)作为轻量级的数据交换格式被广泛使用。随着数据规模的不断增长,对JSON文件的高效读取、编辑和写入操作提出了更高要求。传统的文本编辑方式已难以满足大型JSON文件的处理需求,因此构建一个基于Python的高性能JSON编辑器成为提升开发效率的关键工具。 核心特性 * 支持大文件流式解析,避免内存溢出 * 提供语法高亮与结构化视图,增强可读性 * 实现快速搜索与路径定位功能 * 集成校验机制,确保JSON格式合法性 技术选型对比 库名称解析速度内存占用适用场景json (标准库)中等高小到中型文件ujson高低高性能需求ijson低极低超大文件流式处理 基础解析示例 # 使用ijson进行流式解析,适用于大文件 import ijson def stream_parse_json(file_path): with open(file_path, 'rb') as f: # 逐个解析JSON对象中的事件流 parser = ijson.

【Git】一篇文章带你入门Git

【Git】一篇文章带你入门Git

1. 初识 Git 1.1 Git 是什么? Git 是一个开源的分布式版本控制系统,用于高效地跟踪和管理项目代码的变更历史(不仅仅是代码,还有其它格式也是可以的~) 1.2 为什么要有 Git 在学习或者是工作的时候,比如编写各种文档,为了防止文档丢失,更改失误,我们不得不复制出一个副本,保留历史记录,方便找回历史记录,比如: “设计文档-v1” “设计文档-v2” “设计文档-v3” “设计文档-确定版” “设计文档-最终版” 每个版本有各自的内容,但最终会只有⼀份文档是需要被使用的,在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,文件就越来越多,不仅文件多,更重要的是,随着版本数量的不断增多,我们可能记不太清每一个版本具体修改的哪些内容,文档如此,我们编写的项目代码也如此! 那么,如何解决呢? 答:版本控制器 ,记录每次修改以及版本迭代的一个管理系统,目前,最主流的版本控制器就是 Git,

[源力觉醒 创作者计划]_文心4.5开源测评:国产大模型的技术突破与多维度能力解析

[源力觉醒 创作者计划]_文心4.5开源测评:国产大模型的技术突破与多维度能力解析

声明:文章为本人真实测评博客,非广告,并没有推广该平台 ,为用户体验文章 一起来轻松玩转文心大模型吧👉 文心大模型免费下载地址 一、引言:文心4.5开源——开启多模态大模型新时代 2025年6月30日,百度正式宣布文心4.5系列模型全面开源,这一举措标志着国产大模型在技术开放和产业赋能领域迈出重要一步。此次开源涵盖10款模型,包括47B和3B混合专家(MoE)模型及0.3B稠密模型,总参数量达424B。模型采用Apache 2.0协议开源,支持Hugging Face、GitHub等多平台部署,并配套发布ERNIEKit开发套件和FastDeploy部署工具,显著降低开发者的使用门槛。 文心4.5的开源不仅释放了百度多年技术积累,更通过多模态异构专家建模、自适应分辨率视觉编码等创新技术,在文本生成、图像理解、多模态推理等任务中达到SOTA水平。其训练FLOPs利用率(MFU)达47%,推理性能在飞桨框架支持下实现4-bit量化无损压缩,为工业级应用提供了高效解决方案。随着全球大模型竞争进入深水区,文心4.5的开源将推动中文生态建设,助力AI技术普惠。 文章目录