在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容器将创建HttpServletRequestHttpServletResponse对象调用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中混入大量、复杂的业务逻辑同样也是不可取的

  3、通过MVC双剑合璧

  既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。

   MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

    • Controller——负责转发请求,对请求进行处理
    • View——负责界面显示
    • Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:

  1. Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
  2. Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
  3. Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
  4. 动态生成的HTML内容返回到浏览器显示

        MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;

    JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。

Tomcat 学习总结(1) --Servlet技术的更多相关文章

  1. 《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法

    这一章节主要是介绍了Servlet技术的一些高级用法,如下是我自己的整理归纳 1.下载文件:即获取服务器文件,并把文件写入反馈给客户端 ServletContext.getResourceAsStre ...

  2. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  3. [转]Servlet的学习之Filter过滤器技术

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  4. java学习笔记—Servlet技术(11)

    如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术.那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术. Servlet技术简介 Servle ...

  5. Java Web之Servlet技术

    1.Servlet基础 针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax. ...

  6. Java Servlet 技术简介

    Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...

  7. 【Java】Java Servlet 技术简介

    Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...

  8. Tomcat学习总结(7)——Tomcat与Jetty比较

    Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...

  9. JavaWeb学习总结-04 Servlet 学习和使用

    一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...

随机推荐

  1. CheckBoxList选中某项,获取其它项是否是选中

    <div class="formControls col-xs-8 col-sm-9" style="margin-top:-15px;" id=&quo ...

  2. Scrapy的下载中间件

    下载中间件 简介 下载器,无法执行js代码,本身不支持代理 下载中间件用来hooks进Scrapy的request/response处理过程的框架,一个轻量级的底层系统,用来全局修改scrapy的re ...

  3. node.js守护进程问题的解决

    最近自己写了一个node.js来读取redis数据,编写完成后按理来说加& 应该是有效的 nohup node redis.js & 但是每次关闭终端后这个进程就自动停止了,百度了下 ...

  4. 201871010126 王亚涛 《面向对象程序设计 (Java)》第十六周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/12 ...

  5. LG2679 「NOIP2015」子串 线性DP

    问题描述 LG2679 题解 设\(opt[i][j]\)代表A串前\(i\)个,匹配\(B\)串前\(j\)个,选择了\(k\)个子串的方案数. 转移用前缀和优化一下. \(\mathrm{Code ...

  6. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  7. Codeforces Round #594 (Div. 2) A. Integer Points 水题

    A. Integer Points DLS and JLS are bored with a Math lesson. In order to entertain themselves, DLS to ...

  8. Java连载42-this不能省略的情况、构造方法设置默认值的方法

    一. this什么时候是不能省略的,我们举个例子来说明 class User2{ private int id; public int getId() { return id; } public vo ...

  9. 使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

    一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表 ...

  10. 大话设计模式Python实现-中介者模式

    中介者模式(Mediator Pattern):用一个对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互. 下面是一个中介者模式的demo ...