前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet再度学习

Servlet再度学习

作者头像
全栈程序员站长
发布2021-04-07 11:25:49
2990
发布2021-04-07 11:25:49
举报
文章被收录于专栏:全栈程序员必看

虽然Servlet已经使用很多了,但是一直都仅局限在其使用操作上。

最近有空想对它进行一个相对全面的了解。

下面是博主整理的一篇博文。

一、Servlet简介

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

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

二、Servlet 工作原理

web应用的初始化工作(创建servlet对象)

一般在Java Web项目中,我们使用Servlet,其配置是在web.xml中的。而应用的初始化主要是解析web.xml文件。

Web应用的初始化工作是在ContextConfig的configureStart方法中实现的,应用的初始化主要是解析web.xml文件,这个文件描述了一个Web应用的关键信息,也是一个Web应用的入口。web.xml文件中的各个配置项将会解析成相应的属性保存在WebXml对象中。WebXml对象中的属性又会被设置到Context容器中,这里包括创建Servlet对象、filter、listener等,所以说Context容器才是真正运行Servlet的Servlet容器。一个Web应用对应一个Context容器,容器的配置属性由应用的web.xml指定。

Servlet如何工作

用户从浏览器向服务器发起的一个请求通常会包含如下信息:http://hostname:port/contextpath/servletpath,hostname和port用来与服务器建立TCP连接,后面的URL才用来选择在服务器中哪个子容器服务用户的请求。在Tomcat中URL与Servlet容器通过类org.apache.tomcat.util.http.mapper来完成映射,Mapper会根据请求的hostname和contextpath将host和context容器设置到Request的mappingData属性中。

Servlet能帮我们完成所有工作,但是现在的Web应用很少直接将交互的全部页面用Servlet来实现,而是采用更加高效的MVC框架来实现。这些MVC框架的基本原理是将所有的请求都映射到一个Servlet,然后去实现service方法,这个方法也就是MVC框架的入口。

当Servlet从Servlet容器中移除时,也表明该Servlet的生命周期结束了,这时Servlet的destroy方法将被调用,做一些扫尾工作

Servlet 生命周期

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

代码语言:javascript
复制
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
代码语言:javascript
复制
init() 方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
代码语言:javascript
复制
service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
代码语言:javascript
复制
doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
代码语言:javascript
复制
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
代码语言:javascript
复制
destroy() 方法 destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

三、Servlet使用实例

实例使用前提:已经配置好了JDK和Tomcat

下面我们准备好如下东西:

(1)Servlet:HelloWorld.java

代码语言:javascript
复制
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
   

  private String message;

  public void init() throws ServletException
  {
      // 执行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");

      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }

  public void destroy()
  {
      // 什么也不做
  }
}

(2)servlet-api.jar

需要依赖servlet-api.jar包无须做过多解释,这里面包含了Servlet相关接口类。

博主已经提供了相应的jar包供猿友们下载: http://download.csdn.net/detail/u013142781/9446459

接下来还需要如下操作:

(1)将HelloWorld.java和servlet-api.jar放到D:\servlettest下。(猿友如果放到其他目录,下面的设置应作相应修改)

(2)环境变量CLASSPATH中添加servlet-api.jar存放路径,博主的是D:\servlettest\servlet-api.jar

这里写图片描述
这里写图片描述

(3)打开cmd,进入到D:\servlettest(cd D:\servlettest),然后执行命令javac HelloWorld.java,编译 Servlet。

(4)编译成功后发现D:\servlettest下多了个HelloWorld.class文件。

(5)将HelloWorld.class文件放到tocmat的webapps\ROOT\WEB-INF\classes下(如果没有classes,自己新建一个放进去)

(6)tocmat的webapps\ROOT\WEB-INF\web.xml文件添加如下配置:

代码语言:javascript
复制
<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配置后是这样的:

代码语言:javascript
复制
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

  <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-app>

(7)接下来双击tomcat的bin目录下的startup.sh来启动tomcat。

(8)访问路径:http://localhost:8080/HelloWorld,效果如下:

这里写图片描述
这里写图片描述

发布者:全栈程序员栈长,转转请注明出处:https://javaforall.cn/2297.html原文链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年11月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Servlet简介
  • 二、Servlet 工作原理
  • 三、Servlet使用实例
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档