【JavaWeb学习笔记】1-Servlet基础

一、什么是Servlet?

宏观地讲,Servlet 是连接 Web 服务器与服务端 Java 程序的协议,是一种通信规范。这 个规范是以一套接口的形式体现的。
通常来说,Servlet 是宏观上 Servlet 规范中的一个具体的接口,Servlet 规范中包含一套 接口。而 Servlet 接口仅仅是其中之一。
微观地讲,Servlet 是 Servlet 接口实现类的一个实例对象,是运行在服务器上的一段 Java 小程序,即 Server Applet,也就是 Servlet 这个单词的来历。Servlet 的主要功能是根据客户 端提交的请求,调用服务器端相关 Java 代码,完成对请求的处理与运算。

二、Servlet生命周期

Servlet从实例化到销毁都由Web服务器负责调用。

  • 生命周期方法执行流程

(1)当请求发送到 Web 容器后,Web 容器会解析请求 URL,并从中分离出 Servlet 对应的 URI.
(2)根据分离出的 URI,通过 web.xml 中配置的 URI 与 Servlet 的映射关系,找到要执行的 Servlet,即找到用于处理该请求的 Servlet。
(3)若该 Servlet 不存在,则调用该 Servlet 的无参构造器、init()方法,实例化该 Servlet。 然后执行 service()方法。
(4)若该 Servlet 已经被创建,则直接调用 service()方法。
(5)当 Web 容器被关闭,或该应用被关闭,则调用执行 destroy()方法,销毁 Servlet 实例。

三、Servlet特征

(1)Servlet 是单例多线程的。
(2)一个 Servlet 实例只会执行一次无参构造器与 init()方法,并且是在第一次访问时执行。
(3)用户每提交一次对当前 Servlet 的请求,就会执行一次 service()方法。
(4)一个 Servlet 实例只会执行一次 destroy()方法,在应用停止时执行。
(5)由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不为 Servlet 类定义可修改的成员变量的。因为每个线程均可修改这个成员变量,会出现线程安全问题。
(6)默认情况下,Servlet 在 Web 容器启动时是不会被实例化的。

四、Tomcat下的Servlet

1、web.xml

  • 启动时注册Servlet
<servlet>
    <servlet-name>hello-servlet<servlet-name>
    <servlet-class>com.Tooi.HelloServllet</servlet-class>
    <load-on-startup>1<load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>hello-servlet<servlet-name>
    <url-pattern>/helloSerblet</url-pattern>
</servlet-mapping>

<load-on-start/>启动顺序,大于等于0,表示容器在启动时就加载并初始化这个 Servlet,数 值越小,该 Servlet 的优先级就越高,小于0或没有指定则表示该 Servlet 在真正被使用时才会去创建。

  • 两个Map

Map<String, Servlet>: <URI,Servlet实例>
当 Web 容器 从用户请求中分离出 URI 后,会首先到这个 Map 中查找是否存在其所对应的 value。若存在, 则直接调用其 service()方法。若不存在,则需要创建该 Servlet 实例。
Map<String, String>:<URI, Servlet 的全限定性类名>
当Web容器从用户请求中分离出URI后,到第一个Map中又没有找到其所对应的Servlet 实例,则会马上查找这第二个 Map,从中找到其所对应的类名,再根据反射机制,创建这 个 Servlet 实例。然后再将这个创建好的 Servlet 的引用放入到第一个 Map 中。

  • ServletConfig

Servlet 规范将 Servlet 的配置信息全部封装到了 ServletConfig 接口对象中

  • 定义Servlet初始化参数
?web.xml:
<servlet>
    <init-param>
        <parma-name>myDBDriver</param-name>
        <parma-value>com.mysql.jdbc.Driver</parme-value>
    </init-param>
</servlet>

ServletConfig方法:
getInitParameter():获取指定名称的初始化参数值。例如 getInitParameter(“myDBDriver”); 会返回字符串“com.mysql.jdbc.Driver”。
getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类 型 Enumeration<String>
getServletName():获取当前 Servlet 的<servlet-name></servlet-name>中指定的 Servlet 名 称。如上图中的 ServletName 为“hello-servlet”。
getServletContext():获取到当前 Servlet 的上下文对象ServletContext。

  • ServketContext

即Servlet上下文,是个接口,是 Web 应用中所有 Servlet 在 Web 容器 中的运行时环境。一个 Web 应用,就一个 Servlet 运行时环境,即一个 Servlet 上下文,即一个 ServletContext 对象。

  • 定义Web应用初始化参数
?web.xml:
<context-param>
  <param-name>myDBDriver</param-name>
  <param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

getInitParameter(): 获取 web.xml 文 件 的 <context-param/> 中 指 定 名 称 的 上 下 文 参 数 值 。 例 如 getInitParameter(“myDBDriver”);会返回字符串“com.mysql.jdbc.Driver”
getInitParameterNames(): 获取web.xml文件的<context-param/>中的所有的上下文参数名称。其返回值为枚举类 型 Enumeration<String>
setAttribute(String name, Object object): 在 ServletContext 的公共数据空间中,也称为域属性空间,放入数据。这些数据对于 Web 应用来说,是全局性的,与整个应用的生命周期相同。当然,放入其中的数据是有名称的, 通过名称来访问该数据。
getAttribute(String name): 从 ServletContext 的域属性空间中获取指定名称的数据。
removeAttribute(String name): 从 ServletContext 的域属性空间中删除指定名称的数据。
getRealPath(String path): 获取当前 Web 应用中指定文件或目录在本地文件系统中的路径,是基于盘符的路径。
getContextPath(): 获取当前应用在 Web 容器中的名称

  • 设置欢迎页面
?web.xml:
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
<welcome-file-list>
  • <url-pattern>

1、精确模式: <url-pattern>/HelloServlet</url-pattern>
2、通配符路径模式:<url-pattern>/HelloServlet/</url-pattern>
3、全路径模式: <url-pattern>/ * </url-pattern>
4、后缀名模式: <url-pattern>
.do</url-pattern>
一个Servlet可以配置多个</url-pattern>

  • 匹配原则

1、路径优先后缀匹配原则
2、精确路径优先匹配原则
3、最长路径优先匹配原则

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值