什么是Servlet?

定义

Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序

Servlet 是一个 Java Web开发标准,狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

功能

其主要功能在于:交互式地浏览和修改数据,生成动态Web内容。

Java Web 应用程序中所有的请求-响应都是由 Servlet 来完成的。Servlet 并没有

Java Web 开发的发展历程

Web 开发技术主要是从静态网页技术动态网页技术的变迁。

由于本文主要介绍 Java Web 开发技术,所以对其他语言的 Web 技术不做介绍。

Java Web 开发的大致发展历程如下:静态HTML –> CGI –> Servlet –> JSP

至于Spring、Struts等著名的框架则是在这些技术基础上的最佳编程实践。

静态网页技术

早期的Web 开发只能提供静态的 HTML 页面。这样的模式显然存在很多弊端:不利于系统扩展,不利于和用户之间进行交互。于是,有了动态页面技术(如大家熟悉的JSP、ASP、PHP等等)。

动态网页技术

CGI

CGI (Common Gateway Interface,公共网关接口)是最重要的 Web 技术之一。它是最早的动态页面技术。

CGI 是外部应用程序与 Web 服务器之间的接口标准。

绝大多数的CGI程序被用来解释处理来自表单的输入信息: CGI 允许服务器调用外部程序来处理输入信息,并将相应的输出反馈给浏览器。CGI程序使网页具有交互功能

注:最流行的CGI 语言是 Perl 和Shell 脚本,但是也可以使用 C、C++ 以及Java 等语言来编写。

CGI 解决了静态页面不利于交互的问题,但其自身也存在缺陷

l  需要为每个请求启动一个操作 CGI 程序的系统进程。如果请求频繁,会带来很大的系统开销。

如果用Java编写 CGI,除了需要为每个请求启动一个系统进程外,还要在进程中启动一个 JVM ,这将十分低效。

l  需要重复编写处理网络协议的代码,非常耗时。

Servlet

知道了 Java 编写 CGI 的不足。我们不禁要问,如果有办法可以只运行一个系统进程和一个 JVM ,岂不是能大大减少开销吗?

Servlet 正是为此应运而生。

与传统的 CGI 技术相比,Servlet的优势在于:

l  传统的 CGI 中,每个请求都要启动一个新的进程;而在 Servlet 中,每个请求由一个轻量级的 Java 线程处理。

l  传统的 CGI 中,如果有 N 个并发的对同一个 CGI程序的请求,则该CGI程序的代码在内存中重复装载了 N 次;而对于 Servlet,处理请求的是 N 个线程,只需要一份 Servlet 类代码。

Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

JSP

JSP(Java Server Page)是一种实现静态HTML 和动态 HTML 混合编码的技术,它是Servlet API 的一个扩展。

Servlet 生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

Servlet 通过调用 init () 方法进行初始化。

Servlet 调用 service() 方法来处理客户端的请求。

Servlet 通过调用 destroy() 方法终止(结束)。

最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

如下图:

执行流程为:

第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。

Servlet 容器在调用 service() 方法之前加载 Servlet。

然后 Servlet 容器处理由多个线程产生的多个请求(GET、POST 等类型),每个线程执行一个单一的 Servlet 实例的 service() 方法。service() 会根据请求类型分发到对应的方法中去处理。

init () 方法

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

service() 方法

service() 方法遵循 HTTP 协议标准,负责将 HTTP 请求分发给对应类型的处理方法。

Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

注意:service 方法不需要覆写。

doGet()方法

GET请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

doPost()方法

POST请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

destroy() 方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

Servlet 之 Hello World

环境设置

就像任何其他的 Java 程序,需要通过使用 Java 编译器 javac 编译 Servlet,在编译 Servlet 应用程序后,将它部署在配置的环境中以便测试和运行。

必要条件:

JDK (Java Development Kit)

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

Tomcat

下载地址:http://tomcat.apache.org

Hello World 实例

Servlet 代码

HelloWorld.java

package demo;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

publicclass HelloWorld extends HttpServlet {

privatestaticfinallongserialVersionUID = 1L;

private String message;

publicvoid init() throws ServletException {

message = "Hello World\n";

}

publicvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 设置响应内容类型

response.setContentType("text/html");

// 实际的逻辑是在这里

PrintWriter out = response.getWriter();

out.println("<h1>" + message + "</h1>");

}

publicvoid destroy() {

// Do nothing

}

}

默认情况下,Servlet 应用程序位于路径 <Tomcat-installation-directory>/webapps/ROOT 下。

将以上 Servlet 代码编译后产生的class文件放在 <Tomcat 安装目录>/webapps/ROOT/WEB-INF/classes 中。

注意:需要保持代码的包(package)路径。

上例中的代码放在demo 包下,classes 下也需要保持路径一致,即 <Tomcat 安装目录>/webapps/ROOT/WEB-INF/classes/demo

Servlet 部署

下一步,是如何让服务器识别Servlet。

在web.xml中添加以下内容,然后将web.xml 文件放在 <Tomcat 安装目录>/webapps/ROOT/WEB-INF/web.xml。

web.xml

<servlet>

<servlet-name>HelloWorld</servlet-name>

<servlet-class>demo.HelloWorld</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>HelloWorld</servlet-name>

<url-pattern>/HelloWorld</url-pattern>

