Java Web基础知识(Servlet、Cookie、Session、Filter、Listener)

文章目录

  • Servlet
    • 什么是Servlet?
    • Servlet的生命周期
    • ServletConfig对象
    • ServletContext对象
    • Servlet请求转发和重定向
      • Servlet请求转发(forward和include)
      • Servlet重定向(redirect)
      • 重定向和转发的区别?
    • 读取文件、下载文件
  • 会话管理
    • Cookie
      • 什么是Cookie?
      • Cookie的特点:
      • Cookie具体使用:
    • Session
      • HttpSession 保存信息过程
      • HTTP Session的特点:
      • HttpSession的用法:
      • Session的销毁方式
      • Session生命周期?
    • Cookie、Session区别?
  • Servlet三个域对象
  • Filter
  • Listener

Servlet

什么是Servlet?

  1. Servlet是运行在Web服务起中的小城Java程序,侠义的Servlet是实现了Java语言实现的一个接口,广义的Servlet是任何实现了这个Servlet接口的类,作用是:接受用户的请求,并对请求做出处理,将处理结果响应给客户端。
  2. Servlet有三种实现方式:实现Servlet接口,继承抽象类GennericServlet,继承HttPServlet。
  3. Servlet是可以接受HTTP请求并做出相应的一种结束,是Java语言编写的一种动态资源。
  4. Servlet是前后端衔接的一种技术,不是所有的Java类都可以接受请求和做出相应,但是Servlet可以。
    在MVC模式中,Servlet作为Controller层主要技术,用来和浏览器完成数据交互,控制交互逻辑。
  5. Servlet的工作模式:客户端发送请求至服务器,服务器运行并调用Servlet,Servlet根据客户端请求生成相应内容并将其传给服务器,相应内容动态生成,通常取决于客户端的请求,服务器将相应返回客户端。
  6. Servlet是Tomcat的一个组件,Servlet的功能需要依赖包servlet-api.jar,由Tomcat提供,Tomcat在初始化Servlert时候首先读取web.xml文件,根据web.xml文件中的参数信息初始化ServletConfig,ServletContext对象,同时帮助我们创建HttpServletRequest和HttpServletResponse对象一并交给Servlet实例,此时Servlet就具有了相关的功能。

Servlet的生命周期

Servlet的生命周期室友容器管理的,Servlet容器会根据下面的规则来调用三个方法:

  1. 初始化方法init(),只会执行一次(启动Tomcat的时候默认是不执行的,在访问的时候才会执行,但是可以根据web.xml中的配置更改为容器启动并初始化),当Servlet第一次被请求时,Servlet容器会实例化这个Servlet,然后就会调用init()方法来初始化Servlet,然后后续请求时,这个方法就不会再被执行,一般用来完成初始化工作。
  2. 服务方法service(),每当请求Servlet时,Servlet容器就会调用这个方法,第一次请求时,Servlet就会初始化一个Servlet对象,然后掉用service()方法来完成工作,后续请求就直接调用service()方法。
  3. 销毁方法destory(),当要销毁Servlet时候,Servlet容器就会调用这个方法,卸载应用程序或者关闭Servlet容器时候,就会执行这个方法,一般用来写一些清楚工作代码。

ServletConfig对象

每个Servlet都有一个ServletConfig对象,ServletConfig对象对应web.xml中的节点,Servlet初始化后就会Servlet的配置信息封装到ServletConfig中,例如:

<!--servlet 配置-->
  <servlet>
    <servlet-name>ServletLifeCycle</servlet-name>
    <servlet-class>com.xxliao.servlet.ServletLifeCycle</servlet-class>
    <!--初始化等级,1可以跟随容器启动初始化-->
    <load-on-startup>1</load-on-startup>

    <!--servlet初始化参数,放在ServletConfig对象中-->
    <init-param>
      <param-name>author</param-name>
      <param-value>xxliao</param-value>
    </init-param>
  </servlet>
ServletConfig获取参数方式,例如:

ServletConfig servletConfig = this.getServletConfig();
System.out.println(servletConfig.getServletName());
System.out.println(servletConfig.getInitParameter("author"));

ServletContext对象

Servlet上下文对象,一个Webapp程序一个ServletContext对象。Web容器启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,这个对象全局唯一,web程序中的所有Servlet共享这个对象,因此也叫全局应用共享对象。具体配置参数使用标签进行配置,例如:

<!--  参数配置 这个web容器共享,放在Servlet Context-->
  <context-param>
    <param-name>author</param-name>
    <param-value>xxliao</param-value>
  </context-param>
// ServletContext获取参数例子:

 ServletContext servletContext = this.getServletContext();
 System.out.println(servletContext.getInitParameter("author-context"));

