关于java:Javaweb学servlet看这一篇就够了

4次阅读

共计 7047 个字符,预计需要花费 18 分钟才能阅读完成。

  • Servlet 是 Server Applet 的简称,译为“服务器端小程序”。
  • Servlet 是 Java 的一套技术标准,规定了如何应用 Java 来开发动静网站。

换句话说,Java 能够用来开发网站后盾,然而要提前定义好一套标准,并编写根底类库,这就是 Servlet 所做的事件。

Java Servlet 能够应用所有的 Java API,Java 能做的事件,Servlet 都能做。

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。

最初

先分享给大家这套 Servlet 入门视频,对 Servlet 技术的整体框架进行了解说,并附带了实例演示,前提须要具备 Java 根底。

在线观看:

www.bilibili.com/video/BV1y5411p7kb

材料下载:

www.bjpowernode.com/javavideo/147.html

正文完
 0