Servlet再度学习

Servlet再度学习

虽然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 遵循的过程:

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

三、Servlet使用实例

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

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

(1)Servlet:HelloWorld.java

// 导入必需的 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文件添加如下配置:

<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配置后是这样的:

<?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.net/2297.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hibernate实现多租户[通俗易懂]

    hibernate实现多租户[通俗易懂]hibernate实现多租户

    2022年4月25日
    43
  • 电梯演说模板练习

    电梯演说模板练习各位领导/投资人/用户/合作伙伴:我们的产品是为了解决图书管理人员对学生借还图书管理不方便的问题,他们需要能够快速记录学生借还书的信息以及对学生信息的修改。但是现有的方案并不能很好的解决这些需求,我们利用扫码的方式,它能够让管理人员更加方便快捷进行管理。远远超过了XXX公司,同时,我们有专门的推广人员,多家广告媒体公司合作伙伴,能让大部分用户知道我们的产品,并进一步传播。转载于:https://…

    2022年6月3日
    29
  • 2022年G3锅炉水处理找解析及G3锅炉水处理考试试卷[通俗易懂]

    题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:G3锅炉水处理找解析是安全生产模拟考试一点通生成的,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新版教材汇编出G3锅炉水处理仿真模拟考试。2022年G3锅炉水处理找解析及G3锅炉水处理考试试卷1、【多选题】水垢对锅炉的危害主要有浪费燃料()。(ABD)A、.损坏锅炉受热面B、.降低锅炉出力C、.减少供汽时间D、.缩短锅炉使用寿命E、.提高了环境温度2、【多选题】特种设备作业人员应当遵守()规…

    2022年4月14日
    48
  • vim 常用命令

    vim 常用命令普通命令模式复制内容功能需求操作说明复制全部文本按下ggyG复制完成,注意:G必须大写粘贴内容命令操作说明p通过箭头移动光标到需要粘贴的位置,按下p将内容粘贴到光标后面P按下P将内容粘贴到光标前面删除内容功能需求操作说明D删除游标所在位置的字符到行尾全选文本按下ggvG全选文本,但是最后一行仅选中第一个字符,按下ggVG才是真正的全选文本删除按下dG删除光标所在行以及下面的

    2022年5月9日
    41
  • JVM 优化实战[通俗易懂]

    JVM 优化实战[通俗易懂]本文讲解了JVM的内存划分和分配策略,并以截图和脚本展示常用可视化和命令行工具的使用方法,完整演示了JVM优化、内存泄露排查、gc.log分析方法等。作者:王克锋 出处:https://kefeng.wang/2016/11/22/java-jvm/ 版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。1GC相关内存1.1内存划分1.1.1堆(Heap)存放 newM…

    2022年6月9日
    42
  • AEJoy ——表达式代码列表和示例(四)【代码详解】「建议收藏」

    bounce表达式系列惯性bounce表达式这个反弹表达式允许在你的层位置有一个弹性的感觉,效果图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TFA2Glo-1638214074097)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7d3e186d50e74ee09ce97abe381beae9~tplv-k3u1fbpfcp-watermark.image?)]表达式amp=.1;freq

    2022年4月13日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号