JavaWeb之Servlet接口

这篇具有很好参考价值的文章主要介绍了JavaWeb之Servlet接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Servlet接口

什么是Servlet?

Servlet是一种基于Java技术的Web组件,用于生成动态内容,由容器管理,是平台无关的Java类组成,并且由Java Web服务器加载执行,是Web容器的最基本组成单元

什么是Servlet容器?

Servlet容器作为Web服务器或应用服务器的一部分,通过请求和响应提供Web客户端与Servlets交互的能力,容器管理Servlet实例以及它们的生命周期(创建、初始化、提供服务、销毁等)

在java web中不管是使用J2EE原生的servlet/jsp还是使用springmvc/springboot,在web服务器看来只是对外暴露出来的Servlet,而这个Servlet是javax.servlet.Servlet接口,该接口定义了Servlet引擎与Servlet程序之间通信的协议约定。

// Servlet的加载和实例化可以发生在容器启动时,也可以延迟初始化直到有请求需要处理时
public interface Servlet {
   // 负责初始化Servlet对象,容器创建好Servlet对象后由容器调用调用,只执行一次
   // 当load-on-startup设置为负数或者不设置时会在Servlet第一次用到时才被调用
    void init(ServletConfig config) throws ServletException;
  // 获取该Servlet的初始化参数信息
    ServletConfig getServletConfig();
  // 负责响应客户端的请求,当容器接收到客户端要求访问特定Servlet对象的请求时,会调用该Servlet对象的service()方法,每次请求都会执行
    void service(ServletRequest req, ServletResponse res)
 throws ServletException, IOException
;
  // 返回Servlet信息,包含创建者、版本、版权等信息
    String getServletInfo();
  // Servlet结束生命周期时调用,释放Servlet对象占用的资源
    void destroy();
}

而为了简化开发,jdk中提供了一个实现Servlet接口的简单的Servlet类,javax.servlet.GenericServlet,该类实现了Servlet的基本功能,对init(ServletConfig config)、service(ServletRequest req, ServletResponse res)和destroy()方法提供了默认实现

jdk针对HTTP协议专门提供了一个Servlet类,javax.servlet.http.HttpServlet,该类继承于GenericServlet类,在其基础上针对HTTP的特点进行扩充,一般编写程序时继承HttpServlet即可,这样只需要重写doGet()和doPost()方法即可

JavaWeb之Servlet接口,javaweb,java
Servlet继承关系

Servlet中涉及的主要对象

  • 请求对象 ServletRequest、HttpServletRequest
  • 响应对象 ServletResponse、HttpServletResponse
  • Servlet配置对象 ServletConfig
  • Servlet上下文对象 ServletConfig

Servlet注册与运行

Servlet编写好之后需要在web.xml中进行注册和映射才能被Servlet容器加载从而被外界访问

<!-- 注意servlet和servlet-mapping都是成对出现的 --> 
<!-- 注册Servlet -->    
 <servlet>
        <servlet-name>HW</servlet-name>
        <servlet-class>com.zhanghe.study.servlet.HelloWorldServlet</servlet-class>
     <!-- 配置servlet初始化init时中ServletConfig参数-->
        <init-param>
          <param-name>name</param-name>
          <param-value>john</param-value>
        </init-param>
        <!-- servlet加载时机,若为负数,则在第一次请求时被创建,若为0或者正数,在web应用被Servlet容器加载时创建实例,值越小越早被启动  -->
        <load-on-startup>1</load-on-startup>
    </servlet>
  <!-- 映射Servlet -->
    <servlet-mapping>
      <!-- 对应servlet标签中的servlet-name值 -->
        <servlet-name>HW</servlet-name>
       <!-- 开头的/表示web用用程序的根目录 -->
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>

tomcat中的web.xml包含有一个缺省的Servlet

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

ServletConfig

对于每个Servlet可能在启动时都需要一些初始化参数,而所有的Servlet是交由Servlet引擎去实例化的,那么也就是需要将每个Servlet的初始化参数也都配置到web.xml中,Servlet引擎将Servlet容器对象和Servlet的配置信息封装到ServletConfig中,并在Servlet初始化时将ServletConfig传递给该Servlet。javax.servlet.ServletConfig接口的作用就是用来定义ServletConfig对象所需要对外提供的方法

public interface ServletConfig {
  // 获取web.xml中定义的servlet-name
    String getServletName();
 // ServletContext表示的是应用本身
    ServletContext getServletContext();
  // 获取init-param配置的参数
    String getInitParameter(String name);
  // 获取init-param配置的所有参数
    Enumeration<String> getInitParameterNames();
}

