1.Servlet是什么
符合servlet规范的java组件,运行在servlet容器当中,用于扩展web服务器功能。
通俗一点,只要是实现了servlet接口的java程序,均称Servlet,它可以做java类能做的事情,主要包括:业务逻辑,数据访问。
Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小程序。
servlet容器:符合servlet规范的web服务器。比如Tomcat,Jboss...
2.如何去理解Servlet的作用
2.1从应用程序的架构去理解
应用程序的架构一般包括三层的C/S和两层B/S。
三层C/S:
client:界面、部分业务逻辑、通信
server:通信、业务逻辑
db:数据的管理
复杂的部分:通信模块一般要采用自定义协议来编码和解码数据,同时,为方便业务逻辑处理模块来处理,通信模块一般还要将接受到的数据转变为一个对象(在该对象中,封装了客户端发送过来的请求数据),这个对象我们称为"请求对象";另外,业务逻辑处理模块将处理之后的结果一般也会封装为一个"响应对象"(在该对象中,封装了处理之后的结果数据)。该响应对象由通信模块编码后,再发送给客户端。
B/S:
Client:标准化了, 采用标准的浏览器 + html来实现。浏览器会将html数据采用标准的http协议编码后发送给web服务器。
Server:标准化了,采用符合规范的servlet容器+servlet来实现。servlet容器实现了通信模块,servlet只需要实现业务逻辑即可。(其实,servlet容器也会像三层c/s架构中的通讯模块一样,会将请求数据,即浏览器发送过来的数据,封装成为一个请求对象,也会将servlet处理之后的结果封装为响应对象)。
2.2从web服务器发展的历史去理解
早期:
浏览器通过http协议向web服务器发请求,都是一些静态资源方面的请求(比如请求一个a.html文件),服务器去查找,查到,则返回该文件,没找到,则返回一个404状态码。web服务器为了能够处理动态的请求,比如一个开户操作,要访问数据库,要处理相关的业务逻辑(即要写相应的程序代码)。需要使用c/perl等语言开发cgi程序,web服务器会调用该程序来处理业务逻辑。cgi程序要两个问题:一是开发的复杂度,二是每一个请求都会启动一个cgi进程,系统的消耗比较大。
现在:使用servlet容器+servlet
servlet容器对于静态资源的请求,处理方式和传统的web服务器一样。对于动态请求,也就是业务逻辑的处理,会调用servlet来处理(servlet就是一个java对象,可以方便地进行业务逻辑的运算)。servlet有两个优势:一是开发简单,是一个面向对象的语言,方便封装业务逻辑。二是,每一个请求,只会启动一个线程,系统的开销比较小。
3.Servlet的执行过程
1)浏览器会将请求打包成http请求数据包,发送给web服务器。
2)web服务器中servlet引擎解析请求,并封装为一个HttpServletRequest对象(包含了请求数据)。同时,创建一个ttpServletResponse对象。
3)servlet引擎调用servlet的service()方法,并将HttpServletRequest,HttpServletResponse对象作为参数传递给servlet实例。 servlet引擎会先查看要调用的servlet是否已经实例化。若没有实例化,则调用其构造器(不带参的)实例化。若已经实例化了(比如之前已经被调用过)则不再实例化。也就是说多个请求有可能共享同一个servlet实例,不同线程。
4)servlet可以从HttpServletRequest对象中获得请求数据,并处理,当然,servlet也可能要访问数据库。然后将处理之后的结果放到HttpServletRespose。——这一块包括了DAO、ENTITY、DBUtil等。
5)servlet引擎从HttpServletResponse中取数据,并将数据打包成http数据包,发送给浏览器。
4.Servlet工程的编写
项目名称会部署到Tomcat的webapps下面,src中的JAVA程序会自动部署到webapps--项目名称--WEB-INF---classes下面,WebRoot文件夹会原封不动部署到webapps--项目名称下面。
web.xml是编写servlet的时候自动生成,服务器就是通过这个web.xml把http请求与Servlet对应起来。它的结构是这样的:
通过rul获取到servlet-name,通过servlet-name获取到servlet的路径。
rul的匹配模式:
servlet引擎会将请求地址,比如 http://localhost:8080/webday09/some
除掉应用名之前(包括应用名),剩下的路径与url-pattern去匹配。 在这里,剩下的是/some。
一是精确匹配
servlet引擎使用请求路径与url-pattern进行一致性地匹配。要求大小写完全致。
二是使用通配符去匹配
/*
引擎先进行精确匹配,在精确匹配不成功的情况下,会再进行 通配符匹配。
三是后缀匹配
*.action
匹配所有以.action结尾的路径。