Servlet

  1. 创建Web项目web-demo,导入Servlet依赖坐标
复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <!--
      此处为什么需要添加该标签?
      provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
       因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
    -->
    \<scope\>provided\</scope\>
</dependency>
  1. 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
复制代码
package com.itheima.web;
​
import javax.servlet.*;
import java.io.IOException;
​
public class ServletDemo1 implements Servlet {
​
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }
    public void init(ServletConfig servletConfig) throws ServletException {
​
    }
​
    public ServletConfig getServletConfig() {
        return null;
    }
​
    public String getServletInfo() {
        return null;
    }
​
    public void destroy() {
​
    }
}
  1. 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
复制代码
@WebServlet("/demo1")
  1. 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet
复制代码
http://localhost:8080/web-demo/demo1
  1. 器访问后,在控制台会打印servlet hello world~ 说明servlet程序已经成功运行。

至此,Servlet的入门案例就已经完成,大家可以按照上面的步骤进行练习了。

4.4 生命周期

Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

  1. ==加载和实例化==:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
复制代码
默认情况,Servlet会在第一次访问被容器创建,但是如果创建Servlet比较耗时的话,那么第一个访问的人等待的时间就比较长,用户的体验就比较差,那么我们能不能把Servlet的创建放到服务器启动的时候来创建,具体如何来配置?
​
@WebServlet(urlPatterns = "/demo1",loadOnStartup = 1)
loadOnstartup的取值有两类情况
    (1)负整数:第一次访问时创建Servlet对象
    (2)0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
  1. ==初始化==:在Servlet实例化之后,容器将调用Servlet的==init()==方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只==调用一次==

  2. ==请求处理==:==每次==请求Servlet时,Servlet容器都会调用Servlet的==service()==方法对请求进行处理

  3. ==服务终止==:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的==destroy()==方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收

小结

这节中需要掌握的内容是:

  1. Servlet对象在什么时候被创建的?

默认是第一次访问的时候被创建,可以使用@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)的loadOnStartup 修改成在服务器启动的时候创建。

  1. Servlet生命周期中涉及到的三个方法,这三个方法是什么?什么时候被调用?调用几次?

涉及到三个方法,分别是 init()、service()、destroy()

init方法在Servlet对象被创建的时候执行,只执行1次

service方法在Servlet被访问的时候调用,每访问1次就调用1次

destroy方法在Servlet对象被销毁的时候调用,只执行1次

4.6 体系结构

4.7 urlPattern配置

Servlet类编写好后,要想被访问到,就需要配置其访问路径(==urlPattern==)

  • 一个Servlet,可以配置多个urlPattern

package com.itheima.web;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebServlet;

/**

* urlPattern: 一个Servlet可以配置多个访问路径

*/

@WebServlet**(urlPatterns = {"/demo7","/demo8"})**

public class ServletDemo7 extends MyHttpServlet {

@Override

protected void doGet(ServletRequest req, ServletResponse res) {

System.out.println("demo7 get...");

}

@Override

protected void doPost(ServletRequest req, ServletResponse res) {

}

}

==urlPattern配置规则==

精确匹配

目录匹配

扩展名匹配

任意匹配

    • ==注意:==//*的区别?

      1. 当我们的项目中的Servlet配置了 "/",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet

      2. 当我们的项目中配置了"/*",意味着匹配任意访问路径

      3. DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问

小结

  1. urlPattern总共有四种配置方式,分别是精确匹配、目录匹配、扩展名匹配、任意匹配

  2. 五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > / ,无需记,以最终运行结果为准。

4.8 XML配置

对于XML的配置步骤有两步:

  • 编写Servlet类
复制代码
package com.itheima.web;
​
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
​
public class ServletDemo13 extends MyHttpServlet {
​
    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
​
        System.out.println("demo13 get...");
    }
    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
    }
}
  • 在web.xml中配置该Servlet
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    
    
    <!-- 
        Servlet 全类名
    -->
   \<servlet\>
\<!-- servlet的名称,名字任意--\>
\<servlet-name\>demo13\</servlet-name\>
\<!--servlet的类全名--\>
\<servlet-class\>com.itheima.web.ServletDemo13\</servlet-class\>
\</servlet\>
​
\<!--
Servlet 访问路径
--\>
\<servlet-mapping\>
\<!-- servlet的名称,要和上面的名称一致--\>
\<servlet-name\>demo13\</servlet-name\>
\<!-- servlet的访问路径--\>
\<url-pattern\>/demo13\</url-pattern\>
\</servlet-mapping\>
</web-app>

这种配置方式和注解比起来,确认麻烦很多,所以建议大家使用注解来开发。但是大家要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。

相关推荐
计算机安禾2 天前
【Linux从入门到精通】第36篇:DNS服务探秘——自己搭建一个内网DNS
linux·运维·servlet
测试那点事儿2 天前
零基础API 接口自动化框架源代码:结构、功能与运行时序
java·servlet·自动化
技术钱3 天前
PyTest配置与API测试用例
servlet·测试用例·pytest
deviant-ART3 天前
HttpServletResponse 中 Header 与 OutputStream 的正确使用顺序(避坑指南)
java·后端·servlet
运维全栈笔记5 天前
零基础掌握Jenkins CI/CD:Java项目自动构建与部署全流程指南
git·servlet·ci/cd·gitee·自动化·jenkins·devops
橙子圆1235 天前
SpringMVC5.0
java·spring·servlet
绿草在线5 天前
01基于 Jakarta EE开发 : Servlet + Thymeleaf图书管理系统
servlet
许彰午6 天前
# 手写一个迷你Tomcat——三步理解Servlet容器的核心原理
java·servlet·tomcat
何中应6 天前
记录一次Jenkins构建任务的坑
java·servlet·jenkins