【Java】小白友好的Servlet基础学习笔记

后面比赛挺多,RW体验赛,西湖论剑,beginCTF,N1CTF,hgame,NSS新春赛,NSS Round17,SICTF,有观赏性大于操作性的,有萌新可以真正去打的。经过慎重考虑,决定java先暂放几天,再回过头去练练老题,也是换换脑子。

目录

Servlet

工作流程:

实现方式:

生命周期:

Tomcat

HttpServletRequest对象

接收请求

请求转发

request域对象

HttpServletResponse对象

响应数据

重定向

请求转发和输出重定向的区别

Cookie对象

创建和发送Cookie

获取Cookie 

设置Cookie的过期时间

Cookie的路径

HttpSession对象

JSESSIONID

session域对象

session对象的销毁

ServletContext对象

ServletContext对象的获取

ServletContext域对象

Servlet的三大域对象


Servlet

Servlet 是 Java Web 应用程序开发中非常重要的组件,它可以接收来自客户端的 HTTP 请求并生成相应的 HTTP 响应。

工作流程:

  1. 客户端发送 HTTP 请求到服务器。

  2. 服务器接收请求,并根据请求 URL 找到对应的 Servlet。

  3. 服务器创建一个 HttpServletRequest 对象和一个 HttpServletResponse 对象,并将它们作为参数传递给 Servlet 的 service() 方法。

  4. 在 service() 方法中,Servlet 根据请求类型(GET、POST 等)调用 doGet() 或 doPost() 等方法来处理请求。

  5. 处理完成后,Servlet 将生成的响应内容写入 HttpServletResponse 对象,然后将其返回给服务器。

  6. 服务器将响应发送给客户端,并关闭连接。

实现方式:

Servlet 可以通过两种方式来实现:继承 HttpServlet 类或实现 Servlet 接口。其中,继承 HttpServlet 类的方式是最常用的方式,它可以大大简化 Servlet 的编写过程。

下面是一个实现 Servlet 接口的示例代码:

import javax.servlet.Servlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;public class HelloServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {// 初始化方法,可选}@Overridepublic void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {// 处理请求的方法resp.getWriter().println("Hello, Servlet!");}@Overridepublic void destroy() {// 销毁方法,可选}@Overridepublic ServletConfig getServletConfig() {// 获取 Servlet 配置信息,可选return null;}@Overridepublic String getServletInfo() {// 获取 Servlet 信息,可选return null;}
}

生命周期:

Servlet 的生命周期可以分为三个阶段:初始化阶段、服务阶段和销毁阶段。

  1. 初始化阶段:在 Servlet 被创建时调用,用于完成一些初始化操作。可以通过实现 init() 方法来实现。

  2. 服务阶段:在接收到客户端请求时调用,用于处理请求并生成响应。可以通过实现 service() 方法来实现。

  3. 销毁阶段:在 Servlet 被销毁时调用,用于完成一些清理操作。可以通过实现 destroy() 方法来实现。

下面是一个 Servlet 生命周期的示例代码:

public class HelloServlet extends HttpServlet {@Overridepublic void init() throws ServletException {// 初始化方法System.out.println("Servlet 初始化");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 处理 GET 请求resp.getWriter().println("Hello, Servlet!");}@Overridepublic void destroy() {// 销毁方法System.out.println("Servlet 销毁");}
}

Tomcat

Tomcat 是一个开源的 Java Web 服务器,是 Apache 软件基金会的 Jakarta 项目的一部分,也是目前最为流行的 Java Web 服务器之一。它实现了 Java Servlet、JavaServer Pages(JSP)和 WebSocket 等规范,提供了一个容器来运行基于 Java 技术的 Web 应用程序。

HttpServletRequest对象

接收请求

当客户端发送 HTTP 请求到服务器时,Servlet 容器会创建一个 HttpServletRequest 对象来表示该请求,并将其作为参数传递给 Servlet 的 service() 方法。HttpServletRequest 提供了一系列方法来获取请求的各种信息。

下面是 HttpServletRequest 接收请求的示例代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取请求的方法String method = request.getMethod();// 获取请求的 URLString url = request.getRequestURL().toString();// 获取请求的查询字符串String queryString = request.getQueryString();// 获取请求的参数String paramValue = request.getParameter("paramName");// 获取请求的头部信息String headerValue = request.getHeader("headerName");// 获取请求的客户端 IP 地址String ipAddress = request.getRemoteAddr();// ... 其他操作
}

