JavaWeb之Servlet
1、什么是Servlet?
Servlet是一种动态Web的编程技术,本义是小服务程序的意思。主要作用是接收前端页面传过来的请求,然后发给服务器;接收到服务器返回来的信息后,将信息返回给前段页面。基于Request--Response模型。
2、Servlet的访问过程,分两个小问题来理解:
1、浏览器将请求发送到后台是怎么找到要访问那个Servlet的呢?
答:先看看web.xml里Servlet的配置,如下图:
再看看访问的路径:
http://localhost:8080/ProjectName/ServletName
从访问路径上看,端口后面紧跟着项目名称,这就像是要张三,找到了张三在哪个村子里;紧接着的是Servlet的名称,这就相当于找到了张三家的门牌号。
其实找到项目名称这一步,tomcat服务器就会去这个项目下找web.xml这个文件了,去读取web.xml的<Servlet>标签的配置。
首先会根据访问路径里的/ServletName在<servlet-mapping>标签里面读取<url-pattern>的值。找到了/hello,找到了这个hello也就找到了<servlet-name>里的hello。
到这一步,服务器会接着道<servlet>标签里面找<servlet-name>标签里的值,如果这个值也找到了,那就可以找到<servlet-class>里的Servlet的真实名称了。那就访问到Servlet了。
接下来的是就是要Servlet干活了。
2、Servlet使用什么东西来接收前端传过来的请求又是用什么东西返回响应的数据给前端页面?
答:前面说Servlet是基于Request-Reponse模型设计的。
前端页面传过来的数据对象就会被封装成了Request对象,这个对象里包含了请求的数据。
程序得到Servlet的Request对象之后,就可以从这个对象里面取出需要的数据进行业务逻辑的处理,然后将经过业务逻辑处理的数据发送到服务器的其他模块,继续其他的业务处理。
其他的业务逻辑完成之后,会将数据返回,获取到返回的数据之后,再将返回的数据封装在Reponse对象里,然后回传给前端页面。这样就实现了请求--响应的通讯模型。
其实关于这一点我们可以通过Servlet的Service方法来理解,service方法里面有两个参数,分别是ServletRequest和ServletReponse。这两个参数就承包了承接请求数据和返回响应数据的重任。
3、Servlet的生命周期是怎么样的?
Servlet有5个方法,分别是init、destory、service、getServletConfig、getServletInfo这5个。其中init、destory、servic这三个就是Servlet生命周期相关的方法。其实说白了,Servlet也就像人这辈子一样:
生一次,死一次,中间干很多很多的活。所以init、和destory方法在一个生命周期;里分别只调用了一次。service方法就要调用很多次,具体多少次要看业务需求是什么样子的。
需要注意的是:init初始化方法,可以设置为跟随服务器启动而初始化,也可以设置为当有请求来访问的时候再初始化。具体配置如下图:
我们可以看到<servlet>标签里面配置了<load-on-startup>,这个标签里面如果值大于等于0,那就表示要随着服务器的启动而初始化,如果小于0那就意味着要等有请求访问来调用了才会初始化。具体也还是要根据具体的业务需求来考虑的。
4、ServletConfig的说明
ServletConfig是一个对象,也是Servlet里的一个方法获取的对象。通过这个对象可以实现对Servlet的配置信息的管理。实际上上面提到的init方法里面有一个参数,这个参数就是ServletConfig对。看图';
可以看到,我们可以砸iweb.xml文件里面的Servlet里通过<init-param>标签来配置一些参数。当我们的Servlet需要用到这些参数的时候,就可以通过ServletConfig这个对象来获取到 。比如像上面的配置我们就可以这样获取到username这个单数的值:
ServletConfig config = getServletConfig();//获取ServletConfig对象
String userName = config.getInitParameter("username");//获取username对应的值。
5、ServletContext对象
ServlertContext对象是Servlet的全局对象,对Servlel有着重要的意义。理解了ServlertContext地后面的学习也是很重要的。上面说的ServletConfig对象就维护了ServletContext对象。每一个web应用都会创建一个ServletContext对象,这个对象代表了当前的应用。一个web应用里面有那么多的servlet,servlet跟servlet之间需要共享数据,怎么实现的呢?就是通过这个ServletContext来实现。可以说ServletContext就是Servlet的上下文。我们可以通过源码来看看ServletContext是什么样的,如下图:
可以看到,ServletContext是一个有着很多方法的接口。我们就通过这些方法来实现对web整个全局的Servlet的一个管理,比如要设置一共全局变量来统计网站访问网站的访次数,就可以将count变量通过ServletContext来实现在多个Servlet之间共享这个变量,来达到无论访问哪一个servlet都会计算一次访问的目的。