Servlet入门总结


一、了解Servlet的概念

        Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。

注意:Servlet不是从命令行启动的,而是由包含Java虚拟机的Web服务器进行加载

1)Servlet是按照Servlet规范编写的Java类。

2)Servlet应用请求/响应模型,扩展了服务器的功能。

Servlet是WEB应用程序中的一个组件。

        Servlet是在JSP之前就存在的运行在服务端的一种Java技术,它是用Java语言编写的服务器端程序在JSP技术出现之前,Servlet被广泛地应用来开发动态的Web应用程序

.如今在J2EE项目的开发中,Servlet仍然被广泛的使用。

       Servlet是一种独立于平台和协议的服务器端的Java技术,可以用来生成动态的Web页面与传统的CGI(公共网关接口)和许多其他类似CGI技术相比,Servlet具有更好的可移植性、更强大的功能,更少的投资,更高的效率,更好的安全性等特点



二、Servlet技术功能

       Servlet通过创建一个框架来扩展服务器的能力,以提供在Web上进行请求和响应的服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给Servlet,并让Servlet建立起服务器返回给客户机的响应

当启动Web服务器或客户机第一次请求服务时,可以自动装入Servlet,之后,Servlet继续运行直到其他客户机发出请求。Servlet的功能涉及范围很广

(1)创建并返回一个包含基于客户请求性质的动态内容的完整的HTML页面;

(2)创建可嵌入到现有HTML页面中的一部分HTML页面(HTML片段);

(3)与其他服务器资源(包括数据库和基于Java的应用程序)进行通信;

(4)用多个客户机处理连接,接收多个客户机的输入,并将结果传递到多个客户机上,例如,Servlet可以是多参与者的游戏服务器;

(5)当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至applet的新连接,并将该连接保持在打开状态;当允许客户机和服务器简单、高效地执行会话的情况下,applet也可以启动客户浏览器和服务器之间的连接,可以通过定制协议进行通信;

(6)将订制的处理提供给所有服务器的标准程序。


三、 Servlet技术特点

Servlet技术带给程序员最大的优势是它可以处理客户端传来的HTTP请求,并返回一个响应

Servlet是一个Java类,Java语言能够实现的功能,Servlet基本上都可以实现(图形界面除外)。总的来说,Servlet技术具有以下特点

1.高效。在服务器上仅有一个Java虚拟机在运行,它的优势在于当多个来自客户端的请求进行访问时,Servlet为每个请求分配一个线程而不是进程。

2.方便。Servlet提供了大量的实用工具例程,例如处理很难完成的HTML表单数据、读取和设置HTTP头、处理Cookie和跟踪会话等。

3.跨平台。Servlet是用Java类编写的,它可以在不同的操作系统平台和不同的应用服务器平台下运行。

4.灵活性和可扩展性。采用Servlet开发的Web应用程序,由于Java类的继承性、构造函数等特点,使得其应用灵活,可随意扩展。

6.共享数据。Servlet之间通过共享数据可以很容易地实现数据库连接池。它能方便地实现管理用户请求,简化Session和获取前一页面信息的操作。而在CGI之间通信则很差。由于每个CGI程序的调用都开始一个新的进程,调用间通信通常要通过文件进行,因而相当缓慢。同一台服务器上的不同CGI程序之间的通信也相当麻烦。

7.安全。有些CGI版本有明显的安全弱点。即使是使用最新的标准和PERL等语言,系统也没有基本安全框架。而Java定义有完整的安全机制,包括SSL\CA认证、安全政策等规范。


四、 Servlet生命周期


跟客户端的Applet相似,Servlet(这里Servlet的概念又回到了最原始的含义)也遵循严格的生命周期。在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:


  1.init()。当Servlet第一次被装载时, Servlet引擎调用这个Servlet的init()方法,只调用一次 。如果某个Sevlet需要特殊的初始化需要。那么Servlet编写人员可以重写该方法来执行初始化任务。这是一个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它父类的init方法。系统保证, 在init方法成功完成以前,是不会调用Servlet去处理任何请求的
  2.service()。这是Servlet最重要的方法,是
真正处理请求的地方 。对于每个请求,Servlet引擎将调用Servlet的service方法, 并把Servlet请求对象和Servlet响应对象作为参数传递给它。
  3.destroy()。这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中所分配的资源

Servlet的生命周期可以被归纳为以下几步:
  (1) 装载Servlet,这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,用于在Servlet启动时强制装载和初始化特定的Servlet
  (2) Server创建一个Servlet实例

  (3) Server调用Servlet的init方法


  (4) 一个客户端请求到达Server
  (5) Server创建一个请求对象

  (6) Server创建一个响应对象


  (7) Server激活Servlet的service方法,传递请求和响应对象作为参数
  (8) service方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
  (9) service方法使用响应对象的方法。将响应传回Server,最终到达客户端。Service方法可能激活其他方法以处理请求。如doGet,doPost或其他程序员自己开发的方法
  (10) 对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此servlet的service方法,将这两个对象作为参数传递给它,如此重复以上的循环,但无需再次调用init方法,Servlet一般只初始化一次
  (11) 当Server不再需要Servlet时,比如当Server要关闭时,Server调用Servlet的destroy



