目录
一、什么是Servlet
Servlet其实就一个运行在web服务器上的小的Java程序,用于处理从web客户端发送的请求,并且对请求作出响应。
二、使用Servlet
1.Servlet的入门
- 编写一个Java类实现Servlet的接口
- 配置Servlet
1.1创建包和类
1.2实现Servlet的接口
这个里面我要说一下为什么浏览器能打印出Hello Servlet…这个字符串,其中ServletResponse这个类中有一个getWriter()方法,这个方法会返回一个可将字符文本发送到客户端的PrintWriter对象,而PrintWriter这个类中是有一个println(String s)方法的,这个方法可以打印字符串,然后终止改行,所以就解释了为什么浏览器能够输出字符串了。
1.3在web.xml中配置这个类
这里注意,上面第一个Servlet的名称可以随便写,但是下面mapping中的Servlet名称要和上面一样,也就是保持一致。
1.4访问Servlet
http://localhost:8080/web_test/hello
2.Servlet的执行流程
我说明一下流程,首先浏览器输入url网址,后面是/hello,浏览器发送请求之后就会找到web.xml中的配置访问路径/hello,也就是步骤1,然后会知道mapping映射中的Servlet名字,也就是步骤2,然后根据2,找到上面的同名Servlet,也就是步骤3,然后根据Servlet全路径找到我们写的java类,然后执行里面的service方法,向浏览器输出内容。
3.Servlet的实现关系
Servlet接口
|
|
GenericServlet类 通用的Servlet,是一个与协议无关的Servlet
|
|
HttpServlet类 Http专用的Servlet
SUN设计之初,是有野心的,想着以后互联网不仅仅只使用http协议,可以通过GenericService实现。HttpServlet是一个与协议相关的Servlet,是专门用来处理HTTP协议的请求,通常编写一个Servlet,一般都会让这个Servlet继承HttpServlet,然后重写service方法。
在service方法内部,根据请求的方式不同,执行不同的doXXX方法,(get请求执行doGet方法,如果是post请求就会执行doPost方法)。
所以往往继承了HttpServlet之后,就不需要重写service方法,只需要重写doGet和doPost方法,往往请求处理的内容的代码是一致的,所以需要让doGet和doPost相互调用,简化代码。
4.Eclipse中使用Servlet模板
1.新建Servlet
2.完成Servlet的配置
5.Servlet的生命周期
1.什么是生命周期
生命周期:一个对象从创建到销毁过程。
2Servlet的生命周期
Servlet生命周期:Servlet对象从创建到销毁的过程。
- Servlet何时被创建又是何时被销毁的?
- Servlet中有init(),service(),destroy()方法,这几个方法称为是Servlet生命周期相关的方法。
- Servlet是在第一次被访问的时候会被实例化,只要Servlet一被实例化,那么Servlet中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同doXXX方法)。当Servlet从服务器中移除或者服务器关闭的时候Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉。
-
3代码演示Servlet的生命周期
6.Servlet的启动时加载
1.为什么使用启动时加载
Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?
2.什么是启动时加载
Servlet默认是在第一次访问的时候创建的对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet的对象)。如果现在这样做那么之前花费的时间就会在服务器启动的时候一起花费掉了。对于用户来讲就不需要额外花费这个时间。
3.配置完成启动时加载
这里说明一下load-on-startup中的数字越小优先级越高,由于tomact服务器是1,优先级最高,所以这里最高只能写2。
7.Servlet的访问路径配置
1.<url-pattern>的配置方式
第一种完全路径匹配:以 / 开始 ,比如:/ServletDemo1 或者/aaa/ServletDemo2
第二种目录匹配:
以 / 开始,以 /*结束 比如:/* /aaa/* /aaa/bbb/*
这里的*代表任意字符。
第三种扩展名匹配
不能以 / 开始,而是以*开始 比如:*.action *.do *.jsp
只要后缀名跟*后面的一样的就能访问,比如aa.action,aa.do等。
2.访问的优先级
完全路径匹配 > 目录匹配 > 扩展名匹配
8.ServletConfig对象
ServletConfig用来获得Servlet的相关的配置的对象。
1.获得ServletConfig对象:
2.ServletConfig对象的API
- 获得Servlet的初始化参数
- 获得ServletContext对象
- 获得Servlet的名称
3.演示ServletConfig的API
配置初始化参数:
实现:
9.ServletContext对象之获取项目信息
1.什么是ServletContext
ServletContext:Servlet的上下文对象。ServletContext对象对Servlet之前和之后的内容都知道。这个对象一个web项目只有一个。在服务器启动的时候为每个web项目创建一个单独的ServletContext对象。
2.ServletContext对象的作用
2.1作用一:用来获取web项目信息
因为一个web项目只有一个ServletContext对象,所以这个对象对整个项目的相关内容都是了解的。
2.1.1获取文件的MIME类型:
2.1.2获取web项目请求工程名:
2.1.3获取web项目的初始化参数:
2.2作用二:读取web项目下的文件
之前使用IO流就可以读取文件(java项目中)。现在是一个web项目,web项目需要发布到tomcat下才能访问的。获取web项目下的文件如果使用传统的IO就会出现问题(原因:路径中使用的是相对路径,相对的是JRE环境)。
而在web项目下要用绝对路径才行。
2.2.1读取文件的代码实现
10.ServletContext对象之作为域对象存取数据
1.什么是域对象
域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。
ServletContext作为域对象的API:
存入数据的方法:
获取数据的方法:
移除数据的方法:
ServletContext作为域对象的作用范围 :
ServletContext是在服务器启动的时候为每个web项目单独创建一个ServletContext对象。当web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。向ServletContext中保存的数据一直存在(当服务器关闭的时候ServletContext对象被销毁,然后里面数据才会失效)。范围:整个web应用。
ServletContext域对象代码演示:
此处是建立了两个servlet文件,在其中一个里面使用ServletContext赋值一个对象后,在另外一个Servlet文件中也可以获取到值,说明了ServletContext对象的作用于是整个web应用。