Servlet的生命周期和使用

news/2024/10/31 5:36:10/

Servlet

课程目标

servlet的生命周期(掌握)
servletConfig对象使用(了解)
servletContext对象的使用(掌握)

一.原理

二.Servlet的生命周期

  • 构造 servlet,然后使用 init 方法将其初始化。
    • 第一次发送请求的时候。 执行一次(servlet可以看做是单例模式)
  • 处理来自客户端的对 service 方法的所有调用。
    • 客户端发送一次请求,调用service方法一次。可执行多次
  • 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它。
    • tomcat服务器关闭的时候,销毁
@WebServlet("/my")
public class MyServlet extends HttpServlet {private static final long serialVersionUID = 1L;// servlet类由容器tomcat进行统一管理//根据书写相应的方法进行调用执行//servlet 的生命周期是由三个方法进行控制//1.init()      初始化方法//2.destroy()   销毁方法//3.service()   服务方法	//1.servlet初始化方法//servlet对象由tomcat进行在第一次请求时创建(单例)//init方法用于初始化配置当前servlet对象且只会执行一次//在服务第一次被请求时tomcat会创建对应的servlet对象 并调用对应的init方法进行初始化	public void init(ServletConfig config) throws ServletException {System.out.println("myServlet的初始化方法执行");}//2.servlet服务方法//每次接受到请求都会执行的方法protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException {System.out.println("myServlet的service方法执行");}//3.servlet销毁方法//当服务器正常关闭时 在删除servlet对象之前执行的方法 //在servlet删除之前进行一些关闭操作 防止资源的占用//仅在服务器关闭前执行一次//注意:需要服务器正常关闭public void destroy() {System.out.println("myServlet的destroy方法执行");}
}

当浏览器请求服务器对应服务时,服务器会根据请求url查找是否创建了对应url的servlet;如果已经创建则直接调用对应的service方法进行服务的处理,如果没有创建,则会创建对应的servlet并调用对应servlet的init方法进行servlet的初始化工作,之后继续调用service方法进行服务的处理,当服务器正常关闭时,在销毁删除servlet对象之前,会调用对应servlet的destory方法,进行资源释放或关闭执行功能的执行

二.Servlet访问路径配置

  • 完全路径匹配

    • 以/开头,配置文件中url-pattern怎么写,浏览器就怎么访问(servlet)
  • 目录匹配

    • 以“/”开头,以*结尾(过滤器)
  • 扩展名匹配

    • 不以“/”开头,以扩展名结尾 (.do,.action struts2框架),前面加“斜杠/”会报错;

四.ServletConfig对象

概念

  • 用于保存当前Servlet的配置信息,并可以通过对应的方法进行获取

作用

  • 与servlet对象一同创建用于保存对应servlet的配置信息

获取配置信息

  • String getServletName()//获取Servlet的名称
    
  • String getInitParameter(String name)//获取初始化参数
    
    • <!-- 配置初始化参数 --><init-param><param-name>username</param-name><param-value>rose</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param>
      
  • EnumerationgetInitParameterNames() //获取所有初始化参数名

ConfigServlet.java

import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;@WebServlet(value = "/config", loadOnStartup = 0, initParams = { @WebInitParam(name = "username", value = "zhangsan"),@WebInitParam(name = "password", value = "123456") })
// value配置请求url路径
// name配置当前servletname
// loadOnStartup配置当前servlet对象创建时间 负数第一次请求创建 0或正数启动服务器创建
public class ConfigServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void init(ServletConfig config) throws ServletException {//ServletConfig 是当前servlet的配置类//每个servlet对象在创建后都会创建对应的servletConfig对象用于保存当前servlet信息// 获取当前servletname 如果没有配置使用唯一全路径当做nameString servletName = config.getServletName();System.out.println("servletName:" + servletName);// 获取正在配置中书写的初始化参数 书写在servlet标签中// <!-- 配置初始化参数 -->// <init-param>// 		<param-name>username</param-name>// 		<param-value>rose</param-value>// </init-param>// <init-param>// 		<param-name>password</param-name>// 		<param-value>123456</param-value>// </init-param>String username = config.getInitParameter("username");String password = config.getInitParameter("password");System.out.println(username+"|"+password);		//获取所有初始化参数的nameEnumeration<String> names = config.getInitParameterNames();while(names.hasMoreElements()){System.out.println(names.nextElement());}}
}

web.xml配置形式

<servlet><servlet-name>ConfigServlet</servlet-name><servlet-class>com.yunhe.config.ConfigServlet</servlet-class><init-param><param-name>username</param-name><param-value>zhangsan</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>ConfigServlet</servlet-name><url-pattern>/config</url-pattern></servlet-mapping>

五.ServletContext对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vkaGTjd-1678971931355)(asseits/无标题.png)]

概念

  • 在web服务器启动后,就为每一个web应用创建该对象,在web应用中包含很多web资源,所有的资源共享一个ServletContext对象,就可以通过ServletContext传递数据。

在服务器启动后,创建一个对应的对象,用于保存当前服务器相关的数据,一般用于servlet对象之间的数据传递,只要是在当前服务器中的servlet都可以获取这个对象以及这个对象中的数据

