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+Spotlight网络拼车司机推荐系统-vue pycharm django

python+Spotlight网络拼车司机推荐系统-vue pycharm django

目录 * 技术栈选择 * 系统架构设计 * 推荐算法实现 * 核心功能模块 * 开发流程 * 关键技术点 * 部署方案 * 开发技术路线 * 源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 技术栈选择 后端使用Django框架处理业务逻辑和数据库交互,前端采用Vue.js构建用户界面,PyCharm作为主要开发工具,Python集成Spotlight库实现推荐算法。 系统架构设计 采用前后端分离模式,Django提供RESTful API接口,Vue.js通过axios进行数据交互。数据库使用PostgreSQL存储用户、行程和评价数据。 推荐算法实现 使用Spotlight库的隐式反馈模型: from spotlight.interactions import Interactions from spotlight.factorization.implicit import ImplicitFactorizationModel interactions = Interactions(

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题 AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题,本文介绍了如何利用豆包平台打造专属Python智能管家。首先简述豆包平台的核心优势,接着说明创建前的准备工作,包括注册账号、明确定位和收集训练资料。随后详细讲解创建流程,从新建智能体、基础设置、能力配置到测试优化,还提及集成代码执行环境等高级功能扩展,以及使用技巧与实际应用案例。该智能官能解决多种Python编程问题,可提升学习效率和问题解决速度,是实用的个性化编程助手。 前言     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触 AI 的新手,还是有一定基础想提升的人,都能在这里找到合适的内容。从最基础的工具操作方法,到背后深层的技术原理,专栏都有讲解,还搭配了实例教程和实战案例。这些内容能帮助学习者一步步搭建完整的 AI 知识体系,让大家快速从入门进步到精通,

在昇腾 NPU 上部署与测评 CodeLlama-7b-Python

在昇腾 NPU 上部署与测评 CodeLlama-7b-Python

目标:本文记录了我在昇腾 NPU 环境中从零开始部署 CodeLlama-7b-Python 模型的全过程,包括环境配置、模型加载、推理验证及基础性能评估。所有操作均基于 GitCode Notebook 平台提供的昇腾实例完成,旨在为后续开发者提供一份可复现的参考流程。 一、环境准备:启动合适的 Notebook 实例 首先,我在 GitCode Notebook 平台上选择了一个支持昇腾 NPU 的计算实例。这类实例通常预装了 CANN(Compute Architecture for Neural Networks)工具链和 PyTorch + torch_npu 插件,省去了手动编译驱动的麻烦。 算力资源申请链接: https://ai.gitcode.com/ascend-tribe/openPangu-Ultra-MoE-718B-V1.1?source_module=search_

Python-OKX实战指南:从零构建加密货币量化交易系统

Python-OKX实战指南:从零构建加密货币量化交易系统 【免费下载链接】python-okx 项目地址: https://gitcode.com/GitHub_Trending/py/python-okx 还在为加密货币API的复杂配置而头疼?想用Python快速搭建自己的交易策略却不知从何入手?今天我们就来聊聊如何用python-okx这个神器,轻松玩转OKX交易所的量化交易。 先解决你遇到的真实问题 场景一:账户资金查询总是失败 很多新手在查询账户余额时经常遇到签名错误或权限不足的问题。其实解决方案很简单: import okx.Funding as Funding # 配置API密钥 - 注意这里的flag参数 api_key = "你的API密钥" secret_key = "你的私钥" passphrase = "你的密码短语" flag = "1" # 1是测试环境,0是生产环境 fundingAPI