请求转发

请求转发是指将当前的请求转发给另一个资源进行处理,可以是 Servlet、JSP 或其他 Web 资源。使用 HttpServletRequest 的 forward() 方法进行请求转发:

RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/resource");
dispatcher.forward(request, response);

在请求转发中,原始请求的属性和参数会保留,并且目标资源可以通过 request 对象获取这些数据。

request域对象

HttpServletRequest 还提供了 request 域对象,它是一个存储和共享数据的容器,在同一次请求中的不同组件之间共享数据。可以通过以下方式向 request 作用域中存储数据:

request.setAttribute("key", value);

其他组件可以通过 request 对象获取该数据:

Object value = request.getAttribute("key");

request 作用域的生命周期只在当前请求内有效,一旦请求结束,request 作用域中的数据将被销毁。

HttpServletResponse对象

响应数据

HttpServletResponse 对象代表了服务器对客户端的响应,它提供了一系列方法来设置响应的各种信息。

在 HttpServletResponse 中,我们可以使用 getWriter() 或者 getOutputStream() 方法获取一个输出流来向客户端发送响应数据。

下面是 HttpServletResponse 发送响应数据的示例代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置响应的编码response.setCharacterEncoding("UTF-8");// 设置响应的内容类型response.setContentType("text/html;charset=UTF-8");// 向客户端发送响应数据PrintWriter out = response.getWriter();out.write("<html>");out.write("<head><title>Hello World</title></head>");out.write("<body>");out.write("<h1>Hello World</h1>");out.write("</body>");out.write("</html>");out.close();
}

如果在调用 getOutputStream() 方法之前已经调用了 getWriter() 方法,或者在调用 getWriter() 方法之前已经调用了 getOutputStream() 方法,将会抛出 IllegalStateException 异常。因此,在使用 HttpServletResponse 输出响应数据时,只能使用其中的一个方法,不能两个方法同时使用。

重定向

重定向是指将当前请求重定向到另一个 URL 上,可以是同一个 Web 应用程序内的 URL,也可以是其他 Web 应用程序的 URL。使用 HttpServletResponse 的 sendRedirect() 方法进行重定向:

response.sendRedirect("/path/to/resource");

请求转发和输出重定向的区别

请求转发和重定向是两种常用的 web 应用程序之间的跳转方式。

请求转发是服务器内部的跳转,请求对象、响应对象等信息都会被保留,并且不会改变浏览器地址栏中的 URL。它的过程是,由一个 Servlet 对象调用另一个 Servlet 对象的方法,然后将请求和响应传递给另一个 Servlet 处理。

相比之下,重定向是服务器对浏览器的响应,浏览器接收到响应后会重新向指定的 URL 发起请求,因此会改变浏览器地址栏中的 URL。重定向会丢失原始请求的属性和参数,因为它是两个完全独立的请求。

总之一句话:

请求转发是服务器内部的跳转,保留了浏览器地址栏中的 URL 和原始请求的属性和参数;重定向是服务器对浏览器的响应,改变了浏览器地址栏中的 URL 并且丢失了原始请求的属性和参数。

Cookie对象

创建和发送Cookie

使用 Cookie 的构造函数创建了一个名为 "username",值为 "Z3r4y" 的Cookie对象。然后使用 setPath() 方法设置Cookie的路径为根路径 "/",表示该Cookie在整个应用程序中都可用。最后,使用 response.addCookie() 方法将Cookie发送到客户端。

Cookie cookie = new Cookie("username", "Z3r4y");
cookie.setPath("/");
response.addCookie(cookie);

获取Cookie 

使用 request.getCookies() 方法获取客户端发送的所有Cookie,并将它们存储在一个 Cookie 数组中。然后,我们可以遍历数组,逐个获取每个Cookie的名称和值

Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();// 处理Cookie的逻辑}
}

设置Cookie的过期时间

在 Cookie 中,可以通过 setMaxAge(int maxAge) 方法来设置 Cookie 的过期时间。该方法的参数是一个整数值,表示 Cookie 在客户端上存在的时间(以秒为单位)。

