Servlet: server applet
* 概念:运行在服务器端的小程序
    * Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
    * 将来我们自定义一个类,实现Servlet接口,复写方法。

* 快速入门:
  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口

      public class ServletDemo1 implements Servlet

  3. 实现接口中的抽象方法
  4. 配置Servlet
    在web.xml中配置:

<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping> 

* 执行原理:
  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
  3. 如果有,则在找到对应的<servlet-class>全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

* Servlet中的生命周期方法:
  1. 被创建:执行init方法,只执行一次
    * Servlet什么时候被创建?
      * 默认情况下,第一次被访问时,Servlet被创建
      * 可以配置执行Servlet的创建时机。
        * 在<servlet>标签下配置
          1. 第一次被访问时,创建
            * <load-on-startup>的值为负数
          2. 在服务器启动时,创建
            * <load-on-startup>的值为0或正整数

    * Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
    * 多个用户同时访问时,可能存在线程安全问题。
    * 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要修改值

  2. 提供服务:执行service方法,执行多次
    * 每次访问Servlet时,Service方法都会被调用一次。   

  3. 被销毁:执行destroy方法,只执行一次
    * Servlet被销毁时执行。服务器关闭时,Servlet被销毁
    * 只有服务器正常关闭时,才会执行destroy方法。
    * destroy方法在Servlet被销毁之前执行,一般用于释放资源

* Servlet3.0:
  * 好处: 支持注解配置。可以不需要web.xml了。

  * 步骤:
    1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@WebServlet注解,进行配置

 @WebServlet("资源路径")
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相当于<Servlet-name> String[] value() default {};//代表urlPatterns()属性配置 String[] urlPatterns() default {};//相当于<url-pattern> int loadOnStartup() default -1;//相当于<load-on-startup> WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default "";
}

*  Servlet的体系结构

    Servlet -- 接口
      |
   GenericServlet -- 抽象类
      |
    
HttpServlet -- 抽象类

  * GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    * 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

  * HttpServlet:对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

* Servlet相关配置
  1. url-partten:Servlet访问路径
    1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
  2. 路径定义规则:
    1. /xxx:路径匹配
    2. /xxx/xxx:多层路径,目录结构
    3. *.do:扩展名匹配(无论是get请求 还是post请求,都可以使用*.do)

* ServletContext对象:
  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取:
    1. 通过request对象获取
       request.getServletContext();
    2. 通过HttpServlet获取
       this.getServletContext();
    3. 功能:
      1. 获取MIME类型:
        * MIME类型:在互联网通信过程中定义的一种文件数据类型
          * 格式: 大类型/小类型 text/html image/jpeg

          * 获取:String getMimeType(String file)
  2. 域对象:共享数据
    1. setAttribute(String name,Object value)
    2. getAttribute(String name)
    3. removeAttribute(String name)

    * ServletContext对象范围:所有用户所有请求的数据
  3. 获取文件的真实(服务器)路径
    1. 方法:String getRealPath(String path)

      ServletContext context = request.getServletContext();

      String b = context.getRealPath("/b.txt");//web目录下资源访问
      System.out.println(b);

      String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
      System.out.println(c);

      String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
      System.out.println(a);

  

Servlet知识点小结的更多相关文章

  1. C++重要知识点小结---3

    C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...

  2. C++重要知识点小结---2

    C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继 ...

  3. Servlet知识点大纲

    这是我整理的Servlet知识点大纲,可按照它的顺序来学习-..具体的内容在我的博客中都可以找到!

  4. React及Nextjs相关知识点小结

    React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...

  5. 【SpringBoot MQ 系列】RabbitMq 核心知识点小结

    [MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...

  6. SpringBoot 系列教程之事务隔离级别知识点小结

    SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...

  7. disruptor笔记之四:事件消费知识点小结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. promise知识点小结

    断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结. 为什么使用promise 谈到Promise,我们知道,这是社区较理想的异步编程解决方案.想要掌握promise,我们首先要知道其提 ...

  9. Servlet学习小结

    最近有点小累啊,上课平均一天6小时,再去修一修代码就没什么多的时间了.现在写我最近学习的成果:想想最近软件工程老师留的题目,我还有一些重要的地方没有想清楚.题目是这样的:生成四则运算的题目,算术题目包 ...

随机推荐

  1. 初学FWT(快速沃尔什变换) 一点心得

    FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi​=j⊕k=i∑​Aj​∗Bk​此处乘号为普通乘法 ...

  2. tensorflow2.0 学习(一)

    虽说是按<TensorFlow深度学习>这本书来学习的,但是总会碰到新的问题!记录下这些问题,有利于巩固知新. 之前学过一些tensorflow1.0的知识,到RNN这章节,后面没有再继续 ...

  3. 2-STM32+W5500+GPRS(2G)基础篇-(W5500-学习说明)

    https://www.cnblogs.com/yangfengwu/p/11220042.html 定版: 这一节先直接说明怎么把官方的源码应用在我做的这块开发板上 https://www.w550 ...

  4. linux命令之------快捷键说明

    linux快捷键说明 (1)命令或目录补齐:Tab (2)遍历历史记录:history 上移:ctrl+p,下移:ctrl+n (3)光标移动 左移:ctrl+b:右移:ctrl+f:移到首部:ctr ...

  5. CSP-S乱搞记

    还有一年的时间,没人能挡住我前进的脚步 以后不打算写游记了,补完这篇再写就等退役吧,不太想传播什么负能量,走这条路,希望能得到自己想要的东西 Day-n 上了一个月文化课,班主任突然催我搞竞赛??? ...

  6. OpenFOAM——设置自定义非均匀场区域

    在使用OpenFOAM进行计算的时候,我们需要对计算域设置非均匀场,比如最典型的溃坝算例,在开始计算以前,我们需要首先设定某一区域的水的体积分数为1,就是下面这样的: 有可能我们在计算传热问题的时候, ...

  7. CTF SSTI(服务器模板注入)

    目录 基础 一些姿势 1.config 2.self 3.[].() 3.url_for, g, request, namespace, lipsum, range, session, dict, g ...

  8. 【Django】Django项目结构与单元测试

    学校的软工项目要开发一个网站,自然的想到用python+Django来做.由于之前没有用Django开发过大型的网站项目,所以遇到了一些问题.记录在此,便于以后查阅. 今天完成了项目结构的设计.部分的 ...

  9. 快速激活Navicat Premium 12

    Navicat Premium 12是一套数据库开发管理工具,支持链家MySQL.Oracle.SQL server等多种数据库,快速便捷创建.管理和维护数据库 一.下载 https://www.na ...

  10. python 代码性能分析 库

    问题描述 1.Python开发的程序在使用过程中很慢,想确定下是哪段代码比较慢: 2.Python开发的程序在使用过程中占用内存很大,想确定下是哪段代码引起的: 解决方案 使用profile分析分析c ...