如何获取该对象

  • 通过getServletConfig().getServletContext()获取
  • 通过getServletContext()获取
		//1通过servletConfig对象获取ServletConfig servletConfig = getServletConfig();ServletContext servletContext1 = servletConfig.getServletContext();//2直接通过HttpServlet提供的方法获取ServletContext servletContext2 = this.getServletContext();

作用

获取全局化参数

  • 在web.xml配置全局化参数

      <!-- 上下文参数配置不是应用于某个servlet而是所有sservlet都可以访问 --><!-- 所以在配置时  直接书写在根标签下即可 --><context-param><param-name></param-name><param-value></param-value></context-param>
    
  • 在Servlet中获取

    //直接通过HttpServlet提供的方法获取
    ServletContext servletContext2 = this.getServletContext();
    //与servletConfig对象获取初始化参数方法一致
    String username = servletContext2.getInitParameter("username");
    String password = servletContext2.getInitParameter("password");System.out.println(username+"|"+password);
    

作为域对象传递数据

  • 代表的范围是整个应用,所有的servlet都可以通过对应方法进行赋值取值删除
  • setAttribute(str, obj);
  • getAttribute(str);
  • removeAttribute(str);

C1Servlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// 所有的servlet都可以访问servletContext对象 并且通过方法进行数据的添加与获取ServletContext servletContext = getServletContext();//赋值setAttribute("key","value")//key必须为字符串类  value可以为任意对象//执行后会将键值对存储在servletContext对象中servletContext.setAttribute("username", "lisi");}

C2Servlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext servletContext = getServletContext();//取值attribute("key")//传入要获取数据的key 返回对应的value对象Object attribute = servletContext.getAttribute("username");System.out.println(attribute);}

C3Servlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = getServletContext();//销毁对应数据removeAttribute("key")//将对应key数据销毁servletContext.removeAttribute("username");}

读取资源文件

  • 方法

  • InputStream getResourceAsStream(String path)

    • 传入资源文件的虚拟路径,得到资源文件的流对象
  • public String getRealPath(String path)

    • 传入资源文件的虚拟路径,得到文件的绝对路径
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 数据传输本质是io流// servletContext提供了获取文件虚拟路径的方法ServletContext servletContext = getServletContext();String realPath = servletContext.getRealPath("a.txt");System.out.println(realPath);// servletContext提供了快速读取文件的方法InputStream is = servletContext.getResourceAsStream("a.txt");byte b[] = new byte[1024];int len = 0;while ((len = is.read(b)) != -1) {System.out.println(new String(b, 0, len));}}

虚拟路径

Path(“a.txt”);
System.out.println(realPath);

	// servletContext提供了快速读取文件的方法InputStream is = servletContext.getResourceAsStream("a.txt");byte b[] = new byte[1024];int len = 0;while ((len = is.read(b)) != -1) {System.out.println(new String(b, 0, len));}
}

**虚拟路径**在使用开发工具进行开发书写的代码位置与实际执行web项目使用的路径是不一样的,以eclipse为例,当执行web项目时,会自动根据当前的项目在临时文件夹下创建对应的目录,用于保存项目运行时使用的文件,这些文件的路径称之为虚拟路径,有开发工具以及服务器进行配置,虚拟目录会在项目关闭后自动清除对应的数据,如果想保存这些数据,可以手动配置虚拟路径与实际路径的映射

http://www.ppmy.cn/news/32503.html

相关文章

【Linux】进程优先级前后台理解

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习&#xff08;Ⅰ&#xff09;浅谈Linux下的shell--BASH【Linux…

watershed 算法原理以及skimage/opencv中的使用

watershed参考分水岭算法代码opencvscikit-image参考 scikit_image中的watershed说明 OpenCV—图像分割中的分水岭算法原理与应用 图像分割的经典算法&#xff1a;分水岭算法 分水岭算法 上图可以描述传统的分水岭算法&#xff0c;这样的算法可能会导致分割过细&#xff0c;遇…

Android Studio开发APP

1.下载Android Studio 官网下载:Android Studio for Window ... 百度云下载:android-studio-bundle-141.1903250-windows.exe Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用…

stm32外设-中断详解

0. 写在最前 本栏目笔记都是基于stm32F10x 1. 中断是啥&#xff1f; 什么是中断&#xff1a;CPU在处理某一事件A时&#xff0c;发生的另外某一事件B请求CPU去处理&#xff08;产生了中断&#xff09;&#xff0c;随后CPU暂时中断当前正在执行的任务&#xff0c;去对事件B进行处…

ChatGPT研究分析:GPT-4做了什么

前脚刚研究了一轮GPT3.5&#xff0c;OpenAI很快就升级了GPT-4&#xff0c;整体表现有进一步提升。追赶一下潮流&#xff0c;研究研究GPT-4干了啥。本文内容全部源于对OpenAI公开的技术报告的解读&#xff0c;通篇以PR效果为主&#xff0c;实际内容不多。主要强调的工作&#xf…

第十四届蓝桥杯模拟赛【第三期】Python

1 进制转换 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作为答案提交。 答案&#xff1a;2730 def ch…

Java每日一练(20230312)

目录 1. 两数之和 II ★ 2. 反转链表 ★★ 3. 二叉树的层序遍历 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 两数之和 II 给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数…

Pandas数据操作详解-总结

pandas简介pandas 是基于NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。pandas 是 Python 的核心数…