当设置这个值为负数时,表示该 Cookie 会在浏览器关闭时自动删除。当设置为0时,表示该 Cookie 立即过期,将被删除。当设置为正数时,表示该 Cookie 在指定的秒数后过期,并将被删除。

需要注意以下几点:

  1. 如果不设置过期时间,Cookie 将会在浏览器关闭时自动删除。
  2. 如果指定了过期时间,那么该 Cookie 将被保存在客户端的硬盘中,并在过期时间到达之前一直存在。
  3. 如果指定的过期时间早于当前时间,那么该 Cookie 将会立即过期并被删除。

举例:

// 创建一个名为 "username",值为 "Z3r4y" 的Cookie对象
Cookie cookie = new Cookie("username", "Z3r4y");// 设置Cookie的过期时间为1小时(以秒为单位)
cookie.setMaxAge(3600);// 发送Cookie到客户端
response.addCookie(cookie);

 

Cookie的路径

Cookie 的路径表示 Cookie 在服务器上可用的路径范围。默认情况下,Cookie 的路径是当前请求的路径。可以使用 setPath() 方法来设置 Cookie 的路径。

例如,如果将路径设置为 "/",则该 Cookie 在整个应用程序中都可用。如果将路径设置为 "/path",则该 Cookie 仅在以 "/path" 开头的 URL 中可用。

HttpSession对象

JSESSIONID

JSESSIONID 是用来唯一标识会话的标识符,它存储在客户端的 Cookie 中。当客户端与服务器建立起会话时,服务器会为该会话创建一个唯一的 JSESSIONID,并将其存储在名为 "JSESSIONID" 的 Cookie 中,然后将该 Cookie 发送给客户端。在客户端再次向服务器发送请求时,会包含该 Cookie,服务器通过解析该 Cookie 中的 JSESSIONID 来获取对应的 HttpSession 对象。

// 获取 JSESSIONID(从请求中的 Cookie 中获取)
Cookie[] cookies = request.getCookies();
String jsessionId = null;if (cookies != null) {for (Cookie cookie : cookies) {if (cookie.getName().equals("JSESSIONID")) {jsessionId = cookie.getValue();break;}}
}

session域对象

通过 request.getSession() 方法获取 HttpSession 对象。如果客户端已经有一个有效的会话(即已存在与 JSESSIONID 相关联的 HttpSession 对象),则返回该 HttpSession 对象;否则,创建一个新的 HttpSession 对象。

// 使用 HttpSession 对象存储和获取会话数据
HttpSession session = request.getSession();// 存储会话数据
session.setAttribute("username", "John");// 获取会话数据
String username = (String) session.getAttribute("username");// 销毁会话
session.invalidate();

 

session对象的销毁

当涉及到会话对象的销毁时,有几种情况需要考虑。

1.默认时间到期:会话对象通常具有一个默认的到期时间。这个时间是由服务器配置文件中的会话超时设置决定的。一旦会话超过设定的时间没有活动,服务器将自动将其标记为无效并销毁。具体的默认超时时间可以在服务器配置文件中进行设置。

2.自定义到期时间:除了使用默认的到期时间,还可以在代码中自定义会话的到期时间。可以通过 setMaxInactiveInterval(int interval) 方法来设置会话的最大非活动间隔时间(以秒为单位)。一旦会话超过指定的时间没有活动,服务器将自动将其标记为无效并销毁。示例代码如下:

// 设置会话的最大非活动间隔时间为30分钟
session.setMaxInactiveInterval(1800);

3.立即失效:也可以通过调用 invalidate() 方法来立即使会话对象失效。这会将会话对象标记为无效,并清除与会话相关联的任何数据。示例代码如下:

// 立即使会话对象失效
session.invalidate();

4.关闭浏览器:当客户端关闭浏览器时,会话对象通常会保持有效状态一段时间,具体取决于服务器的配置。在这段时间内如果客户端再次打开浏览器并发送请求,会话对象仍然是有效的。但是,一旦会话超过设定的超时时间或服务器重启,会话将被销毁。

5.关闭服务器:当服务器关闭或重启时,所有会话对象都将被销毁。这意味着与该服务器相关联的所有会话数据都将丢失,并且所有客户端将需要重新建立会话。