五、servlet工作过程

Web服务器在与客户端交互时.Servlet的工作过程是:

1.     在客户端对web服务器发出请求

2.     web服务器接收到请求后将其发送给Servlet

3.     Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器.

4.     web服务器将从Servlet实例对象中收到的响应结构发送回客户端.




六 、Servlet与JSP区别

        简单的说,SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。 后来SUN推出了类似于ASP的镶嵌型的JSP,把JSP TAG镶嵌到HTML语句中,这样,就大大简化和方便了网页的设计和修改。新型的网络语言如ASP,PHP,JSP都是镶嵌型的SCRIPT语言。

1、JSP在本质上就是SERVLET,但是两者的创建方式不一样.

2、Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.

3、JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.

      因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

1、JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。

2、JSP编译后是“类servlet”。

3、Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件。

4、JSP侧重于视图,Servlet主要用于控制逻辑

七、Servlet代码结构

        该Servlet处理的是get请求,如果读者不理解HTTP,可以把它看成是当用户在浏览器地址栏输入URL、单击Web页面中的链接、提交没有指定method的表单时浏览器所发出的请求

        Servlet也可以很方便地处理post请求。post请求是提交那些指定了method=“post”的表单时所发出的请求。若要创建一个Servlet,则应使创建的类继承HttpServlet类,并覆盖doGet()、doPost()方法之一或全部。doGet()和doPost()方法都有两个参数,分别为HttpServletRequest类型和HttpServletResponse类型


         HttpServletRequest提供访问有关请求的信息的方法,例如表单数据、HTTP请求头等。HttpServletResponse除了提供用于指定HTTP应答状态(200,404等)、应答头(Content-Type,Set-Cookie等)的方法之外,最重要的是它提供了一个用于向客户端发送数据的PrintWriter

         对于简单的Servlet来说,它的大部分工作是通过println()方法生成向客户端发送的页面

         注意:doGet()方法和doPost()方法抛出两个异常,因此必须在声明中包含它们。另外还必须导入java.io包(要用到PrintWriter等类)、javax.servlet包(要用到HttpServlet等类)以及javax.servlet.http包要用到(HttpServlet Request类和HttpServletResponse类)。doGet()和doPost()这两个方法是由service()方法调用的,有时可能需要直接覆盖service()方法,比如Servlet要处理Get和Post两种请求时

        如果要开发一个可以处理HTTP请求的Servlet程序,则肯定要继承HttpServlet类,而且在自定义的Servlet类中还要重写HttpServlet类中提供的doGet()方法。Servlet程序本身也是按照请求和应答的方式进行的,所以在doGet()方法中定义了两个参数,即HttpServletRequest和HttpServletResponse,用来接收和回应用户的请求.



出处:http://blog.csdn.net/evankaka

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL日期类型的处理总结

一、概述 MySQL中的日期类型包括以下5种: 类型大小 (字节)范围格式用途DATE31000-01-01/9999-12-31YYYY-MM-DD日期值TIME3-838:59:59/838:59:59HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:…

详解HTTP协议~~~

