Servlet

一、Servlet概念

1、Servlet是运行在 Java 服务器端的程序,用于接收和响应来自客户端基于 HTTP 协议的请求。

2、Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。SUN公司提供

3、核心方法:service(),任何客户端的请求都会经过该方法

二、Servlet快速入门

1、创建一个web项目

2、定义一个类实现Servlet接口

java 复制代码
package com;


import javax.servlet.*;
import java.io.IOException;
//tomcat下lib目录下的 servlet-api.jar引入项目中
/**
 * @author 86136
 */
public class MyWeb01 implements Servlet {
    
    @Override//创建
    public void init(ServletConfig servletConfig) throws ServletException {

    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("女孩");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    //销毁
    public void destroy() {

    }
}

3、在web.xml中配置Servlet

XML 复制代码
<?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>
        <!--com.MyWeb01类的别名 test01-->
        <servlet-name>test01</servlet-name>
        <!--com.MyWeb01 是类的全路径-->
        <servlet-class>com.MyWeb01</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--MyWeb01类与请求的映射关系引用上面的别名-->
        <servlet-name>test01</servlet-name>
        <!--url-pattern是我们的路径请求-->
        <url-pattern>/aa</url-pattern>
    </servlet-mapping>
</web-app>

4、点击运行

5、通过浏览器测试

在浏览器访问:http://localhost:8080/aa

三、Servlet执行原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。

  3. 如果有,则在找到对应的<servlet-class>全类名

  4. tomcat会将字节码文件加载进内存,并且创建其对象

  5. 调用其service方法

我们通过浏览器发送请求,请求首先到达Tomcat服务器,由服务器解析请求URL,然后在部署的应用列表中找到我们的应用。接下来,在我们的应用中找应用里的web.xml配置文件,在web.xml中找到Servlet的配置,找到后执行service方法,最后由Servlet响应客户浏览器。整个过程如下图所示:

一句话总结执行过程:

浏览器------>Tomcat服务器------>我们的应用------>应用中的web.xml------>Servlet类------>响应浏览器

四、Servlet体系结构

在刚才的入门案例中,我们定义了自己的Servlet,实现的方式都是选择实现Servlet,在Servlet的API介绍中,它提出了我们除了实现Servlet还可以继承GenericServlet和继承HttpServlet,通过查阅servlet的类视图,我们看到Servlet下有一个抽象类GenericServlet,抽象类GenericServlet还有一个子类HttpServlet。同时,在service方法中还有参数ServletRequest和ServletResponse,

五、Servlet实现方式

实现Servlet功能的三种方式:

1、上面用过的:实现Servlet接口,接口中的方法必须全部实现

使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义

2、继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写

使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的

java 复制代码
package com;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/**
 * @author 86136
 */
public class MyWeb02 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("我喜欢你");
    }
}

web.xml

XML 复制代码
<?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-name>test02</servlet-name>
        <servlet-class>com.MyWeb02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test02</servlet-name>
        <url-pattern>/bb</url-pattern>
    </servlet-mapping>
</web-app>

3、继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。

使用此种方式,表示我们的请求和响应需要和HTTP协议相关。也就是说,我们是通过HTTP协议来访问的。那么每次请求和响应都符合HTTP协议的规范。请求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST)

java 复制代码
package com;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 86136
 */
public class MyWeb03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我喜欢你苏沐橙");
    }
}

web.xml

XML 复制代码
<?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-name>test03</servlet-name>
        <servlet-class>com.MyWeb03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test03</servlet-name>
        <url-pattern>/cc</url-pattern>
    </servlet-mapping>
</web-app>

六、 Servlet的生命周期

1、Servlet的创建,存活及死亡

1、创建:执行init方法,只执行一次

2、存活:提供服务,执行service方法,执行多次

3、销毁:执行destroy方法,只执行一次

2 、Servlet什么时候被创建

1、默认情况下,第一次被访问时,Servlet被创建

2、可以手动配置执行Servlet的创建时机, 在web.xml的在<servlet>标签下配置

1、 <load-on-startup>的值为负数时, 第一次被访问时创建

2、<load-on-startup>的值为0或正整数时, 在服务器启动时创建

复制代码
<?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>
        <!--com.MyWeb01类的别名 test01-->
        <servlet-name>test01</servlet-name>
        <!--com.MyWeb01 是类的全路径-->
        <servlet-class>com.MyWeb01</servlet-class>
        <!--在服务器启动时创建-->
        <load-on-startup>1</load-on-startup>
    </servlet>
</web-app>

七、 Servlet的线程安全问题

Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的

1、多个用户同时访问时,可能存在线程安全问题

2、解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值

八、Servlet3.0注释开发(重点)

1、注解开发的优势

简单便捷,不需要再操作繁琐的web.xml配置

复制代码
//基于注解配置Servlet
@WebServlet("/index")
public class MyWeb04 extends HttpServlet {}

2、取代了web.xml中的配置

九、映射的相关配置

1、Servlet的映射方式

1、具体名称的方式。访问的资源路径必须和映射配置完全相同。==(常用)==

// 只有/test01请求能匹配 http://localhost:8080/test01

@WebServlet("/test01")

2、/ 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么

// *代表所有,任意

//只要请求符合这个目录结构/com/, 后面无论是什么都能匹配到这个

@WebServlet("/com/*")

// http://localhost:8080/com/haha http://localhost:8080/com/jjj http://localhost:8080/com

//极端一点, 匹配所有, 任何请求都能匹配到这个

@WebServlet("/*")

3、通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径。

http://localhost:8080/mm.do

@WebServlet("*.do")

2、Servlet的多路径映射

我们可以给一个 Servlet 配置多个访问映射,从而可以让不同的请求路径来访问相同的Servlet

// @WebServlet里面可以写多个路径, 使用{}包裹,用逗号分隔

@WebServlet({"/vip","/vvip","/vvvip"}

相关推荐
编程、小哥哥11 小时前
在 Docker 中部署 Jenkins,并完成项目的构建和发布
servlet·docker·jenkins
weixin_537590451 天前
《Java编程入门官方教程》第八章练习答案
java·开发语言·servlet
Ttang233 天前
Tomcat原理(4)——尝试手动Servlet的实现
java·开发语言·servlet·java-ee·tomcat·intellij-idea
loop lee3 天前
计算机网络 - HTTP 协议和万维网
java·网络协议·servlet·tomcat
不修×蝙蝠4 天前
搭建Tomcat(四)---Servlet容器
java·服务器·servlet·tomcat·搭建resquest
像污秽一样4 天前
简易记事本开发-(SSM+Vue)
java·vue.js·spring boot·spring·servlet·maven·mybatis
计算机学无涯5 天前
Servlet学习中遇到的一些问题及解决
servlet
测试工程师成长之路6 天前
解锁 Jenkins 搭建全攻略
运维·servlet·jenkins
进击的编程浪人6 天前
jsp中的四个域对象(Spring MVC)
servlet
怒放de生命20106 天前
jenkins 出现 Jenkins: 403 No valid crumb was included in the request
java·servlet·jenkins