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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("DemoFilter的init...");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("DemoFilter的doFilter...");// 通过filterfilterChain.doFilter(servletRequest,servletResponse);}@Overridepublic 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>

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

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

相关文章

STM32作业实现(一)串口通信

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

Notepad++ 常用

File Edit search view Encoding Language Settings Tools Macro Run Plugins Window 文件 编辑 搜索 视图 编码 语言 设置 工具 宏 运行 插件 窗口 快捷方式 定位行 &#xff1a;CTRL g查找&#xff1a; CTRL F替换&am…

Photoshop 首选项设置建议

Windows Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K macOS Ps菜单&#xff1a;Photoshop/首选项 Photoshop/Preferences 快捷键&#xff1a;Cmd K 对 Photoshop 的首选项 Preferences进行设置&#xff0c;可以提高修图与设计效率。下面是一些…

[数据集][目标检测]猕猴桃检测数据集VOC+YOLO格式1838张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1838 标注数量(xml文件个数)&#xff1a;1838 标注数量(txt文件个数)&#xff1a;1838 标注…

SpringBoot整合jasypt加密配置文件敏感信息

SpringBoot整合jasypt加密配置文件敏感信息 在项目中我们需要对配置文件的一些敏感信息进行加密处理&#xff0c;比如数据库账户密码&#xff0c;避免直接暴露出来&#xff0c;这种场景常常用于生产环境&#xff0c;我们不想让开发人员知道生产库的密码&#xff0c;有运维人员…

springboot基础及上传组件封装

简介 本文主要以文件上传为demo&#xff0c;介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…

spring分析工具_springboot startup analyze的部署和使用

工具是开源工具 ,可以放心使用 我是从开源中国OCSChina看到的顺便安利一下 部署 教程 https://github.com/linyimin0812/spring-startup-analyzer 直接下载地址 https://github.com/linyimin0812/spring-startup-analyzer/releases/download/v3.0.0/spring-startup-analyzer.…

c++------类和对象(下)包含了this指针、构造函数、析构函数、拷贝构造等

文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点&#xff1a; 四、拷贝构造4.1、引入4.2、特征&#xff1a;4.3、默认拷贝构造函数 总结 前言 在本节中&a…

BUUCTF中的密码题目解密

BUUCTF 1.MD5 题目名称就是MD5&#xff0c;这个题目肯定和md5密码有关&#xff0c;下载题目&#xff0c;打开后发现这确实是一个md5加密的密文 Md5在线解密网站&#xff1a;md5在线解密破解,md5解密加密 经过MD5在线解密网站解密后&#xff0c;获取到flag为&#xff1a;flag{…

burp插件new_xp_capcha识别验证码的简易安装

1.new_xp_capcha 插件是大佬开发的可以正常白嫖&#xff0c;感谢大佬&#xff0c;我找了个不需要任何高级操作就可以做的安装手法&#xff0c;因为我在网上搜了一下就发现这个的安装过程攻略都还蛮复杂&#xff0c;我这里用了个简单的手法 2.安装 下载地址&#xff1a;smxia…

【软件设计师】2022年上半年真题解析

​​冯诺依曼计算机体系结构的基本特点是&#xff1a; A. 程序指令和数据都采用二进制表示 - 这是正确的&#xff0c;因为冯诺依曼架构下的计算机使用二进制形式来表示和处理所有信息&#xff0c;包括指令和数据。 B. 程序指令总是存储在主存中&#xff0c;而数据则存储在高速…

二维数组传参时不用二级指针接收

先放结论&#xff1a; 1. 二维数组数组名指向的类型是 int [x] 类型&#xff0c;int** 指针指向类型是 int* &#xff0c;如果用二级指针接收会导致访问错误&#xff0c;因为 int [x] 类型和 int* 类型不同。 2. 指向什么类型的指针1就按照该类型的字节数1移动。 最近在学…

Kafka 集群 KRaft 模式搭建

一、Kafka 集群 KRaft 介绍 Kafka的KRaft模式是一种新的元数据管理方式&#xff0c;旨在去除对ZooKeeper的依赖&#xff0c;使Kafka成为一个完全自包含的系统。在Kafka的传统模式下&#xff0c;元数据管理依赖于ZooKeeper&#xff0c;这增加了部署和运维的复杂性。为了解决这个…

MySQL—函数(介绍)—字符串函数(基础)

一、引言 提到函数&#xff0c;在SQL分类中DQL语句中有一个聚合函数&#xff0c;如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数&#xff0c;而聚合函数只是函数的一种&#xff0c;接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …

大学生Python自救课程总结

因为一些事情的缘故&#xff0c;我已经几乎没有更新很久了&#xff0c;然后现在快到期末了&#xff0c;不知道各位学习python的同志们慌不慌【坏笑】。 本学期&#xff0c;我只是简单的讲了讲python的基础用法。当然&#xff0c;可能有些地方总结的并不全面&#xff0c;很多知…

.gitignore 文件

一.什么是 .gitignore 文件 在任何当前工作的 Git 仓库中&#xff0c;每个文件都是这样的&#xff1a; 追踪的&#xff08;tracked&#xff09;- 这些是 Git 所知道的所有文件或目录。这些是新添加&#xff08;用 git add 添加&#xff09;和提交&#xff08;用 git commit 提…

allure测试报告用例数和 pytest执行用例数不相同问题

我出现的奇怪问题&#xff1a; pytest执行了9条用例&#xff0c;但是测试报告确只显示3条用例 我将其中的一个代码删除后&#xff0c;发现allure测试报告又正常了 我觉得很奇怪这个代码只是删除了二维数组的第一列&#xff0c;我检查了半天都找不到问题&#xff0c;只有降低版本…

【自撰写,国际象棋入门】第1课、棋盘和棋子

第1课 棋盘和棋子 一、国际象棋的棋盘 国际象棋的棋盘为一8乘8的黑、白格相间的棋盘&#xff0c;8条竖线的编号分别为A-H&#xff0c;8条横线的编号分别为1-8&#xff0c;在记谱时用竖线编号横线编号的方式表示棋盘上的格子&#xff0c;例如a1格、h8格等.棋盘上有几条重要的大…

【数据密集型系统设计】软件系统的可靠性、可伸缩性、可维护性

文章目录 一. 数据密集型程序的特点以及遇到的问题二. 可靠性 : 即使出现问题&#xff0c;也能继续正确工作1 硬件故障2. 软件错误3. 人为错误 二. 可伸缩性1. 描述负载与推特的例子2. 描述性能-延迟和响应时间3. 应对负载的方法 四. 可维护性1. 可操作性&#xff1a;人生苦短&…

汇编:调用Win32 API

在32位汇编程序中使用 Win32 API 是很常见的&#xff0c;特别是在开发 Windows 应用程序时调用的频率很高&#xff0c;Win32 API 提供了访问 Windows 操作系统功能的接口&#xff0c;包括窗口、消息处理、文件操作、网络通信等等。以下是使用 Win32 API 的一般步骤&#xff1a;…