什么是Servlet
servlet是一门用于开发动态web资源的技术,可以运行在Web服务器中的小型Java程序,有时也叫做服务器端的
小应用程序。Servlet可以通过HTTP协议接收和响应来自Web客户端的请求。
Servlet的语法跟JavaSE是一样的并且能够使用JavaSE中的API,要想创建一个动态资源可以分为以下两步:
- 1、编写一个Java类,实现 javax.servlet.Servlet接口,该接口在 servlet-api.jar包中
- 2、将这个Java包部署在web服务器中。
如上图所示,服务器端程序其实就是实现了servlet接口的程序,servlet的主要作用其实就是处理和响应客户端的请求。
编写第一个servlet
- 创建一个web项目可以在创建项目时关联tomcat,这样eclipse会把相关的servlet-api.jar包拷贝到项目中,在项目创建一个Java类实现servlet接口并重写里面的方法。
- servlet创建好之后,需要在web.xml文件中进行配置,给servlet一个可以访问的URL地址:
2、Servlet的生命周期
Servlet生命周期指的是,Servlet对象的创建,Servlet对象的初始化,Servlet对象服务的执行,及最终Servlet对象被销毁整个过程。
Servlet的整个生命周期过程的执行,均由Web服务器负责管理,程序员无法控制器执行流程。
Servlet的特征
- Servlet是单例多线程的,只创建一个Servlet对象,但每次请求都会起一个线程并在自己线程栈内存中执行service方法。
- 一个Servlet实例只会执行一次无参构造器与init()方法,并且是在第一次访问时执行。
- 用户没提交一次对当前Servlet的请求,就会执行一次Service()方法。
- 一个service实例只会执行一次destory()方法,在应用停止时执行。
- 由于Servlet是单例多线程的,所以为了保证线程的安全性,一般情况下是不在Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。
默认情况下,Servlet在Web容器启动时是不会被实例化的。
3、ServletConfig接口
在Servlet接口的init()方法中有一个参数ServletConfig,这个参数是个接口,里面是一些在web.xml中对当前Servlet类的配置信息。Servlet规范将Servlet的配置信息全部封装到了ServletConfig接口对象中。在tomcat调用init()方法时,首先会将web.xml中当前Servlet类的配置信息封装为一个对象。这个对象实现了ServletConfig接口,Web容器会将这个对象传递给init()方法中的ServletConfig参数。
ServletConfig的特点:
每一个Servlet都对应一个ServletConfig用于封装各自的配置信息,即有几个servlet就会产生几个ServletConfig对象。
4、ServletContext接口简介
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象包含的Web应用中所有Servlet在Web容器中的一些数据信息 。ServletContext随着Web应用的启动而创建,随着Web应用的关闭而销毁。一个Web应用只有一个ServletContext对象。
ServletContext中不仅包含了web.xml文件中的配置信息,还包括了当前应用中所有Servlet可以共享的数据。可以这么说,ServletContext可以代表整个应用,所以ServletContext有另外一个名称:
application。
5、欢迎页面的设置和url-pattern
设置欢迎页面
在浏览器地址栏中直接通过项目名称访问时,默认显示的页面就是欢迎页面,可以是.html.jsp,可以通过
welcome-file-list进行设置。
url-pattern的设置
url-pattern标签用于对于请求进行筛选匹配,对当前注册的Servlet所要处理的请求类型进行筛选。对于url-patten中路径的写法,有多重不同的模式,表示不同的意义,一个Servlet可以对应多个 url-pattern.
6、GenericServlet类
继承GenericServlet
在通过实现Servlet接口来定义一个Servlet类时存在一个很不方便的问题:有太多不需要的方法必须要实现。通常我们只在service()方法中完成业务逻辑,但由于Servlet接口中还存在另外四种方法,所以也有实现。
为了解决这个问题JavaEE的API提供了一个java.servlet.GenericSevlet类,开发者在定义一个Servlet时继承该GenericServlet类,此时只需要重写service方法即可。
适配器模式
适配器模式把一个类的接口换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
7、HttpServlet类
在实际应用中常用到http提交方式有get和post(除此之外还有put、delete),在之前所编写的servlet中是无法直接处理这两种提交方式,为了方便开发,JavaEE规范的API提供了 Javax.servlet.http.Servlet类,在实际开发中也经常使用继承HttpServlet类的 方式创建一个Servlet。
模板方法设计模式
定义一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现这就是模板方法模式的用意。