Tomcat 学习总结(1) --Servlet技术
在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中混入大量、复杂的业务逻辑同样也是不可取的
3、通过MVC双剑合璧
既然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中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。
Tomcat 学习总结(1) --Servlet技术的更多相关文章
- 《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法
这一章节主要是介绍了Servlet技术的一些高级用法,如下是我自己的整理归纳 1.下载文件:即获取服务器文件,并把文件写入反馈给客户端 ServletContext.getResourceAsStre ...
- Servlet的学习之Filter过滤器技术(1)
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- [转]Servlet的学习之Filter过滤器技术
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- java学习笔记—Servlet技术(11)
如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术.那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术. Servlet技术简介 Servle ...
- Java Web之Servlet技术
1.Servlet基础 针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax. ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- 【Java】Java Servlet 技术简介
Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...
- Tomcat学习总结(7)——Tomcat与Jetty比较
Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...
- JavaWeb学习总结-04 Servlet 学习和使用
一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...
随机推荐
- 前端三剑客之-html
web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind ...
- Redis 通过 scan 找出不过期的 key
SCAN 命令是一个基于游标的迭代器(cursor based iterator):SCAN 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游 ...
- 007.MongoDB特殊成员
一 MongoDB成员 1.1 常见特殊member Secondary存在一些特殊的成员类型: Priority 0 #不能升为主,可以用于多数据中心场景 Hidden #对客户端来说是不可见的,一 ...
- Druid-代码段-3-1
所属文章:池化技术(一)Druid是如何管理数据库连接的? 本代码段对应主流程3,新增连接的守护线程: //DruidDataSource的内部类,对应主流程3,用来补充连接 public class ...
- Ovirt 简单配置
Ovirt是一款开源的虚拟化平台管理 主要组成: 1.OvirtEngine Server 用于管理和分配资源 ,能通过web管理 2.Hosts 提供虚拟化功能,提供CPU资源和内存资源,用于分配给 ...
- 图解JVM垃圾内存回收算法
图解JVM垃圾内存回收算法 这篇文章主要介绍了图解JVM垃圾内存回收算法,由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率,下面博主和大家来一起学习一下吧 前言 首先,我们要讲 ...
- mybatis foreach方法遍历对象
<delete id="deleteAppUserByIds"> delete from app_userinfo where <foreach i ...
- 将静态页面部署到github.io
背景: 我的腾讯云服务器是之前利用学生身份(有优惠)买的,现在快到期了,而且服务器上面只有一个引导页(静态页面)还有用,别的项目都没有用了.所以就想找一种不花钱买服务器就可以访问到我的引导页的方法 ...
- Luogu P5408 【模板】第一类斯特林数·行
为什么要做这题呢,当然是有用啊qwq 首先我们考虑非常经典的式子: \[x^{\overline{n}}=\sum_i \left[^n_i\right] x^i\] 然后上倍增: \[x^{\ove ...
- super()方法详解
目录 一.单独调用父类的方法 二.super() 方法基本概念 2.1 描述 2.2 语法 2.3 单继承使用super() 2.4 多继承使用super() 三.注意事项 四.练习 一.单独调用父类 ...