Servlet的定义
Servlet是运行在服务端的Java小程序,是sun公司提供的一套用于处理客户端请求以及响应给浏览器(客户端)动态资源的规范。Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),且是最重要的
Servlet的作用(重要)
-
1.获取客户端的请求数据(接收请求)
-
2.处理客户端的请求
-
3.分发转向(重定向,请求转发)
-
4.响应客户端
编写人生中第一个Servlet(实现Servlet接口)
定义一个类,实现接口Servlet
实现里面的方法 ,重点关注:
-
init ,实例化Servlet对象时调用
-
service,接收到客户端发起的请求时调用
-
destory,服务关闭时调用
配置servlet(不进行配置的话,客户端无法访问Servlet)
-
发布项目,访问servlet
Servlet的执行流程
二、Servlet生命周期
-
生命周期
定义:一种事物从出生(创建)到消亡的过程。
用到Servlet中,就是从Servlet创建到Servlet对象销毁的这个过程就是Servlet的生命周期
Servlet什么时候创建(初始化):第一次有请求到达这个Servlet的时候初始化
Servlet什么时候销毁:服务器关闭或者项目移除的时候就销毁。
-
生命周期方法
定义:一个对象从被创建到销毁必然会走的方法 。
-
init 【创建实例的时候调用】默认是第一次请求该Servlet的时候创建实例
servlet在初始化的时候,就执行该方法。 只会执行一次, 在创建实例的时候执行, 默认在初次访问的时候执行。
-
service【处理请求,每次有请求到达该Servlet的时候调用】
用于接收请求,和对请求作出响应,service方法是一个非常重要的生命周期方法
处理请求的时候,来一次请求,就调用一次。
service()方法其实是用于处理请求的。
-
destroy【销毁实例】
当servlet实例销毁的时候就调用
1.关闭服务器的时候,就销毁了。 shutdown.bat ---> stop Server
2.从服务器中移除该项目
-
注意:doGet()和doPost()方法不是生命周期方法
以下是Servlet源码中的注释,解释了Servlet的生命周期。
* <p>This interface defines methods to initialize a servlet,
* to service requests, and to remove a servlet from the server.
* These are known as life-cycle methods and are called in the
* following sequence:
* <ol>
* <li>The servlet is constructed, then initialized with the <code>init</code> method.
* <li>Any calls from clients to the <code>service</code> method are handled.
* <li>The servlet is taken out of service, then destroyed with the
* <code>destroy</code> method, then garbage collected and finalized.
* </ol>
生命周期方法的应用
init()方法中,可以做一些全局参数的初始化。
service()方法中,可以接收和处理请求,及对请求做出响应。
destroy()方法中,可以做一些资源的回收和释放。做数据的保存
三、Servlet通用写法(继承HttpServlet类)
继承HttpServlet的运行过程
前半段思路与前面的图一样。 后半段运行过程如下:
http://loclahost:8080/CommonServlet/demo
1. 必然会找到ServletDemo02
2. 执行service方法 , 但是很抱歉,这个类没有这个方法。
3. 执行父类的servcie方法 service(ServletRequest , ServletResponse)
4. 在父类的service方法中,对请求方式进行判定, 如果是Get方式,调用doGet , 如果是post方式,那么调用doPost
5. HttpServlet 里面定义有doGet 和 doPost , 但是我们的子类也复写了这两个方法。 所以在service里调用的doGet 和 doPost ,其实走的是子类的方法。
四、Servlet配置
-
servlet提前初始化(这个操作在实际开发中基本不会去做,了解即可!)
一般来说servlet只有在初次访问的时候,才会执行init方法实例化, 如果init方法执行的逻辑比较消耗时间(但是实际开发中,不可能让init方法中做耗时操作),那么我们可以让这个实例化的工作稍微提前。
2.提前到什么时候? 可以提前到,部署项目完毕就开始创建实例。 <servlet> <servlet-name>demo</servlet-name> <servlet-class>com.itheima.servlet.ServletDemo</servlet-class> 数字越小,启动时机就越早,一般建议从2开始写 <load-on-startup>2</load-on-startup> </servlet>
-
Servlet映射配置 url-pattern
有三种写法
1.以全路径匹配方式 以 / 打头 (最常用的方法 96%)
如 : /demo /aa /cc
http://localhost:8080/项目名/demo
http://localhost:8080/项目名/aa
http://localhost:8080/项目名/cc
2. 以目录匹配方式 以 / 打头, 以 * 结尾 (基本上用不到,了解即可)
* 代表通配符, 只要前半段一样,后半段不管是什么路径,都能访问。
如: /demo/* /aa/* /cc/* /*
http://localhost:8080/项目名/demo/aaa/bbb/cc
3. 以后缀名方式 以 * 打头
如: *.jpg *.txt *.aa *.avi
http://localhost:8080/项目名/demo.do
五、ServletConfig(实际开发中应用不多)
获取ServletConfig对象的方法:getServletConfig()
ServletConfig对象的常用方法
-
getServletName(),获取Servlet在web.xml中配置的<servlet-name>标签中的名字
-
getInitParameter(name),获得Servlet的初始化参数的值。
-
getInitParameterNames(),获得Servlet的所有初始化参数的名称
主要应用在框架中
六、ServletContext
定义
当服务器启动的时候,就会为它所托管的每一个项目都创建一个ServletContext的实例对象,并且每个项目中有且只有一个该类的实例对象。
获取ServletContext实例对象的方法
-
1.调用Servlet自己的getServletContext()方法
-
2.调用request对象的getServletContext()方法
-
3.调用ServletConfig对象的getServletContext()方法
ServletContext的作用
-
1.获取全局的初始化参数
-
getInitParameter("参数名")
-
-
2.作为域对象存值和取值(域对象:有一定作用域,然后在该作用域中可以实现数据共享)
-
存值:setAttribute("参数名",值)
-
取值:getAttribute("参数名")
-