day11-Servlet01
Servlet01
官方api文档:https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html
创新互联是专业的兰溪网站建设公司,兰溪接单;提供成都网站设计、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行兰溪网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
Servlet和Tomcat的关系:一句话,Tomcat支持Servlet
Servlet是跟Tomcat关联在一起的,换而言之,Tomcat是哪个版本,就对应哪个版本的Servlet
1.为什么需要Servlet?
需求:请用你现有的html,css,javascript,开发网站,比如可以让用户留言/购物/支付,你能搞定吗?
这就需要引入我们的动态网页(能和用户交互)技术===>Servlet
我们对之前的JavaWeb技术体系图进一步地细化:
Tomcat的web服务拿到一个请求后:
-
如果web服务发现是该请求是和java相关的,或者说是一个Servlet(动态请求,比如说可能会去操作数据库),那么Tomcat会去寻找Servlet,Servlet又去调用java程序,进行数据库操作
-
如果Tomcat的web服务发现请求的是一个静态资源,比如html,图片等,就直接拿到该资源,然后返回,不会和java程序或者数据库发生关系
-
因此我们说Tomcat其实是有两个功能的:一是充当Servlet的容器;二是充当普通的web服务
-
只支撑静态资源返回的还有apache,如果是一个静态资源的网站,不需要和数据库进行交互,其实完全可以使用Apache来作为web服务,或者只使用一个Nginx就可以了
2.什么是Servlet?
-
什么是Servlet
Servlet在开发动态WEB工程中得到了广泛地应用,掌握好Servlet非常重要,Servlet是SpringMVC的基础
-
Servlet(java服务器小程序),它的特点有:
-
它是由服务器调用和执行的
即由tomcat解析和执行的
-
它是用java语言编写的,本质就是Java类
-
它是按照Servlet规范开发的(接口),Servlet本质就是一套接口规范
除了Tomcat可以去解析Servlet,weblogic也可以支持 Servlet,即只要按照规范去开发接口,就可以支持Servlet,类似于jdbc的接口规范
-
功能强大,几乎完成所有的网站功能
-
3.Servlet基本使用
3.1Servlet开发方式说明
- Servlet3.0前使用web.xml,Servlet3.0版本以后(包括3.0)支持注解,同时支持web.xml配置
- 如何查看Servlet版本
- Servlet的讲解只是为了知道Servlet的使用原理(原生的Servlet在项目中使用很少)
- 不管使用哪种方式,本质都一样
3.2快速入门-手动开发Servlet
例子
需求说明:
- 开发一个HelloServlet
- 当浏览器访问
http://localhost:8080/web应用名/helloServlet
时,后台输出“hi HelloServlet”
思路:
-
编写类HelloServlet去实现Servlet接口
-
实现service方法,处理请求,并响应数据
-
在web.xml中去配置Servlet程序的访问地址
-
首先创建web工程,配置好Tomcat
-
添加servlet-api.jar(在你安装的tomcat/lib下)到工程,因为servlet.jar不是jdk自带的,要引入才可以使用
在idea项目的web/WEB-INF下创建一个lib目录,将servlet-api.jar拷贝进去,然后右击jar包,点击add as library,在弹出的窗口中点击ok即可
-
在src包下面创建HelloServlet.java,并实现Servlet接口
package com.li.servlet; import javax.servlet.*; import java.io.IOException; /** * 1.开发一个servlet,需要实现Servlet接口 * 2.实现Servlet接口的方法:一共有5个 */ public class HelloServlet implements Servlet { /** * 1.初始化 Servlet * 2.当创建HelloServlet实例时,会调用init方法 * 3.该方法只会被调用一次 * * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init() 被调用"); } /** * 返回ServletConfig对象 也就是返回Servlet的配置 * * @return */ @Override public ServletConfig getServletConfig() { return null; } /** * 1.service方法处理浏览器的请求(包括get/post) * 2.当浏览器每次请求Servlet时,就会调用一次service方法 * 3.当Tomcat调用该方法时,会把http请求的数据封装成 实现了ServletRequest接口 的request对象 * 4.通过servletRequest对象,就可以得到用户提交的数据 * 5.servletResponse对象可以用于返回数据给Tomcat-->浏览器 * * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hi HelloServlet~"); } /** * 返回servlet的信息,使用较少 * * @return */ @Override public String getServletInfo() { return null; } /** * 1.该方法是在servlet被销毁时,被tomcat调用 * 2.只会调用一次 */ @Override public void destroy() { } }
-
实现了接口之后,在web.xml配置HelloServlet,即给HelloServlet提供对外的访问地址
目的是为了告诉Tomcat服务器,HelloServlet在哪里
HelloServlet com.li.servlet.HelloServlet HelloServlet /helloServlet 设置 快捷键ctrl+/ 可以在当前位置注释,而不是在行
-
访问HelloServlet(记得要reploy或者restart)
可以自己配置快捷键启动
浏览器访问:
后台输出:可以看到init方法只调用了一次,而每次访问都会调用server方法
4.浏览器调用Servlet流程分析
注意这里的第几次请求是值对于Tomcat而言,并不在乎是哪个浏览器
- 如果是第一次请求(Tomcat)
-
首先查询web.xml文件
-
看看请求的资源/helloServlet在web.xml有没有配置url-pattern
-
如果找到url-pattern,就会得到对应的servlet-name:HelloServlet
-
Tomcat维护了一个大的HashMap
,查询该HashMap,看看有没有这个Servlet实例 -
如果没有查询到该servlet-name对应的id,即没有这个Servlet实例
-
就根据servlet-name去得到servlet-class:类的全路径
-
使用反射技术,将servlet实例化(同时调用init方法),并将该实例放入到Tomcat维护的HashMap
中
- 如果是第二次及其之后请求(Tomcat)
-
首先查询web.xml文件
-
看看请求的资源/helloServlet在web.xml有没有配置url-pattern
-
如果找到url-pattern,就会得到对应的servlet-name:HelloServlet
-
Tomcat维护了一个大的HashMap
,查询该HashMap,看看有没有这个Servlet实例 -
如果查询到,就直接调用该Servlet的service方法
-
结果处理
-
前面说到Servlet是单例的,现在来证明:
在实现的Servlet类HelloServlet中增加一个count属性
在service方法中,增加语句
count++;
并将其输出,如果每次输出的count是累加的,就说明每一次请求使用的都是同一个Servlet实例使用浏览器访问:
后台输出:(在切换不同的浏览器访问后,count的值仍是累加的)
5.Servlet生命周期
- 主要有三个方法
- init() 初始化阶段
- service() 处理浏览器请求阶段
- destroy() 终止阶段
-
示意图
5.1初始化阶段-init()
Servlet容器(比如Tomcat)加载Servlet,加载完之后,Servlet容器会创建一个Servlet实例并调用init()方法,init方法只会调用一次,Servlet容器在下面的情况装载Servlet
-
Servlet容器(如Tomcat)启动时自动装载某些servlet,实现这个需要在web.xml文件中添加
1 -
在Servlet容器(如Tomcat)启动后,浏览器首次向Servlet发送请求
-
Servlet重新装载时(比如tomcat进行redeploy),浏览器再向Servlet发送请求的第1次
redeploy会销毁所有的Servlet实例
例子1:
1
在web.xml文件中添加
之后,重新启动tomcat,可以看到,在没有浏览器发送请求的情况下,调用了init方法,这说明该Servlet已经被装载
例子2:Servlet重新装载时(比如tomcat进行redeploy),浏览器再向Servlet发送请求的第1次会装载Servlet
后台显示状况:
说明redeploy后Servlet实例被销毁了,当浏览器再次请求时,Tomcat会重新装载Servlet,因此init方法再次被调用
5.2处理浏览器请求阶段-service()
- 每收到一个http请求,服务器就会产生一个新的线程去处理
- 创建一个用于封装HTTP请求消息的ServletRequest对象和一个代表HTTP响应消息的ServletResponse对象
- 然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去
例子1:验证是否每收到一个http请求,服务器就会产生一个新的线程处理
在service方法中输出当前线程的id
浏览器请求Servlet时后台的输出:
5.3终止阶段-destroy()
当web应用被终止,或者Servlet容器终止运行,或者Servlet类重新装载时,会调用destroy方法(很少使用)
比如重启Tomcat,或者redeploy web应用
例子
在destroy方法中输出提示
重启Tomcat,在浏览器访问Servlet(让Servlet类加载),然后选择redeploy,可以看得destroy方法被调用了:
在浏览器再次请求Servlet,这次直接点击停止Tomcat服务,可以看到destroy方法也被调用了
分享名称:day11-Servlet01
当前地址:http://scyanting.com/article/dsoidcd.html