Servlet引擎装载并创建一个Servlet对象后,会调用该对象的init(ServletConfig config)方法,Servlet中的ServletConfig getServletConfig()方法会返回init传入的ServletConfig对象

    <servlet>
        <servlet-name>HW</servlet-name>
        <servlet-class>com.zhanghe.study.servlet.HelloWorldServlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>zhanghe</param-value>
        </init-param>
    </servlet>
// 获取指定的属性
config.getInitParameter("name")
// 获取所有的属性
config.getInitParameters()

ServletContext

每个Web应用程序在启动时都会创建一个ServletContext对象,每个Web应用程序都有一个唯一的ServletContext对象,javax.servlet.ServletContext接口定义了ServletContext需要对外提供的方法,Servlet通过这些方法来和ServletContext容器进行通信

  • 该对象代表当前WEB应用,可以获取到web应用的信息,一个Web应用只有一个ServletContext对象
  • 可以使用ServletConfig的getServletContext()获取到ServletContext
  • 可以获取web应用的初始化参数,这是全局的方法,在web.xml中配置
  • 获取web应用某个文件的绝对路径(在服务器上的路径,不是部署前的方法) getRealPath
  • 获取当前应用的名称 getContextPath
  • 获取当前web应用的某一个文件对应的输入流 getResourceAsStream() path是相对于当前web应用的根目录
    <context-param>
        <param-name>email</param-name>
        <param-value>master@163.com</param-value>
    </context-param>

servlet生命周期

生命周期相关方法,servlet生命周期中的方法全是由servlet容器来调用的

  • 构造器 web容器调用Servlet的无参构造器,默认是在第一次请求时被加载,可以通过load-on-startup标签来进行设置什么时候加载
  • init方法
  • service方法
  • destory方法
init方法--初始化

init方法在第一次创建servlet时被调用,在后续每次请求时都不会被调用。

当用户调用servlet的时候,该servlet的一个实例就会被创建,并且为每一个用户产生一个新的线程,init()用于进行一些初始化数据的加载和处理,这些数据会被用于servlet的整个生命周期

void init(ServletConfig config) throws ServletException;

为了防止重写该方法时开发者忘记将入参config赋值给成员变量config,故而提供了GenericServlet类进行了一次封装

public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}

在进行Servlet重写时只需要重写不带参数的init方法即可

public void init() throws ServletException

该方法是由servlet容器调用的

什么时候触发初始化

有两种情况会进行Servlet的初始化

  • Servlet被客户端首次请求访问时触发初始化方法

  • 如果配置了load-on-startup元素,则在Servlet容器启动该Servlet所属Web应用时就会初始化该Servlet

     <servlet>
         <servlet-name>dispatcherServlet</servlet-name>
         <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
         </servlet-class>
         <load-on-startup>1</load-on-startup>
     </servlet>
重写init方法

GenericServlet实现了Servlet和ServletConfig,是一个抽象类,并对init(ServletConfig var1)方法进行了一层封装,有一个ServletConfig成员变量,在init()方法中进行了初始化,使得可以直接在GenericServlet中直接使用ServletConfig方法

而我们平时写Servlet大多是继承于HttpServlet类的,在对init方法进行重写时,重写不带参的init()方法即可

//GenericServlet类

public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}

public void init() throws ServletException {
}

该方法由GenericServlet的调用,如果需要使用到ServletConfig则调用getServletConfig()方法来获取

service方法

service方法是实际处理请求的方法,servlet容器调用service方法来处理请求,并将响应写回到客户端,每次服务器接收到一个新的servlet请求时,服务器会产生一个新的线程来调用服务

void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
处理请求逻辑

HttpServlet继承了GenericServlet,重写了service方法,将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse,并根据不同的请求方式进行分发,doGet/doPost/doHead等

@Override
public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException
{
    HttpServletRequest  request;
    HttpServletResponse response;
    // 如果请求类型不相符,则抛出异常
    if (!(req instanceof HttpServletRequest &&
            res instanceof HttpServletResponse)) {
        throw new ServletException("non-HTTP request or response");
    }
  // 转换成Http的request和response
    request = (HttpServletRequest) req;
    response = (HttpServletResponse) res;
  // 进行http的处理方法
    service(request, response);
}

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    
{
    // 获取请求类型
        String method = req.getMethod();
   // 根据不同的请求类型调用不同的方法
        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < lastModified) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
            
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);
            
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
            
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
            
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
            
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

