1、什么是 Servlet ?

Servlet(Server Applet)是 Java Servlet 的简称,称为小服务程序或服务连接器,用 Java 编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态 Web 内容。

狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,可以将 Servlet 理解为后者。Servlet 运行于支持 Java 的应用服务器中。

从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。(内容摘自百度百科

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

创建项目进行代码演示:

/**
* Created by RookieLi on 2019/4/22.
*/
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {} @Override
public ServletConfig getServletConfig() {
return null;
} // 提供服务的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
System.out.println("hello,servlet");
} @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() {}
}

在 web.xml 中配置:

<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.rookie.web.ServletDemo</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping> 当在浏览器中输入路径:http://localhost:8080/demo
控制台会输出:hello,servlet

执行的原理:

A、当服务器接受到客户端浏览器的请求后,会解析请求 URL 路径,获取访问的 Servlet 的资源路径。

B、查找 web.xml 文件,是否有对应的 <url-pattern> 标签体内容。

C、如果有,则在找到对应的 <servlet-class> 全类名

D、tomcat会将字节码文件加载进内存,并且创建其对象

E、调用其 service 方法

Servlet中的生命周期方法:

A、被创建:执行init方法,只执行一次
Servlet 何时被创建?
* 默认情况下,第一次被访问时,Servlet 被创建
* 可以配置执行 Servlet 的创建时机。
* 在 <servlet> 标签下配置
a. 第一次被访问时,创建
* <load-on-startup>的值为负数
b. 在服务器启动时,创建
* <load-on-startup>的值为0或正整数
* Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
* 多个用户同时访问时,可能存在线程安全问题。
* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值。
B、提供服务:执行service方法,执行多次
* 每次访问Servlet时,Service方法都会被调用一次。
C、被销毁:执行destroy方法,只执行一次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
* 只有服务器正常关闭时,才会执行destroy方法。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源。

Servlet 3.0 (重点)

优点:支持注解配置。可以不需要 web.xml 了。

代码演示

@WebServlet("/demo666")
public class ServletDemo2 implements Servlet { @Override
public void init(ServletConfig servletConfig) throws ServletException {} @Override
public ServletConfig getServletConfig() {
return null;
} @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
System.out.println("servlet 3.0 给力 666");
} @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() {}
} 当在浏览器中输入路径:http://localhost:8080/demo666
控制台会输出:servlet 3.0 给力 666

@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 -- 抽象类 A、GenericServlet:将 Servlet 接口中其他的方法做了默认空实现,只将 service() 方法作为抽象
* 将来定义 Servlet 类时,可以继承 GenericServlet ,实现 service() 方法即可 B、HttpServlet:对 http 协议的一种封装,简化操作
* 定义类继承 HttpServlet
* 复写 doGet/doPost 方法 C、Servlet相关配置
* urlpartten:Servlet访问路径
* 一个Servlet可以定义多个访问路径:@WebServlet({"/demo6","/demo66","/demo666"})
在浏览器中输入不同的请求路径,都可以访问到资源。
http://localhost:8080/demo6
http://localhost:8080/demo66
http://localhost:8080/demo666
B、路径定义规则:
1. /xxx:路径匹配
2. /xxx/xxx:多层路径,目录结构
3. *.do:扩展名匹配

深入理解 Servelt的更多相关文章

  1. JavaWeb三大组件——过滤器的运行机制理解

    过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...

  2. 深入理解Spring MVC(山东数漫江湖)

    初始工程 使用Spring Boot和web,thymeleaf的starter来设置初始工程.xml配置如下: <parent>   <groupId>org.springf ...

  3. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  4. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  5. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  6. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  7. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  8. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  9. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

随机推荐

  1. POJ1743 Musical Theme(后缀数组 二分)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 33462   Accepted: 11124 Description A m ...

  2. 【Wyn Enterprise BI知识库】 什么是商业智能 ZT

    商业智能(Business Intelligence,BI),又称商务智能,指用现代数据仓库技术.在线分析处理技术.数据挖掘和数据展现技术进行数据分析以实现商业价值. 图1:商业智能(BI)系统 商业 ...

  3. Linux Linux下最大文件描述符设置

    Linux下最大文件描述符设置 by:授客 QQ:1033553122 1.   系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...

  4. C# 加密术

    本文是利用一个简单的小例子,简述C#中和加密术有关的内容,仅供学习参考用. 概述 随着信息技术的发展,计算机网络为信息的获取.传输.处理.利用与共享提供了一个高效.快捷.安全的通信环境和传输通道,网络 ...

  5. Android JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

  6. Android 内存管理中的 Shallow heap Retained heap

    所有包含Heap Profling功能的工具(MAT,Yourkit,JProfiler,TPTP等)都会使用到两个名词,一个是Shallow heap Size,另一个是 Retained heap ...

  7. CentOS 7.x默认没有ifconfig?!

    刚装了CentOS 7.0,安装界面非常漂亮,装完后发现没有ifconfig命令.yum install net-tools后出现. 有两个可能,一个是mini版本的原因,二一个可能我在安装过程中配置 ...

  8. Scala隐式转换

    package big.data.analyse.scala import java.io.File import scala.io.Source /** * 隐式转换 * Created by zh ...

  9. Python语法的转义字符

    Python语法的转义字符 转义字符 说 明 \ 续行符 \n 换行符 \0 空  \t 水平制表符,用于横向跳到下一制表位 \'' 双引号 \' 单引号 \\ 一个反斜杠 \f 换页 \0dd 八进 ...

  10. jar包导入导出

    java项目: 在classLoader加载jar和class的时候,是分开加载的,一般jar导入分两种: 1.在web-inf下的lib中直接引入 2.在user library上引入 无论以上哪种 ...