在Web应用中,Servlet是一门重要的技术,Servlet是利用Java类编写的服务端程序,与平台架构,协议无关。
JSP的实质就是Servlet,因为所有的JSP页面传回服务端时要转为Servlet进行编译运行。
JSP编写HTML页面直观且易调试,所以JSP逐步取代了Servlet在开发页面中的作用。
1,Servlet 是什么?
Servlet就是一种实现了Servlet接口的类,它是由web容器负责创建并调用,它可以被看做是一个位于客户端和服务端的中间层,负责接收和响应用户的请求。并把处理结果返回到客户端显示,是运行在服务端一段程序。
专业理解:
Servlet是一个Java编写的程序,此程序是基于Http协议的,在服务器端运行的(如tomcat),是按照Servlet规范编写的一个Java类。
在BS架构中,早期的Web服务器只能处理静态资源的请求,也就是无法根据请求进行计算后再生成相应的HTML内容。为了补充Web服务器的这个缺陷,于是增强服务器功能的CGI技术最早产生了。CGI(Common Gateway Interface通用网关接口)也是一种规范,可以使用不同的语言来开发,如Perl,C,Java等都可以。当客户端请求静态资源时,Web服务器会自己处理并返回,当客户端请求动态资源时,Web服务器会把请求转交给扩展程序来处理,并将扩展程序的处理结果返回给客户端。但是CGI技术开发复杂,性能较差,只要有一个请求到达,Web服务器就会单独分配一个进程来进行处理,可移植性不好,所以慢慢就由后来的Servlet技术所取代。
Servlet技术是使用Java语言开发的一套组件规范,不再像CGI技术那样需要分配单独的进程来处理请求,而是单独分配一个线程来处理,于是大大提升了处理效率。并且Java语言是跨平台的语言,也提升了Web服务器扩展程序的可移植性,已经取代了CGI技术,成为BS架构中的主流技术。所有后续的BS架构中的主流框架本质上都是基于Servlet来实现的。
2,Servlet 提供的功能
(1)对客户端发送的数据进行读取和拦截
客户端发送一个请求时,一般都会携带一些数据(例如:URL中的参数,页面中的表单,Ajax提交的参数等),当一个Servlet接收到这些请求时,Java Servlet 中的类通过所提供的的方法就能得到这些参数,(例如:方法request.getParameterName(name)用于获得名为name的参数值),也正是这些原因,Servlet可以对发送请求起到拦截作用,他在某些请求前先做一个预处理分析,从而判断客户端是否可以做这些请求(例如:检查访问权限,设定程序的字符集,检查用户角色等),当Servlet有上面这些功能时,一般称为拦截器。
(2)读取客户端请求的隐含数据
客户端请求的数据可以分为隐含数据和显示数据:
隐含数据:一般是不直接跟随于URL中,它存在于请求的来源,缓存数据(Cookie),客户端类型中;
显式数据:显然是用户可以直观看到的(例如:表单数据,URL参数),
Servlet不仅可以处理显式数据,而且可以处理隐含数据,是个“多面手”;
(3)运行结果或者生成结果
当一个Web应用程序对客户端发出的请求作出响应时,一般需要很多中间过程,才能得到结果,Servlet就是起到这个中间角色的作用,它协调各组件,各部分完成响应功能,根据不同的请求作出相应的响应并显示结果。
(4)发送响应的数据
Servlet在客户端作出响应并经过处理得出结果后,会对客户端发送响应的数据,以便让客户端获取请求的结果数据。在Web应用程序中,Servlet的这个作用相当突出,无论现有技术多么突出,都是基于这个技术点出发的。
综上所述,servlet的运行顺序大概如下图所示: Servlet执行流程
1.客户端发送请求给服务器。
2.服务器开始接受,先判断该请求的servlet实例是否存在,如果不存在先装载一个servlet类并创建实例。如果存在则直接调用该servlet的service方法,之后进行判断是调用doGet方法还是doPost方法。
3.servlet创建实例后,调用init方法进行初始化。之后调用servce方法,判断是调用doGet方法还是doPost方法。
4.最后判断服务是否关闭,如果关闭则调用destroy方法。
(开始----Servlet实例是否存在----装载Servlet类并创建实例 构造方法----调用init(Servlet)类并创建实例----调用service(Servlet Requst Servlet Response)方法----服务器关闭-----调用Destroy的方法)
访问Servlet流程
1、提交超链接请求后,服务器会在web.xml中的<servlet-mapping>寻找对应的url(url-pattern)地址,然后得到这个servlet的名称。
2、得到名称后,在servlet中寻找名称相同的标签,然后得到处理类(servlet-class文件)
3、进入servlet处理类,根据请求方式(get或者post)执行d(oGet或者doPost)方法
3,Servlet技术的特点
Servlet在开发中带来的优点是:能及时响应和处理Web端的请求,使得一个不懂网页的Java开发人员,也能编写出Web应用程序,只是在开发/修改时比较困难,因此,代码的可读性,比较差,也比较难以维护。但是它具有以下优点:
(1)高效性
Servlet本身就是一个Java类,在运行的时候位于同一个java虚拟机中,可以快速的响应客户端的请求并并生成结果,在一个Web服务器中处理一个请求都是用的是线程而非进程,也就是说在性能开销方面小很多,无需大量启动进程时间,在高并发量访问时,一个进程可以有多个线程,并发时线程在CPU使用的开销代价远小于进程的开销代价。
(2)开发一个Web程序时,从开发顺序上说,比较简单,首先定义一个Servlet类,然后在系统(web.xml)中配置程序,继而发布程序,这样一个web就完成了,在开发过程中,系统提供了大量实用工具,可以处理复杂的HTML表单数据,处理cookie,跟踪网页会话等。
4,servlet的生命周期
分为三个阶段 初始化(包括装载和初始化) 运行 消亡
(0)加载和实例化(装载Servlet实例)
装载就是:由Servlet容器装载一个Servlet的类,把它装载到一个java内存中,Servlet容器可以创建一个Servlet对象并与web.xml对应;
当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。
(1) 初始化
实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。
(2)服务
初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,Servlet容器将创建HttpServletRequest和HttpServletResponse对象调用service(HttpServletRequest request ,HttpServletResponse response)的方法 处理客户端请求,service()方法通过request对象获得请求对象的信息并加以处理,再由response对象对客户端作出响应。
(3)销毁
当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)。
5,Servlet和JSP的比较
(1)Servlet是Java代码,jsp是页面代码。
编写Servlet就是编写Java代码,所以应用java中的规范去编写Servlet类就可以了,但是若想在客户端响应结果,就必须在代码中加入大量的Html代码,可想而知,当想要得到一个比较美观,复杂的界面时,html会相当的多,而且繁琐,Jsp是以html代码为主,在页面中适当的嵌入Java代码来处理业务上的逻辑,显然jsp比servlet较易编写而且美观,所以
如果业务中主要以页面为主,选择Jsp技术; 反之,则选择Servlet技术,适合服务器端开发;
(2)Servlet的运行速度快过Jsp
因为Servlet本身就是一个Java类,编译时直接转化为.class类文件,而jsp需要先编译为Java类,而后在运行,Servlet的运行速度较快;
jsp与servlet的区别与联系
jsp和servlet的区别和联系:
1.jsp经编译后就变成了Servlet.
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
联系:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet和JSP最主要的不同点在于:
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑
Servlet更多的是类似于一个Controller,用来做控制。
理解以下三点即可:
1、不同之处在哪?
-
- Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容
- JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
2、各自的特点
-
- Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
- JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的
既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
-
- Controller——负责转发请求,对请求进行处理
- View——负责界面显示
- Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现
在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:
- Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
- Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
- Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
- 动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;
JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。