详解HTTP协议~~~HTTP 简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。HTTP是一个基于TCP/IP通信协议来传递数据(…

MyBatis基础知识概述

一、依赖配置 添加依赖即可&#xff0c;jar包或pom依赖&#xff1a; <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version> </dependency> 二、SqlSessionFactory 2.1 什…

Mybatis Plus————代码生成器

代码生成器 MyBatis Plus是MyBatis的扩展框架&#xff0c;而代码生成器是MP的核心功能之一&#xff0c;另外还有 “条件构造器”和“通用CRUD”等功能。 步骤演示 mp的代码生成器有两种方式自动生成代码&#xff0c;一种是通过main方法来执行程序&#xff0c;另一种是通过maven…

Spring MVC 流程图解析

Spring MVC 流程图解析Spring MVC工作流程图图一图二 SpringMVC工作流程描述DispatcherServlet&#xff0c;HandlerMapping&#xff0c;HandlerExecutionChain&#xff0c;HandlerAdapter&#xff0c;HttpMessageConveter&#xff0c;BindingResult&#xff0c;ModelAndView&am…

Java并发编程实战————可重入内置锁

引言 在《Java Concurrency in Practice》的加锁机制一节中作者提到&#xff1a; Java提供一种内置的锁机制来支持原子性&#xff1a;同步代码块。“重入”意味着获取锁的操作的粒度是“线程”&#xff0c;而不是调用。当某个线程请求一个由其他线程持有的锁时&#xff0c;发出…

java的守护进程与非守护进程

java的守护进程与非守护进程 最近重新研究Java基础知识&#xff0c;发现以前太多知识知识略略带过了&#xff0c;比较说Java的线程机制&#xff0c;在Java中有两类线程&#xff1a; User Thread(用户线程)、Daemon Thread(守护线程) &#xff0c;&#xff08;PS:以前忽略了&a…

双剑合璧————Spring Boot + Mybatis Plus

引言 最近在学习Mybatis Plus的使用&#xff0c;希望通过spring boot快速将mybatis plus整合进来。 对于springboot项目&#xff0c;mybatis plus团队也有自己的启动器 &#xff1a;mybatis-plus-boot-starter。这个依赖内部已经整合了mybatis-spring&#xff0c;也包括非快速…

Java中常用的类,包,接口

Java中常用的类&#xff0c;包&#xff0c;接口包名说明java.lang该包提供了Java编程的基础类&#xff0c;例如 Object、Math、String、StringBuffer、System、Thread等&#xff0c;不使用该包就很难编写Java代码了。java.util该包提供了包含集合框架、遗留的集合类、事件模型、…

Collection框架介绍

Collection&#xff1a;List列表&#xff0c;Set集&#xff0c; Map&#xff1a;Hashtable&#xff0c;HashMap&#xff0c;TreeMapCollection 是单列集合 List 元素是有序的、可重复 有序的 collection&#xff0c;可以对列表中每个元素的插入位置进行精确地控制。 可以根据…

Git初学札记(一)————Git简介与安装

前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。&#xff08;在这里再一次致敬Linus大神&#xff09;特点 分布式相比于集中式的最…

Hashtable、HashMap、TreeMap总结

Hashtable、HashMap、TreeMap总结三者均实现了Map接口&#xff0c;存储的内容是基于key-value的键值对映射&#xff0c;一个映射不能有重复的键&#xff0c;一个键最多只能映射一个值。 &#xff08;元顺初线&#xff09;&#xff08;1&#xff09; 元素特性HashTable中的key、…

Git初学札记(二)————EGit导入远程Git仓库项目(Clone操作)

引言 我们在实际开发项目的时候&#xff0c;难免要使用像Eclipse或者IDEA这样的继承开发工具&#xff0c;除了部分“牙牙学语”的程序员需要手动输入javac去编译程序以外&#xff0c;在实际开发中手动编译并运行项目的“猿族”应该是已经绝种了。 我个人认为&#xff0c;使用gi…

int和Integer的比较

int和Integer的比较1 int和IntegerJDK1.5引入了自动装箱与自动拆箱功能&#xff0c;Java可根据上下文&#xff0c;实现int/Integer,double/Double,boolean/Boolean等基本类型与相应对象之间的自动转换&#xff0c;为开发过程带来极大便利。最常用的是通过new方法构建Integer对象…

Git初学札记(三)————创建Git版本库

引言 版本库即所谓的Git仓库&#xff0c;英文名称是Repository&#xff0c;可以简单理解为一个目录&#xff08;.git folder&#xff09;&#xff0c;这个目录可以记录并保存直接父级及其子目录下的全部文本文件的修改操作&#xff0c;谓之“版本控制”&#xff01; 手动建库 不…

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

目录 引言 Git命令行的远程Push EGit Push操作中的冲突问题 同步 工作区与本地库同步 工作区与远程库同步 图标 重点 引言 在团队开发当中&#xff0c;Git Push是多人协作环节中的最重要的一环可能没有之一。同SVN一样&#xff0c;push操作可以看做是对远端程序的提交…

一篇博客读懂设计模式之---动态代理与反射

一篇博客读懂设计模式之---动态代理与反射 先来讲一下反射&#xff1a; 1 关于反射反射最大的作用之一就在于我们可以不用在编译时就知道某个对象的类型&#xff0c;而在运行时通过提供完整的”包名类名.class”得到。注意&#xff1a;不是在编译时&#xff0c;而是在运行时。…

Git初学札记(五)————Branch分支管理

引言 正如之前的博客中提到的&#xff0c;Git区别于Svn的一个最明显的功能就是分支管理功能。 那么什么是分支&#xff1f;分支又能为我们的开发带来什么翻天覆地的变化呢&#xff1f;&#xff08;为了使博客的内容更具权威性和专业性&#xff0c;以下部分内容摘自官方文档《Gi…

多线程中 start()和run()方法的区别

多线程中 start&#xff08;&#xff09;和run&#xff08;&#xff09;方法的区别&#xff1a;Java线程一直是一个比较容易困扰的地方,首先&#xff0c;我们来认识下怎样生存线程。认识 Thread 和Runnablejava中实现多线程有两种途径&#xff1a;继承Thread类或者实现Runnabl…

Git初学札记(六)————在远程新建本地Branch与在本地新建远程Branch

引言 本篇博客介绍将现有的本地分支以新的分支形式推送到远程库中&#xff0c;和以新的分支的形式从远程库中拉取一个分支。这两个功能都是比较简单的操作&#xff0c;但是在实际开发中&#xff0c;可能会在开发初期有所触及。比如我们希望将远程的dev分支拉取到本地来进行开发…