ServletContext的生命周期:Servlet容器启动时候,就会创建ServletContext对象,然后一直缓存这个对象,直到容器关闭后该对象生命周期结束。

Servlet请求转发和重定向

Servlet请求转发(forward和include)

请求转发是在服务器中进行的转发,由一个Servlet转发到另一个Servlet,然后返回客户端的请求方式,浏览器端的地址蓝不会发生改变,只发送了一次请求,两次跳转之间传输的数据不会丢失,可以通过request对象进行传递,根据response是否能够传递,请求转发分为forward转发(不传递)和include转发(传递),具体代码为:
request.getRequestDispatcher(“接quest受请求的Servlet的路径”).forward(request,response)
request.getRequestDispatcher(“接quest受请求的Servlet的路径”).include(request,response)

两种方式的区别:
1.forward在servlet传递间,不能输出响应体,include可以输出相应体
2.forward不能设置响应体,但是可以设置响应头,include响应头和响应体均可以设置。
在这里插入图片描述

Servlet重定向(redirect)

Servlet的重定向是,服务器告诉客户端,你需要重新发送一个请求,到一个targer路径,因此浏览器需要发送两次请求,且请求地址会发生改变,具体使用代码为:response.sendRedirect(targetUrl);

重定向和转发的区别?

  1. 对于客户端来说,转发是一次请求一次响应,重定向是两次请求两次响应。
  2. 请求转发浏览器地址栏不会发生变化,重定向会变化成功转发后的URL。
  3. 转发不支持跨域跳转,只能在项目内转发,重定向则不受限制。
  4. 转发之间可以传递request对象,重定向不能,本质是两次请求。

读取文件、下载文件

//读取文件:
InputStream is = this.getServletContext().getResourceAsStream("/WEBINF/classes/com/kuang/servlet/aa.properties");

//下载文件:
ServletOutputStream out = resp.getOutputStream();
out.write

会话管理

Http协议本身不具备直接记录用户状态的功能,JavaWeb提供了Cookie和Session技术来帮助我们记录用户的状态。

Cookie

什么是Cookie?

Cookie是一种保存少量信息到浏览器端的技术,请求时服务器段可以给浏览器一些Cookie信息保存下来,后续请求可以携带之前的Cookie信息到服务器端。

Cookie的特点:

  1. Cookie使用字符串保存诗句,使用的是key-value的数据结构存储,单个Cookie的存储大小限制是4097字节。
  2. ]Cookie存储的数据不支持中文,Servlet4.0中支持,4.0之前保存中文可以采用编码和解码处理方式,具体为:
    将内容按照指定的编码方式做URL编码处理:URLEncoder.encode(“content”,“code”)
    将内容按照指定的编码方式做URL解码处理:URLDecoder.decode(“content”,“code”)
  3. Cookie分为状态Cookie(保存在内存中)和持久化Cookie(保存在磁盘上)。
  4. Cookie是与域名绑定,所以Cookie不支持跨一级域名访问。
  5. 浏览器能保存的Cookie个数是有限的,不同浏览器支持的数量不同。
  6. 浏览器每次请求时,都会将访问域名相关的Cookie携带到服务端。
  7. Cookie是基于明文的方式存储的,所以安全性较低。

Cookie具体使用:

  1. Cookie的创建:
    Cookie cookie = new Cookie(“key”,”value“);
    resp.addCookie(cookie); //添加到response 对象中
  2. Cookie获取:
    Cookie[] cookies = req.getCookies();
  3. 设置Cookie的过期时间
    cookie.setMaxAge(time);ime是描述,一旦设置后cookie将保存到磁盘中,当失效时间到达后再删除。

Session

HttpSession 保存信息过程

HttpSession是一种保存少量信息到服务器的一种技术,具体保存过程是:

  1. 第一次请求时,服务器端会拆功能键HttpSession对象,然后将数据保存在该对象后,服务器端会将HttpSession的JSESSIONID以Cookie形式响应给浏览器。
  2. 第二次请求,浏览器会携带之前JSESSJIONID的Cookie,服务器端根据JSESSIONID对象获取对对应的HttpSession对象,然后从HttpSession对象中获取缓存的数据,

HTTP Session的特点:

1.HttpSession保存到服务器端,也是使用key-value的存储结构存储数据,其中value可以是任何数据类型。
2.HttpSession保存数据没有大小限制。

