Servlet 复习

Servlet 是什么?java

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

使用 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 执行如下主要任务:服务器

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也能够是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能须要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式能够是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其余客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其余相似的任务。

Servlet 生命周期cookie

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

  • Servlet 经过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 经过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

init() 方法

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

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

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

init 方法的定义以下:

public void init() throws ServletException {  
     // 初始化代码... 
}

service() 方法

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

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

下面是该方法的特征:

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{

}

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。因此,您不用对 service() 方法作任何动做,您只须要根据来自客户端的请求类型来重载 doGet() 或 doPost() 便可。

doGet() 和 doPost() 方法是每次服务请求中最经常使用的方法。下面是这两种方法的特征。

doGet() 方法

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

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    // Servlet 代码 
}

doPost() 方法

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

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    // Servlet 代码 
}

destroy() 方法

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

在调用 destroy() 方法以后,servlet 对象被标记为垃圾回收。destroy 方法定义以下所示:

public void destroy() {
    // 终止化代码...  
}

架构图

下图显示了一个典型的 Servlet 生命周期方案。

  • 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
  • Servlet 容器在调用 service() 方法以前加载 Servlet。
  • 而后 Servlet 容器处理由多个线程产生的多个请求,每一个线程执行一个单一的 Servlet 实例的 service() 方法。

在这里插入图片描述

如下为生命周期的一个简单实例:

// Servlet 生命周期的三个方法
// 1.被建立,执行且只执行一次 init 方法
@Override
public void init() throws ServletException {
    super.init();     
}
// 2.提供服务,执行 service 方法,执行屡次 
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.service(req, resp);     
}
// 3.被销毁,当 Servlet 服务器正常关闭时,执行 destroy 方法,只执行一次
@Override
public void destroy() {
    super.destroy();     
}

Servlet 部署

默认状况下,Servlet 应用程序位于路径 /webapps/ROOT 下,且类文件放在 /webapps/ROOT/WEB-INF/classes 中。

若是您有一个彻底合格的类名称 com.myorg.MyServlet,那么这个 Servlet 类必须位于 WEB-INF/classes/com/myorg/MyServlet.class 中。

如今,让咱们把 HelloWorld.class 复制到 /webapps/ROOT/WEB-INF/classes 中,并在位于 /webapps/ROOT/WEB-INF/ 的 web.xml 文件中建立如下条目:

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

上面的条目要被建立在 web.xml 文件中的标签内。在该文件中可能已经有各类可用的条目,但不要在乎。

Servlet和JSP的区别

JSP做为Servlet技术的扩展,常常会有人将JSP和Servlet搞混。本文,将为你们带来servlet和jsp的区别,但愿对你们有所帮助。

Servlet和JSP的区别

一、Servlet在Java代码中能够经过HttpServletResponse对象动态输出HTML内容。

二、JSP是在静态HTML内容中嵌入Java代码,而后Java代码在被动态执行后生成HTML内容。

Servlet和JSP各自的特色

一、Servlet虽然可以很好地组织业务逻辑代码,可是在Java源文件中,由于是经过字符串拼接的方式生成动态HTML内容,这样就容易致使代码维护困难、可读性差。

二、JSP虽然规避了Servlet在生成HTML内容方面的劣势,可是在HTML中混入大量、复杂的业务逻辑。

经过MVC双剑合璧

JSP和Servlet都有自身的适用环境,那么有没有什么办法可以让它们发挥各自的优点呢?答案是肯有的,MVC模式就可以完美解决这一问题。

MVC模式,是Model-View-Controller的简称,是软件工程中的一种软件架构模式,分为三个基本部分,分别是:模型(Model)、视图(View)和控制器(Controller):

Controller——负责转发请求,对请求进行处理

View——负责界面显示

Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操做实现

在JSP/Servlet开发的软件系统中,这三个部分的描述以下所示:

在这里插入图片描述

一、Web浏览器发送HTTP请求到服务端,而后被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)

二、Controller(Servlet)调用核心业务逻辑——Model部分,得到结果

三、Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容

四、动态生成的HTML内容返回到浏览器显示

MVC模式在Web开发中有很大的优点,它完美规避了JSP与Servlet各自的缺点,让Servlet只负责业务逻辑部分,而不会生成HTML代码;同时JSP中也不会充斥着大量的业务代码,这样能大提升了代码的可读性和可维护性。

相关文章
相关标签/搜索