</servlet-mapping>

(1)<servlet>

<servlet>标签用于配置 Servlet 类信息。

<servlet-name>是 Servlet 的标识,必须保证在整个xml 中唯一;

<servlet-class>是这个 Servlet 对应的类名。

(2)<servlet-mapping>

<servlet-mapping>标签用于配置Servlet 的访问路径。

<servlet-name> 需要和<servlet>中的<servlet-name>保持一致;

<servlet-name>指定访问路径。

做完以上工作,在<Tomcat 安装目录>/bin 目录下执行 startup.bat 或 startup.sh。

在浏览器中输入网址:http://localhost:8080/HelloWorld

输出结果:

Java Web 目录结构

Web 程序部署在 Tomcat 的 /webapps 下面。一个 webapps 文件夹可以部署多个不同的 Web 应用,例如 webapps/web1、webapps/web2,访问网址时分别为http://localhost:8080/web1、http://localhost:8080/web2。这两个不同的Web应用分别称为两个Context,路径/web1、/web2也称为上下文路径。

如果不适用上下文路径,Web 程序需放到webapps/ROOT 下面。ROOT 文件夹下的程序使用http://localhost:8080/ 访问。

按照Servlet 规范,Web 程序有自己特定的结构,部署时必须按照这样的结构部署。

文件夹

描述

/

Web 应用根目录

/WEB-INF/

Tomcat 会隐藏该文件夹下的所有文件和文件夹,保护他们不能通过浏览器直接访问。

/WEB-INF/web.xml

web.xml 文件。Web 程序最主要的配置文件。

/WEB-INF/classes/

class 类文件都放在该文件夹下面,包括 Servlet 类。

/WEB-INF/lib/

jar 文件都放在该文件夹下面。

参考资料

http://www.runoob.com/servlet/servlet-tutorial.html

[Servlet] 初识Servlet的更多相关文章

  1. 初识Servlet(JSP)

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层.  Servle ...

  2. httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系

    学习servlet的时候经常感到疑惑 HttpServletRequest是服务器创建的?还是servlet容器创建的? 过滤器是服务器创建的?还是servlet容器创建的? serlet容器和tom ...

  3. Servlet/JSP-01 Servlet及其生命周期

    一.起步 1.新建一个类继承Servlet接口 public class HelloServlet implements Servlet { @Override public void destroy ...

  4. 报javax.servlet.ServletException: Servlet.init() for servlet springmvc threw exception异常 的解决方案

    后台错误信息如下: javax.servlet.ServletException: Servlet.init() for servlet springmvc threw exception org.a ...

  5. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  6. 【Servlet】Servlet应用的get、post访问及和JSP的配合使用

    Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面. 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用 ...

  7. javax.servlet.ServletException: Servlet execution threw an exception 异常解决之一

    配置JDBC连接的JDBC.properties文件不存在(那天很奇怪配置文件不存在了,我也没有去移动那个文件.诡异呀)也会导致这个异常. 然后就报javax.servlet.ServletExcep ...

  8. javaWeb学习总结(3)- Servlet总结(servlet的主要接口、类)

    Servlet总结01——servlet的主要接口.类 (一)servlet类 Servlet主要类.接口的结构如下图所示: 要编写一个Servlet需要实现javax.servlet.Servlet ...

  9. 什么是Servlet,Servlet的作用,生命周期,如何创建、配置Servlet

    什么是Servlet,作用是? servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要.servlet由se ...

随机推荐

  1. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  2. 移动端1px边框

    问题:移动端1px边框,看起来总是2倍的边框大小,为了解决这个问题试用过很多方法,用图片,用js判断dpr等,都不太满意, 最后找到一个还算好用的方法:伪类 + transform 原理是把原先元素的 ...

  3. Hawk 5.1 数据导入和导出

    除了一般的数据库导入导出,Hawk还支持从文件导入和导出,支持的文件类型包括: Excel CSV(逗号分割文本文件) TXT (制表符分割文本文件) Json xml Excel 目前来看,Exce ...

  4. PHP好用但又容易忽略的小知识

    1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...

  5. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  6. 不要着急改代码,先想想--centos 6.8下编译安装tmux

    诸位读者新年好,2017开年第一篇博客,请允许我先问候一下看到这篇博客的诸位.写博客是我2017年定下的目标之一,希望我会坚持下去. 最近打算尝试一下tmux这个神器,于是有了这一篇关于思维方式的Bl ...

  7. jetBrain系列软件

    请尽量支持正版软件!https://www.jetbrains.com/ 本文仅供参考 以下提供一种方法可以无限期体验JetBrain2016系列软件. 1.下载JetbrainsCrack-2.5. ...

  8. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  9. 透过浏览器看HTTP缓存

    作为前端开发人员,对于我们的站点或应用的缓存机制我们能做的似乎不多,但这些却是与我们关注的性能息息相关的部分,站点没有做任何缓存机制,我们的页面可能会因为资源的下载和渲染变得很慢,但大家都知道去找前端 ...

  10. Visual Studio Code预览版Ver 0.3.0试用体验

    当你开始阅读这篇文章时,请先不要把Visual Studio Code和.net.Windows联想到一起,因为VS Code是一个跨平台,支持30多种语言的开箱代码编辑器.不管你是.Net.Java ...