HttpSession的用法:

  1. 创建Session:
    HttpSession session = request.getSession();第一次获取则创建该对象,后面根据JSESSIONID获取已经创建的对象。
    HttpSession session = request.getSession(false);根据JSESSIONID获取对象, 有则返回,没有不会创建新对象。
  2. 将数据存储在Session中:
    session.setAttribute(“key”,value);
  3. 根据key,从session中获取数据:
    Object obj = session.getAttribute(“key”);
  4. 根据key删除Session数据:
    session.removeAttribute(“key”);

Session的销毁方式

1.通过web.xml中设置超市时间(最大不活动时间)

<!--设置session超时时间-->
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
  1. session.invalidate(),销毁当前HTTP Session对象

Session生命周期?

Session的生命周期没有固定的创建和销毁时间,合适创建取决于合适调用getSession()方法,HttpSession的销毁时间取决于设置的最大不活动时间或者调用invalidate()方法,如果均没有,那么HttpSession会一直存储,默认超时时间为30分钟。

Cookie、Session区别?

  1. Cookie保存到客户端,Session保存到服务端,
  2. Cookie不安全,HttpSession安全
  3. Cookie保存数据有限制(单个容量4K,浏览器个数闲置)

Servlet三个域对象

  1. request:一次请求有效,请求转发可以进行数据传递,生命周期和request对象周期相同。
  2. session:单词会话有效,可以跨多个请求。
  3. application:当前web服务内,跨请求,跨会话。
// 1.设置数据
域对象.setAttribute("key",value)
// 2.获取数据
域对象.getAttribute("key")

Filter

1. implements Filter接口,然后重写init、doFilter、destroy方法

public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("DemoFilter的init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("DemoFilter的doFilter...");

        // 通过filter
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("DemoFilter的destroy...");
    }
}

2. web.xml配置
  <!--filter配置-->
  <filter>
    <filter-name>DemoFilter</filter-name>
    <filter-class>com.xxliao.filter.DemoFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DemoFilter</filter-name>
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

Listener

  1. JavaWeb8大监听器:
  • ServletContextListener
  • ServletContextAttributeListener
  • HttpSessionListener
  • HttpSessionAttributeListener
  • ServletRequestListener
  • ServletRequestAttributeListener
  • HttpSessionBindingListener
  • HttpSessionActivationListener
  1. web.xml配置
<!--listener-->
  <listener>
    <listener-class>com.xxliao.listener.DemoListener</listener-class>
  </listener>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防对抗少丢分,爱加密帮您筑起第二防线

应用程序通常处理和存储大量的敏感数据&#xff0c;如用户个人信息、财务信息、商业数据、国家数据等&#xff0c;用户量越大的应用程序&#xff0c;其需要存储和保护的用户数据越多。因此应用层长期是攻击方的核心目标&#xff0c;传统应用安全依靠防火墙(FireWall)、入侵检测…

一周学会Django5 Python Web开发 - Django5内置Admin系统二次开发

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计56条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

规则引擎Drools,基于mysql实现动态加载部署

文章目录 一、使用1、参考资料2、引包3、创建规则实体类4、实现drools动态规则5、模拟数据库&#xff0c;实现规则的CRUD6、创建控制层7、测试规则的动态添加&#xff08;1&#xff09;添加规则&#xff08;2&#xff09;修改规则&#xff08;3&#xff09;删除规则 8、模拟2个…

01PCB设计概述

PCB设计概述 EDA electronic design automatic 电子设计自动化&#xff08;利用计算机来实现电子设计&#xff09; 分为 &#xff1a; 微电子&#xff08;芯片设计&#xff09;、硬件板卡&#xff08;PCB设计&#xff09; 画原理图、画PCB布线 要会绘制原理图库、和封装图库 元…

短信发送验证码及邮件发送验证码