ServletContext对象

ServletContext对象的获取

通过以下方式来获取ServletContext对象:

1.通过request对象获取ServletContext对象

ServletContext context = request.getServletContext();

2.通过session对象获取ServletContext对象

ServletContext context = session.getServletContext();

3.通过servletConfig对象获取ServletContext对象

public void init(ServletConfig config) throws ServletException {ServletContext context = config.getServletContext();
}

ServletContext域对象

ServletContext域对象是一个全局的域对象,用于在整个Web应用程序中共享数据。

@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取ServletContext对象ServletContext context = getServletContext();// 设置属性值String value = "Hello, ServletContext!";context.setAttribute("key", value);// 转发到Servlet2RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");dispatcher.forward(request, response);}
}@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取ServletContext对象ServletContext context = getServletContext();// 获取属性值String value = (String) context.getAttribute("key");response.getWriter().println(value);}
}

Servlet的三大域对象

1.request域对象

在一次请求中有效,请求转发有效,重定向失效(因为本质是浏览器发两次请求)

2.session域对象

在一次会话中有效,请求转发和重定向都有效(如果session不变),session销毁后失效。

3.servletContext域对象

在整个应用程序中有效,服务器关闭后失效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[安全警报] Npm木马利用“Oscompatible“包悄然安装AnyDesk

最近&#xff0c;一个名为OsCompatible的恶意包被上传到npm 。该包被发现包含一个针对 Windows 的远程访问木马。 这个名为OsCompatible的软件包于2024年1月9日发布&#xff0c;在被撤下之前共吸引了380次下载。 据了解&#xff0c;OsCompatible包含“几个奇怪的二进制文件”…

Linux本地部署MeterSphere测试平台并实现公网远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

MySQL中的ON DUPLICATE KEY UPDATE语句详解

前言 在MySQL数据库中&#xff0c;INSERT INTO ... ON DUPLICATE KEY UPDATE 是一个强大的SQL语句&#xff0c;它结合了插入新记录和更新已存在记录的功能于一体。这种机制在处理唯一键约束时尤为有用&#xff0c;能够避免因尝试插入重复主键或唯一键值而产生的错误&#xff0…

重学JavaScript高级(十五): XHR以及Fetch的理解应用

JavaScript XHR、Fetch 服务器端渲染-前后端分离 **服务器端渲染&#xff1a;**将html文件在后端&#xff0c;拼接好&#xff0c;将整个文件全部返回给前端 随着目前业务逻辑的复杂度提升&#xff0c;这种开发模式&#xff0c;会导致效率低下同时&#xff0c;有时候前端页面仅…

SQL语句 - 查询语句

Data Query Language 文章目录 Data Query Language数据查询&#xff08;DQL&#xff09;基础查询1 基本查询2 排序查询3 条件查询4 分支结构查询5 查询函数6 分组查询7 分组过滤查询8 限定查询9 基础查询总结 面试题&#xff1a;一条SQL查询语句的执行流程高级查询1 子查询2 合…

linux基础学习(7):find命令

1.按照文件名搜索 find 搜索路径 选项 文件名 选项&#xff1a; -name&#xff1a;按文件名搜索 -ineme&#xff1a;不区分文件名大小写搜索 -inum&#xff1a;按inode号搜索 按文件名搜索跟按关键词搜索不一样&#xff0c;只能搜到文件名完整对应的文件 *根据文件名…

Future,RunnableFuture,FutureTask学习

