Servlet是ServerApplet的缩写,译为“服务器端小程序”。Servlet是Java的一套技术标准,规定了如何使用Java开发动态网站。也就是说,可以用Java来开发网站后台,但是必须事先定义一套规范,写一个基础类库。这就是Servlet所做的。JavaServlet可以使用所有的JavaAPI,Java能做的,Servlet也能做。Servlet只是古老的CGI技术的替代品,直接使用Servlet开发还是很麻烦的,所以后来Java对Servlet进行了升级,引入了JSP技术。JSP只是给Servlet加了一层壳,JSP编译后仍然是Servlet。什么是Servlet?JavaServlet是运行在Web服务器或应用程序服务器上的程序。它充当来自Web浏览器或其他HTTP客户端的请求与HTTP服务器上的数据库或应用程序之间的中间层。使用servlet,您可以从网页表单收集用户输入,从数据库或其他来源呈现记录,并动态创建网页。JavaServlet通常可以达到与使用CGI(CommonGatewayInterface,公共网关接口)实现的程序相同的效果。但与CGI相比,Servlet具有以下优点:?性能明显更好。?Servlet在Web服务器的地址空间内执行。这样就不需要创建单独的进程来处理每个客户端请求。?Servlet是独立于平台的,因为它们是用Java编写的。?服务器上的Java安全管理器实施一系列限制以保护服务器计算机上的资源。因此,servlet是可信的。?Java类库的全部功能可供Servlet使用。它可以通过套接字和RMI机制与小程序、数据库或其他软件进行交互。Servlet体系结构下图显示了Servlet在Web应用程序中的位置。在Servlet实现过程中最早支持Servlet技术的是JavaSoft的JavaWebServer。从那时起,其他一些基于Java的Web服务器已经支持标准的ServletAPI。Servlet的主要功能是交互式地浏览和修改数据,生成动态的Web内容。这个过程是:?客户端向服务器发送请求;?服务器向Servlet发送请求信息;?Servlet生成响应内容并将其发送到服务器。响应内容是动态生成的,通常取决于客户端的请求;?服务器将响应返回给客户端。?Servlet看起来像普通的Java程序。Servlet导入属于JavaServletAPI的特定包。因为是对象字节码,所以可以从网络上动态加载。可以说Servlet之于Server就像Applet之于Client一样。但是,由于Servlet运行在Server中,因此它们不需要图形用户界面。从这个角度来看,Servlet也被称为FacelessObject。?servlet是Java编程语言中的一个类,用于扩展托管应用程序的服务器的功能,这些应用程序可以通过“请求-响应”编程模型访问。尽管servlet可以响应任何类型的请求,但它们通常仅用于扩展Web服务器应用程序。Servlet命名Servlet命名可以看出sun命名的特点,比如Applet表示小应用程序;Scriptlet=Script+Applet表示小脚本程序;同理Servlet=Service+Applet表示小服务程序。生命周期编辑客户端请求Servlet;将Servlet类加载到内存中;实例化并调用init()方法初始化Servlet;service()(根据请求方法调用doGet()或doPost(),以及doHead()、doPut()、doTrace()、doDelete()、doOptions());破坏()。加载并实例化一个servlet。此操作通常是动态执行的。但是,Server通常会提供一个管理选项,在Server启动时强制加载和初始化特定的Servlet。服务器创建一个Servlet实例。第一个client的请求到达Server,调用Servlet的init()方法(可以配置为在Server创建Servlet实例时调用。配置web.xml中tag下的tag。配置的值为integer,valueServlet越小,启动优先级越高)客户端的请求到达ServerServer创建请求对象,处理客户端请求Server创建响应对象,响应客户端请求Server激活Servlet的service()方法,并通过request和response对象作为Parametersservice()方法获取request对象的信息,处理请求,访问其他资源,获取需要的信息。service()方法使用响应对象的方法将响应发送回服务器,最后发送给客户端。service()方法可能会激活其他方法来处理请求,例如doGet()或doPost()或程序员自己开发的新方法。对于更多的客户端请求,服务器创建新的请求和响应对象,仍然激活这个Servlet的service()方法,将这两个对象作为参数传递给它。像这样重复上面的循环,但不要再次调用init()方法。一般Servlet只初始化一次(只有一个对象)。当Server不再需要Servlet时(一般是Server关闭时),Server调用Servlet的destroy()方法。Servlet的工作方式客户端向服务器发送请求;服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容发送给服务器;服务器将响应返回给客户端。比较与Applet的相似之处:?它们不是独立的应用程序,也没有main()方法。?它们不是由用户或程序员调用的,而是由另一个应用程序(容器)调用的。?它们都有一个生命周期,包括init()和destroy()方法。差异:?Applet具有良好的图形界面(AWT),与浏览器一起在客户端运行。?Servlet没有图形界面,运行在服务器端。与CGI相比JavaServlet与传统的CGI和其他许多类CGI技术相比,效率更高、使用更方便、功能更强大、可移植性更好、投资更省。在未来的技术发展过程中,Servlet可能会完全取代CGI。在传统的CGI中,每个请求都会启动一个新进程。如果CGI程序本身的执行时间很短,启动进程所需的开销很可能会超过实际执行时间。在Servlet中,每个请求都由轻量级Java线程(而不是重量级操作系统进程)处理。在传统的CGI中,如果对同一个CGI程序有N个并发请求,则CGI程序的代码会被重复加载N次内存;对于Servlet,使用N个线程来处理请求,只需要一份Servlet。班级代码。在性能优化方面,Servlet也比CGI有更多的选择。?便捷的Servlet提供了大量实用例程,例如自动解析和解码HTML表单数据、读取和设置HTTP标头、处理cookie、跟踪会话状态等。?强大的功能在Servlet中,许多任务很难用Servlet完成传统的CGI程序可以轻松完成。例如,Servlets可以直接与Web服务器进行交互,而普通的CGI程序则不能。Servlet还可以在程序之间共享数据,使数据库连接池之类的东西易于实现。?良好的可移植性Servlet是用Java编写的,ServletAPI有完整的标准。因此,为IPlanetEnterpriseServer编写的Servlet无需任何实质性更改即可移植到Apache、MicrosoftIIS或WebStar。几乎所有主要服务器都直接或通过插件支持Servlet。?节省投资个人或小型网站不仅有很多便宜甚至免费的网络服务器可用,而且对于现有的服务器,如果不支持Servlet,往往可以免费增加这部分功能(或者只需要最少的投资)。与JSP相比,很多人不知道JSP和Servlet的区别是如何体现在应用中的。简单的说,SUN最早开发的Servlet,功能比较强大,系统设计先进,但是仍然采用老式的CGI方式输出HTML语句,逐句输出,编写和修改HTML非常不方便.JavaServerPages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术。JSP本质上没有增加Servlet无法实现的功能。但是在JSP中写静态HTML更方便,不再需要使用println语句输出每一行HTML代码。更重要的是,随着内容和外观的分离,页面制作中不同性质的任务可以很容易地分离出来:例如页面设计人员进行HTML设计,同时为servlet程序员插入动态内容留出空间。后来SUN推出了类似于ASP的马赛克JSP,将JSPTAG嵌入到HTML语句中,大大简化和方便了网页的设计和修改。ASP、PHP、JSP等新的网络语言都是嵌入式语言。这就是JSP和Servlet区别的运行原理层面。从网络的三层结构来看JSP和Servlet的区别,一个网络项目至少分为三层:数据层(datalayer)、业务层(businesslayer)、表现层(presentation)层)。当然它可以更复杂。Servlet写业务层很强大,但是写表示层很不方便。JSP主要是为了方便编写表现层而设计的。当然你也可以写业务层。写惯了ASP、PHP、CGI的朋友,往往会不自觉地把表现层和业务层搞混。按照SUN自己的建议,JSP中只应该存放与表现层相关的东西,也就是只存放输出HTML网页的部分。而所有的数据计算、数据分析、数据库连接处理都属于业务层,应该放在JavaBEANS中。通过JSP调用JavaBEANS,实现两层融合。微软不久前推出的DNA技术就是ASP+COM/DCOM技术。完全类似于JSP+BEANS,所有表现层由ASP完成,所有业务层由COM/DCOM完成。集成是通过调用实现的。使用这些组件技术的原因很简单,因为ASP/JSP语言的执行效率非常低。如果有大量的用户点击,纯SCRIPT语言很快就会达到其功能上限,而组件技术可以大大提高功能上限并加快执行速度。速度。另一方面,纯SCRIPT语言将表现层和业务层混在一起,修改起来不方便,代码也不能复用。如果要修改一个地方,往往会涉及十几页代码。如果使用组件技术,只需要修改组件即可。综上所述,Servlet是一个早期不完善的产物。写业务层很好,写表现层就很臭了,两层混在一起。于是推出了JSP+BEAN,表现层用JSP写,业务层用BEAN写。SUN自己的意思是以后用JSP代替Servlet。这就是JSP和Servlet在技术更新上的区别。但是,这并不意味着学习Servlet就没有用。其实应该从Servlet开始,然后是JSP,然后是JSP+BEAN。强调一下,如果你学过JSP,你不会使用JavaBEAN并集成它,就是没学过。大家多花精力在JSP+BEAN上。我们可以看到,ASP+COM和JSP+BEAN在采用组件技术时,都是先编译所有的组件,驻留在内存中,然后快速执行。因此,Servlet/JSP在内存中编译然后执行的速度优势就没有了。相反,ASP+COM+IIS+NT的紧密结合应该有更大的速度优势。而且,ASP+COM+IIS+NT的开发效率很高,虽然BUG很多。那么,为什么要使用JSP+BEAN呢?因为Java真的很有前途。随着操作系统的兴起,应用软件的开发者必须找到通用的开发语言进行开发,Java一统天下的时代即将到来。浅析JSP和Servlet的区别以及JavaWeb开发的发展。随着机器变得越来越快,Java的速度劣势很快就会被克服。规范1.简化开发2.易于部署3.支持Web2.0原则为了简化开发过程,Servlet3.0引入了注解(annotation),这使得web部署描述符web.xml不再是必须的选择。可插拔性在使用任何第三方框架时,如Struts、JSF或Spring,我们需要在web.xml中添加相应的Servlet入口。这使得网络描述符变得繁琐且难以维护。Servlet3.0新的可插拔特性使得Web应用程序模块化且易于维护。通过webfragments实现的可插拔性减轻了开发者的负担,不需要在web.xml中配置很多Servlet入口。AsynchronousProcessing异步处理另一个显着变化是Servlet3.0支持异步处理,这对AJAX应用程序非常有用。当一个servlet创建一个线程来处理某些请求时,例如查询数据库或消息连接,该线程会等待直到它获得所需的资源,然后再执行其他操作。异步处理通过运行线程来执行其他操作来避免这种阻塞。除了此处提到的功能外,还对现有API进行了其他几项增强。本文末尾的部分将一一详细探讨这些功能。除了这些新特性,Servlet3.0还对现有的API进行了一些改进,我们将在本文最后介绍。Servlet中的注解Servlet3.0的主要变化之一是对注解的支持。使用注解来定义Servlet和filter,让我们不用在web.xml中定义相应的条目。@WebServlet@WebServlet用于在Web应用程序中定义一个Servlet。该注解可以应用于继承的HttpServlet。这个注解有多个属性,比如name、urlPattern、initParams,我们可以使用user的属性来定义Servlet的行为。urlPattern属性是必需的。常见的容器有Tomcat、Jetty、resin、OracleApplicationserver、WebLogicServer、Glassfish、Websphere、JBoss等(提供Servlet功能的服务器称为Servlet容器。对于web程序来说,Servlet容器的作用相当于桌面程序中的操作系统,它提供了一些编程基础设施。)建议在Web应用程序中,一个Servlet可能会被多个用户同时访问。这时Web容器会为每个用户创建一个线程来执行Servlet。如果Servlet不涉及共享资源的问题,就不需要关心多线程的问题。但是如果Servlet需要共享资源,就要保证Servlet是线程安全的。以下是编写线程安全servlet的一些建议:?使用方法局部变量来保存特定于请求的数据。对于方法中定义的局部变量,进入方法的每个线程都有自己的方法变量副本。没有线程修改其他线程的局部变量。如果你想在不同的请求之间共享数据,你应该使用会话来共享这些数据。?只使用Servlet成员变量来存储不会改变的数据。有些数据在Servlet生命周期内是不会改变的,通常在一开始就确定了。这些数据可以使用成员变量保存,例如数据库连接名称、其他资源的路径等。?同步可能被请求修改的成员变量。有时可能会要求修改数据成员变量或环境属性。在访问这些数据时,应该同步它们以避免多个线程同时修改这些数据。如果servlet访问外部资源,那么访问这些资源需要同步。例如,假设一个servlet想要从一个文件中读取和写入数据。当一个线程读写一个文件时,其他线程也可能正在读写这个文件。文件访问本身不是线程安全的,因此必须编写代码来同步对这些资源的访问。在编写线程安全的Servlet时,不应使用以下两种方法:?ServletAPI中提供了SingleThreadModel接口,实现该接口的Servlet在多个客户端请求时,一次只能运行一个线程。此接口已被标记为已弃用。?在doGet()或doPost()方法上同步。如果您必须在servlet中使用同步代码,您应该尝试在最小的代码块范围内进行同步。同步代码越小,servlet的性能就越好。Servlets提供了一种基于组件、独立于平台的方法来创建基于Web的应用程序,而没有CGI程序的性能限制。Servlet可以访问所有J??avaAPI,包括用于访问企业数据库的JDBCAPI。最后给大家分享这套Servlet入门视频,讲解Servlet技术的整体框架,并附上实例演示。前提是你需要有Java基础。在线观看:www.bilibili.com/video/BV1y5411p7kb下载:www.bjpowernode.com/javavideo/147.html