发送短信验证码 阿里云发送验证码 public Integer sendTelCode(String tel) {String url "https://dfsns.market.alicloudapi.com/data/send_sms";String appcode "a3198282fbdf443d97aa9f3cfbe1232e";int code RandomUtil.randomInt(1000,10000);emai…

Ubuntu系统安装

目录 安装准备 安装步骤 虚拟机配置 系统安装 安装准备 Ubuntu系统镜像&#xff0c;虚拟机环境 虚拟机环境 使用的虚拟机软件为VMware Workstation 系统镜像 阿里镜像站&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com)https://developer.aliyun.com…

掌握 NestJS 10.x:从零开始构建高效可扩展的服务器端应用详解

NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用的框架&#xff0c;基于 TypeScript 构建&#xff0c;并且受 Angular 的启发&#xff0c;提供了模块化、易测试、易维护的架构。NestJS 10.x 引入了一些新特性和改进&#xff0c;进一步提升了开发体验。本文将详细介绍如…

HarmonyOS鸿蒙学习笔记(27)resources目录说明

resources目录说明 目录结构目录说明base目录rawfile目录resfile目录资源组目录 参考资料 目录结构 在HarmonyOS的项目结构中&#xff0c;有resources目录&#xff0c;用于存放应用/服务所用到的资源文件&#xff0c;如图形、多媒体、字符串、布局文件等。关于资源文件&#x…

计网ppt标黄知识点整理第(1)章节——谢希仁版本、期末复习自用

大众熟知的三大网络&#xff1a;电信网络、有线电视网络、计算机网络。发展最快起到核心的是计算机网络。Internet是全球最大、最重要的计算机网络。互联网&#xff1a;流行最广、事实上的标准译名。互连网&#xff1a;把许多网络通过一些路由器连接在一起。与网络相连的计算机…

AI网络爬虫:无限下拉滚动页面的另类爬取方法

现在很多网页都是无限下拉滚动的。可以拉动到底部&#xff0c;然后保存网页为mhtml格式文件。 接着&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程高手&#xff0c;要完成一个关于爬取网页内容的Python脚本的任务&#xff0c;下面是具体步骤&#xff1a; …

C++——list

目录 前言 一、list 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list与vector的对比 总结 前言 今天…

LNMP部署及应用

目录 1.LNMP概述 Nginx 特点 Nginx 作用 2.分布式部署LNMP操练 Nginx主机&#xff1a;CentOS 7-1 PHP主机: CentOS 7-2 1.LNMP概述 Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&…

基于广义极大极小凹惩罚的心电信号降噪方法(MATLAB R2021B)

凸优化是数学最优化的一个子领域&#xff0c;研究定义于凸集中的凸函数最小化问题。由于心电信号降噪的过程可以理解为求信号的稀疏近似解&#xff0c;因此基于凸优化和稀疏性表达的去噪方法可用于心电信号处理。在凸优化的数学模型中&#xff0c;惩罚项的选取对最终结果会产生…

LLVM技术在GaussDB等数据库中的应用

目录 LLVM和数据库 LLVM适用场景 LLVM对所有类型的SQL都会有收益吗&#xff1f; LLVM在OLTP中就一定没有收益吗&#xff1f; GaussDB中的LLVM 1. LLVM在华为应用于数据库的时间线 2. GaussDB LLVM实现简析 3. GaussDB LLVM支持加速的场景 支持LLVM的表达式&#xff1a…

python zip()函数(将多个可迭代对象的元素配对,创建一个元组的迭代器)zip_longest()

文章目录 Python zip() 函数深入解析基本用法函数原型基础示例 处理不同长度的迭代器高级用法多个迭代器使用 zip() 与 dict()解压序列 注意事项内存效率&#xff1a;zip() 返回的是一个迭代器&#xff0c;这意味着直到迭代发生前&#xff0c;元素不会被消耗。这使得 zip() 特别…

浅谈SpringBoot配置文件

文章目录 一、配置文件作用二、配置文件分类三、SpringBoot内置的配置文件格式3.1、.properties3.1.1、.properties配置语法3.1.2、.properties读取方式 3.2、.yml/.yaml3.2.1、.yml配置语法3.2.2、.yml读取形式 四、两种配置文件优缺点4.1、.properties4.2、.yml4.2.1、.yml支…

多门店小程序如何给各个门店进行结算

​有些商家业务扩张&#xff0c;会开设多个门店。其中有些门店是直营&#xff0c;有些门店是加盟。如果用一个小程序来涵盖所有门店的业务&#xff0c;那将有助于商家进行统一管理和建立品牌效应。但如何给各个门店进行资金结算&#xff0c;是一个重要的问题&#xff0c;本文将…

探索JavaScript函数---基础篇

目录 函数 声明和调用 声明&#xff08;定义&#xff09; 调用 参数 形参和实参 形参&#xff08;Formal Arguments&#xff09; 实参&#xff08;Actual Arguments&#xff09; 形参与实参的关系 返回值 作用域 全局作用域 局部作用域 匿名函数 函数表达式 立…

无限可能LangChain——开启大模型世界

什么是大语言模型&#xff1f; 大语言模型是一种人工智能模型&#xff0c;通常使用深度学习技术&#xff08;如神经网络&#xff09;来理解和生成人类语言。这些模型拥有非常多的参数&#xff0c;可以达到数十亿甚至更多&#xff0c;使得它们能够处理高度复杂的语言模式。 我…

【网络安全】Web安全基础 - 第二节:前置基础知识- HTTP协议,握手协议,Cookie及Session

本章节主要介绍一些基础知识 d(^_^o) HTTP协议 什么是HTTP 超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTTP是一个基于请求与响应&#xff0c;无状态的&#xff0c;应用层协议&#xff0c;…