Future接口 public interface Future<V> {//取消任务执行 //当任务还没有启动&#xff0c;返回ture//当任务正在运行中&#xff0c;会根据mayInterruptIfRunning参数决定是否中断当前运行的线程来取消当前运行的任务//当任务已经完成或异常&#xff0c;其他一些原因不能…

PyTorch的衍生资源

PyTorch作为深度学习领域的一个重要框架&#xff0c;自2016年首次发布以来经历了显著的发展。以下是PyTorch发展过程中的几个关键里程碑事件&#xff1a; 2016年&#xff1a; PyTorch于2016年首次发布&#xff0c;作为一个基于动态计算图的开源机器学习库&#xff0c;它提供了自…

电磁波的空间辐射的几种传输形式

一般来说&#xff0c;波的传播方式与波长有关&#xff0c;如低频段的地波传播&#xff0c;极低频段的地—电离层波导传播&#xff0c;短波段的天波传播&#xff0c;甚高频&#xff0c;超高频的直线传播和散射传播方式等。绕射和透射是电磁波传输特性与环境的关系&#xff0c;属…

利用 Token Explorer 信号驾驭市场波动

市场波动使加密货币投资组合面临风险&#xff0c;但是通过 Token Explorer 分析&#xff0c;我们可以对波动进行建模&#xff0c;提前预测市场风险&#xff0c;并找到最安全的投资策略。通过综合考虑 Token 价格、交易量、社交媒体信息和链上交易等各种数据&#xff0c;我们可以…

Docker安装MySQL教程分享(附MySQL基础入门教程)

docker安装MySQL Docker可以通过以下命令来安装MySQL容器&#xff1a; 首先确保已经在计算机上安装了Docker。如果没有安装&#xff0c;请根据操作系统的不同进行相应的安装。 打开终端或命令提示符&#xff0c;并运行以下命令拉取最新版本的MySQL镜像&#xff1a; docker pu…

【转载】linux摄像头驱动

Linux摄像头驱动学习第一篇&#xff0c;对虚拟视频驱动Virtual Video Driver(vivid)进行测试、分析、编写。 V4L2(Video for Linux two)是Linux内核中关于视频设备的内核驱动框架&#xff0c;为上层的访问底层的视频设备提供了统一的接口。 V4L2可以支持多种设备,它可以有以下…

【进入游戏行业选游戏特效还是技术美术?】

进入游戏行业选游戏特效还是技术美术&#xff1f; 游戏行业正处于蓬勃发展的黄金时期&#xff0c;科技的进步推动了游戏技术和视觉艺术的飞速革新。在这个创意和技术挑战交织的领域里&#xff0c;游戏特效和技术美术岗位成为了许多人追求的职业目标。 这两个岗位虽然紧密关联…

开始读 Oracle PL/SQL Programming 第6版

最近觉得PL/SQL越来越重要&#xff0c;因为这本书早就在待读列表中&#xff0c;因此决定系统的学一下。 2024年1月24日晚开始读。 在亚马逊上的评价还不错&#xff1a; 本书的第一作者是Steven Feuerstein&#xff0c;是Oracle资深的Developer Advocate。 本书的示例代码可…

vue中如何写过滤器

全局注册 (可以在main.js中进行全局注册 vue.fifler(test’&#xff0c;function(v){return v0? ‘终止’&#xff1a;v1?进行中:异常 })在组件页面使用 <view>{{state|test}}</view> <script> export default {data(){return {state: 1// state 1 进行中…

如何实现激光雷达运动补偿,这篇就够了

目录 激光雷达为什么会存在运动畸变 激光雷达如何运动去畸变 C++实践激光雷达运动补偿(辅助传感器) 实践激光雷达ICP运动补偿 参考文献 激光雷达为什么会存在运动畸变 首先要理解为什么会产生运动畸变。激光雷达扫描物体形成点云的过程自身伴随着旋转运动,每次激…

索引统计信息是什么

索引统计信息&#xff08;Index Statistics&#xff09;是数据库中存储的关于表索引特征和数据分布的统计数据。这些统计信息帮助数据库的查询优化器&#xff08;Query Optimizer&#xff09;估计执行特定查询所需的成本&#xff0c;包括预测满足查询条件的行数、决定使用哪个索…

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理

一、背景需求 随着城市建设的步伐日益加快&#xff0c;开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地&#xff0c;数千路监控摄像头遍布各角落&#…

【Docker】Docker学习⑤ - Docker数据管理

【Docker】Docker学习⑤ - Docker数据管理 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理1. 数据类型1.1 什么是数据卷&#xff08;data volume&#xff09;1.1.1 创建APP目录并生成web页面1.1.2 启动容器并验证数据1.…

面试常问的Spring AOP底层原理

AOP底层原理可以划分成四个阶段&#xff1a;创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段 第一阶段&#xff1a;创建代理对象阶段 通过getBean&#xff08;&#xff09;方法创建Bean实例根据AOP的配置匹配目标类的类名&#xff0c;判断是否满足切…