servlet可以在任何协议下访问 ,写的Servlet必须实现Servlet接口,在http协议下可以使用HttpServlet ,用来给Web访问的

在HttpServlet类中对于service()方法进行了处理,根据请求方式的不同,将请求分发到了不同的方法,而我们一般情况下写Servlet也是继承自HttpServlet的,所以在写请求处理逻辑时,只需要重写doGet()和doPost()方法即可

// HttpServlet类

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String msg = lStrings.getString("http.method_get_not_supported");
    this.sendMethodNotAllowed(req, resp, msg);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_post_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
}
GET方法

GET方法时浏览器向web服务器传递信息的默认方法,会在地址栏上产生很长的字符串,且GET方法有大小限制,请求字符串中最多只能有1024个字符

POST方法

POST方法不将请求信息放到地址中

destroy方法

destory()方法只在servlet生命周期结束时被调用一次。可以在destory()方法中进行一些资源的清理,如关闭数据库连接、停止后台线程等

https://zhhll.icu/2021/javaweb/基础/1.Servlet接口/

本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-829994.html

到了这里,关于JavaWeb之Servlet接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于javaweb+mysql的jsp+servlet学生成绩管理系统(管理员、教师、学生)(java+jsp+servlet+javabean+mysql+tomcat)

    基于javaweb+mysql的jsp+servlet学生成绩管理系统(管理员、教师、学生)(java+jsp+servlet+javabean+mysql+tomcat) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 管理员:个人信息、课程

    2024年02月02日
    浏览(58)
  • JavaWeb三大组件 —— Servlet

    目录 servlet 注册servlet 父pom  pom文件 1、通过注解注册  2、使用ServletRegistrationBean注册  API三生三世 第一生Servlet 第二生SpringMVC 今生SpringBoot Servlet的作用 : 接受请求参数、处理请求,响应结果, (就是写controller层的get、post等) Servlet的生命周期: void init(ServletConfig):初始化

    2024年02月13日
    浏览(36)
  • JavaWeb-初识Servlet

    1. Servlet简介 2. Tomcat安装配置 3. Servlet项目搭建 4. Servlet项目运行 Servlet是什么 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet 可以收集来自网页表单的用户

    2024年02月08日
    浏览(37)
  • JavaWeb之Servlet

    在介绍之前需要了解网络通信的三要素: IP:电子设备(计算机)在网络中的唯一标识。 端口:应用程序在计算机中的唯一标识。 0~65536 传输协议:规定了数据传输的规则 而先前的JavaWeb的前篇了解HTML,CSS,以及JavaScript的使用,静态资源和动态资源的分化,都是基于本地缓存的

    2024年02月11日
    浏览(35)
  • 【JavaWeb】5—Servlet

    ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆 5.1.1 名字 Servlet=Server+applet Server :服务器; applet :小程序;

    2023年04月09日
    浏览(72)
  • Javaweb | 初识、servlet应用

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! HTTP协议 超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出

    2023年04月16日
    浏览(31)
  • Javaweb学习之Servlet

    官方文档:https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html 什么是Servlet:Servlet 在开发动态 WEB 工程中,得到广泛的应用,Servlet是SpringMVC的基础 Servlet的特点 由服务端调用和执行的 用Java语言编写的,本质就是Java类 按照Servlet规范开发 使用idea创建一个工程。 配置好Tomcat。 添

    2024年01月22日
    浏览(53)
  • JavaWeb学习------Servlet

    目录 JavaWeb学习------Servlet Servlet 生命周期 Servlet 生命周期  Servlet 方法介绍 •Servlet 体系结构 Servlet 体系结构 •Servlet urlPattern配置 Servlet urlPattern配置 •XML 配置方式编写 Servlet  XML 配置方式编写 Servlet • 快速入门 • Servlet 执行流程 Servlet 生命周期 对象的生命周期指一个对象

    2024年02月02日
    浏览(40)
  • Javaweb基础-tomcat,servlet

    properties配置文件: 由键值对组成 键和值之间的符号是等号 每一行都必须顶格写,前面不能有空格之类的其他符号 xml配置文件:(xml语法=HTML语法+HTML约束)xml约束-DTD /  Schema DOM4J进行XML解析:(jar包 dom4j.jar ) web项目标准文件结构(Tomcat/webapps下): app 本应用根目录 stat

    2024年02月19日
    浏览(50)
  • JavaWeb-Servlet的应用

    1. HTTP协议 2. HttpServlet 什么是HTTP协议 HTTP 协议一般指 HTTP(超文本传输协议)。超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包