Java Servlet 可以利用所有的 Java API,Java 能做的事情,Servlet 都能做。
这套 Servlet 入门对 Servlet 技能的整体框架进行了讲解,并附带了实例演示,须要具备 Java 根本。
https://www.ixigua.com/6772333605889769997
(图片来自网络侵删)Servlet只是古老的CGI技能的替代品,直策应用Servle开拓还是很麻烦,以是Java后来又对Servlet 进行了升级,推出了 JSP 技能。JSP 只是对 Servlet 加了一层壳,JSP 经由编译后还是 Servlet。
Servlet是什么?
Java Servlet 是运行在 Web 做事器或运用做事器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户真个要乞降 HTTP 做事器上的数据库或运用程序之间的中间层。
利用 Servlet,您可以网络来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Java Servlet 常日情形下与利用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是比较于 CGI,Servlet 有以下几点上风:
• 性能明显更好。
• Servlet 在 Web 做事器的地址空间内实行。这样它就没有必要再创建一个单独的进程来处理每个客户端要求。
• Servlet 是独立于平台的,由于它们是用 Java 编写的。
• 做事器上的 Java 安全管理器实行了一系列限定,以保护做事器打算机上的资源。因此,Servlet 是可信的。
• Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
Servlet 架构
下图显示了 Servlet 在 Web 运用程序中的位置。
Servlet实现过程
最早支持 Servlet 技能的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的紧张功能在于交互式地浏览和修正数据,天生动态 Web 内容。这个过程为:• 客户端发送要求至做事器端;• 做事器将要求信息发送至 Servlet;• Servlet 天生相应内容并将其传给做事器。相应内容动态天生,常日取决于客户真个要求;• 做事器将相应返回给客户端。• Servlet 看起来像是常日的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。由于是工具字节码,可动态地从网络加载,可以说 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());
destroy()。
加载和实例化 Servlet。这项操作一样平常是动态实行的。然而,Server 常日会供应一个管理的选项,用于在 Server 启动时逼迫装载和初始化特定的 Servlet。
Server 创建一个 Servlet的实例
第一个客户真个要求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 标签下配置 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
一个客户真个要求到达 Server
Server 创建一个要求工具,处理客户端要求
Server 创建一个相应工具,相应客户端要求
Server 激活 Servlet 的 service() 方法,通报要乞降相应工具作为参数
service() 方法得到关于要求工具的信息,处理要求,访问其他资源,得到须要的信息
service() 方法利用相应工具的方法,将相应传回Server,终极到达客户端。service()方法可能激活其它方法以处理要求,如 doGet() 或 doPost() 或程序员自己开拓的新的方法。
对付更多的客户端要求,Server 创建新的要乞降相应工具,仍旧激活此 Servlet 的 service() 方法,将这两个工具作为参数通报给它。如此重复以上的循环,但无需再次调用 init() 方法。一样平常 Servlet 只初始化一次(只有一个工具),当 Server 不再须要 Servlet 时(一样平常当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。
Servlet的事情模式
客户端发送要求至做事器;做事器启动并调用 Servlet,Servlet 根据客户端要求天生相应内容并将其传给做事器;
做事器将相应返回客户端。
比拟与 Applet 的比较
相似之处:
• 它们不是独立的运用程序,没有 main() 方法。
• 它们不是由用户或程序员调用,而是由其余一个运用程序(容器)调用。
• 它们都有一个生存周期,包含 init() 和 destroy() 方法。
不同之处:
• Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。
• Servlet 则没有图形界面,运行在做事器端。
与 CGI 比较与传统的 CGI 和许多其他类似 CGI 的技能比较,Java Servlet 具有更高的效率,更随意马虎利用,功能更强大,具有更好的可移植性,更节省投资。在未来的技能发展过程中,Servlet 有可能彻底取代 CGI。
在传统的 CGI中,每个要求都要启动一个新的进程,如果 CGI 程序本身的实行韶光较短,启动进程所须要的开销很可能反而超过实际实行韶光。而在 Servlet 中,每个要求由一个轻量级的 Java 线程处理(而不是重量级的操作系统进程)。
在传统 CGI 中,如果有 N 个并发的对同一 CGI程序的要求,则该CGI程序的代码在内存中重复装载了 N 次;而对付 Servlet,处理要求的是 N 个线程,只须要一份 Servlet 类代码。在性能优化方面,Servlet 也比 CGI 有着更多的选择。
• 方便
Servlet 供应了大量的实用工具例程,例如自动地解析和解码 HTML 表单数据、读取和设置 HTTP头、处理Cookie、跟踪会话状态等。
• 功能强大
在Servlet中,许多利用传统 CGI 程序很难完成的任务都可以轻松地完成。例如,Servlet 能够直接和 Web做事器交互,而普通的 CGI 程序不能。Servlet 还能够在各个程序之间共享数据,使得数据库连接池之类的功能很随意马虎实现。
• 可移植性好
Servlet 用 Java 编写,Servlet API具有完善的标准。因此,为 IPlanet Enterprise Server 写的 Servlet 无需任何本色上的改动即可移植到 Apache、MicrosoftIIS 或者 WebStar。险些所有的主流做事器都直接或通过插件支持 Servlet。
• 节省投资
不仅有许多廉价乃至免费的 Web 做事器可供个人或小规模网站利用,而且对付现有的做事器,如果它不支持 Servlet 的话,要加上这部分功能也每每是免费的(或只须要极少的投资)。
与 JSP 比较JSP 和 Servlet 的差异到底在运用上有哪些表示,很多人搞不清楚。大略的说,SUN首先发展出 Servlet,其功能比较强劲,体系设计也很前辈,只是,它输出 HTML 语句还是采取了老的 CGI 办法,是一句一句输出,以是,编写和修正 HTML 非常未便利。
Java Server Pages(JSP)是一种实现普通静态HTML 和动态 HTML 稠浊编码的技能,JSP 并没有增加任何实质上不能用 Servlet 实现的功能。但是,在 JSP 中编写静态HTML 更加方便,不必再用 println语 句来输出每一行 HTML 代码。更主要的是,借助内容和外不雅观的分离,页面制作中不同性子的任务可以方便地分开:比如,由页面设计者进行 HTML设计,同时留出供 Servlet 程序员插入动态内容的空间。
后来 SUN 推出了类似于 ASP 的镶嵌型的 JSP,把 JSP TAG 镶嵌到 HTML 语句中,这样,就大大简化和方便了网页的设计和修正。新型的网络措辞如 ASP,PHP,JSP 都是镶嵌型的措辞。 这是 JSP 和 Servlet 差异的运作事理层面。
从网络三层构造的角度看 JSP 和 Servlet 的差异,一个网络项目最少分三层:data layer(数据层),business layer(业务层),presentation layer(表现层)。当然也可以更繁芜。Servlet 用来写 business layer 是很强大的,但是对付写 presentation layer 就很未便利。JSP 则紧张是为了方便写 presentation layer 而设计的。当然也可以写 business layer。写惯了 ASP,PHP,CGI的朋友,常常会不自觉的把 presentation layer 和 business layer 混在一起。
据 SUN 自己的推举,JSP中该当仅仅存放与 presentation layer 有关的东西,也便是说,只放输出 HTML 网页的部分。而所有的数据打算,数据剖析,数据库联结处理,统统是属于 business layer,该当放在 Java BEANS 中。通过 JSP 调用 Java BEANS,实现两层的整合。
微软前不久推出的 DNA 技能,是 ASP+COM/DCOM 技能。与J SP+BEANS 完备类似,所有的 presentation layer 由 ASP 完成,所有的 business layer 由 COM/DCOM 完成。通过调用,实现整合。
采取这些组件技能纯挚的由于 ASP/JSP 措辞是非常低效率实行的,如果涌现大量用户点击,纯 SCRIPT 措辞很快就到达了他的功能上限,而组件技能就能大幅度提高功能上限,加快实行速率。
其余一方面,纯 SCRIPT 措辞将 presentation layer 和 business layer 混在一起,造成修正未便利,并且代码不能重复利用。如果想修正一个地方,常常会牵扯到十几页 code,采取组件技能就只改组件就可以了。
综上所述,Servlet 是一个早期的不完善的产品,写 business layer 很好,写 presentation layer 就很臭,并且两层殽杂。
以是,推出JSP+BEAN,用 JSP 写 presentation layer,用 BEAN 写 business layer。SUN 自己的意思也是将来用 JSP 替代 Servlet。这是技能更新方面 JSP 和 Servlet 的差异。
可是,这不是说,学了 Servlet 没用,实际上,你还是该当从 Servlet 入门,再上 JSP,再上 JSP+BEAN。
强调的是:学了JSP,不会用 Java BEAN 并进行整合,即是没学。大家多花点力气在 JSP+BEAN 上。
我们可以看到,当 ASP+COM 和 JSP+BEAN 都采取组件技能后,所有的组件都是前辈行编译,并驻留内存,然后快速实行。以是,大家常常吹的 Servlet/JSP 先编译驻内存后实行的速率上风就没有了。
反之,ASP+COM+IIS+NT 紧密整合,该当会有较大的速率上风呈现。而且,ASP+COM+IIS+NT 开拓效率非常高,虽然bug 很多。
那么,为什么还用 JSP+BEAN?由于 Java 实在出息远大。操作系统群雄并起,运用软件的开拓商必定要找一个通用开拓措辞进行开拓,Java 一统天下的机遇就到了。
大略剖析了一下 JSP 和 Servlet 的差异和 Java Web 开拓方面的发展。随着机器速率越来越快,Java 的速率劣势很快就可以被战胜。
规范
1.简化开拓2.便于支配3.支持 Web2.0 原则为了简化开拓流程,Servlet 3.0 引入了表明(annotation),这使得 web 支配描述符 web.xml 不再是必须的选择。
Pluggability可插入性当利用任何第三方的框架,如 Struts,JSF 或 Spring,我们都须要在 web.xml 中添加对应的 Servlet 的入口。这使得 web 描述符笨重而难以掩护。Servlet3.0 的新的可插入特性使得 web 运用程序模块化而易于掩护。通过 web fragment 实现的可插入性减轻了开拓职员的包袱,不须要再在 web.xml 中配置很多的 Servlet 入口。
Asynchronous Processing 异步处理其余一个显著的改变便是 Servlet 3.0 支持异步处理,这对 AJAX 运用程序非常有用。当一个 Servlet 创建一个线程来处理某些要求的时候,如查询数据库或连接,这个线程要等待直到得到所须要的资源才能够实行其他的操作。异步处理通过运行线程实行其他的操作来避免了这种壅塞。Apart from the features mentioned here, several other enhancements have been made to the existing API. The sections towards the end of the article will explore these features one by one in detail。除了这些新特性之外, Servlet 3.0对已有的 API 也做了一些改进,在本文的末了我们会做先容。Annotations in Servlet Servlet中利用表明Servlet 3.0 的一个紧张的改变便是支持表明。利用表明来定义 Servlet 和 filter 使得我们不用在 web.xml 中定义相应的入口。
@WebServlet@WebServlet 用来定义 web 运用程序中的一个 Servlet。这个表明可以运用于继续了 HttpServlet。这个表明有多个属性,例如 name,urlPattern, initParams,我们可以利用者的属性来定义 Servlet 的行为。urlPattern 属性是必须指定的。
常见容器
Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss 等等。(供应了 Servlet 功能的做事器,叫做 Servlet 容器。对 web 程序来说,Servlet 容器的浸染就相称于桌面程序里操作系统的浸染,都是供应一些编程根本举动步伐)
建议
在 Web 运用程序中,一个 Servlet 在一个时候可能被多个用户同时访问。这时 Web 容器将为每个用户创建一个线程来实行 Servlet。如果 Servlet 不涉及共享资源的问题,不必关心多线程问题。但如果 Servlet 须要共享资源,须要担保 Servlet 是线程安全的。
下面是编写线程安全的 Servlet 的一些建议:
• 用方法的局部变量保存要求中的专有数据。对方法中定义的局部变量,进入方法的每个线程都有自己的一份方法变量拷贝。任何线程都不会修正其他线程的局部变量。如果要在不同的要求之间共享数据,该当利用会话来共享这类数据。
• 只用 Servlet的成员变量来存放那些不会改变的数据。有些数据在 Servlet 生命周期中不发生任何变革,常日是在初始时确定的,这些数据可以利用成员变量保存,如数据库连接名称、其他资源的路径等。
• 对可能被要求修正的成员变量同步。有时数据成员变量或者环境属性可能被要求修正。当访问这些数据时该当对它们同步,以避免多个线程同时修正这些数据。
如果 Servlet 访问外部资源,那么须要同步访问这些资源。例如,假设 Servlet 要从文件中读写数据。当一个线程读写一个文件时,其他线程也可能正在读写这个文件。文件访问本身不是线程安全的,以是必须编写同步访问这些资源的代码。在编写线程安全的 Servlet 时,下面两种方法是不应该利用的:
• 在 Servlet API 中供应了一个 SingleThreadModel 接口,实现这个接口的 Servlet 在被多个客户要求时一个时候只有一个线程运行。这个接口已被标记不推举利用。
• 对 doGet() 或doPost() 方法同步。如果必须在 Servlet 中利用同步代码,应只管即便在最小的代码块范围上进行同步。同步代码越小,Servlet 实行得才越好。
Servlet 为创建基于 web 的运用程序供应了基于组件、独立于平台的方法,可以不受 CGI 程序的性能限定。Servlet 有权限访问所有的 Java API,包括访问企业级数据库的 JDBC API。