Servlet(一)

文章目录

1.Servlet整体框架

image-20240124163002788

image-20240124162404813

2.Servlet快速入门

image-20240124163547177

1.创建项目配置基本环境

上个文件有详细介绍

2.添加jar包
1.在WEB-INF下创建目录lib,添加文件

image-20240124164207245

2.添加到项目中

image-20240124164258709

image-20240124164305496

3.配置代码提示

image-20240124164338653

3.src下创建文件

image-20240124164556738

4.实现Servlet接口
package HelloServlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class HelloServlet implements Servlet {
    /**
     * 当创建HelloServlet会调用,且只会调用一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init()");
    }

    /**
     * 返回ServletConfig,也就是servlet的配置
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 1.该方法处理浏览器的请求
     * 2.当浏览器每次请求一次servlet时,就会调用一次
     * 3.当tomcat调用该方法时,会把http请求的数据封装成实现ServletRequest接口的request对象
     * 4.通过servletRequest对象,可以得到用户提交的数据
     * 5.ServletResponsed对象可以用于返回数据给tomcat服务器
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hi, helloServlet");
    }

    /**
     * 返回servlet的信息,使用较少
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 1.该方法是servlet销毁时调用的
     * 2.只会调用一次
     */
    @Override
    public void destroy() {

    }
}

5.在web.xml配置HelloServlet

image-20240124172446558

6.通过浏览器访问HelloServlet

image-20240124182128080

image-20240124182120106

3.浏览器访问Servlet的流程分析

image-20240124184518042

一共有三个容器
url-name
name-全类名
name-实例
Servlet的生命周期
初始化阶段

image-20240124190145517

处理浏览器请求阶段

image-20240124190752781

终止阶段

image-20240124191101583

4.GET和POST的分发处理

代码示例
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //GET和POST的分发处理
        //1.首先需要知道,ServletRequest的运行类型其实是它的子类HttpServletRequest的实现类,而getMethod方法是这个子接口的,所以需要将这个父接口转换为子接口的类型
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; //现在就是他的子接口,指向它的实现类,封装了请求的方法
        String method = httpServletRequest.getMethod();
        if (method.equals("GET")) {
            doGet();
        }
        else if (method.equals("POST")) {
            doPost();
        }
    }
    //编写doGet和doPost方法,用于分发处理
    public void doGet() {
        System.out.println("doGet被调用");
    }
    public void doPost() {
        System.out.println("doPost被调用");
    }

<%--
  Created by IntelliJ IDEA.
  User: 8615941515990
  Date: 2024/1/24
  Time: 16:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="http://localhost:8080/servlet/helloServlet" method="post">
    username: <input type="text" name="username">
  </form>
  </body>
</html>

5.继承HttpServlet来开发Servlet

image-20240124201254544

1.创建文件

image-20240124202328459

2.配置web.xml

image-20240124202349902

3.实现doGet和doPost方法并编写
package HelloServlet;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class HiServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hi HiServlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

4.浏览器访问

image-20240124202541258

image-20240124202548212

5.过程解析
1.http://localhost:8080/servlet/hiServlet发送请求到Tomcat服务
2.Tomcat服务根据资源路径/hiServlet,找到HelloServlet.HiServlet

image-20240124203535728

3.创建HiServlet的实例,并调用它的init()方法和service()方法
4.init()方法就是个空的,重点看service()方法,是它的父类HttpServlet的

image-20240124204341205

6.debug方法
1.打断点

2.debug

image-20240124204841728

3.输入网址

image-20240124204929537

4.此时由于是get方式,所以程序会停在断点处

image-20240124204959295

5.查看运行类型的确是HiServlet

image-20240124205040526

6.Servlet注意事项

image-20240125092421195

image-20240125092403908

最简化的浏览器访问Servlet过程
  1. 浏览器向Tomcat服务发送请求
  2. Tomcat服务根据浏览器地址最后的路由/xxx去web.xml中找到对应的类并创建一个对象
  3. 调用init()方法和service()方法
  4. 第二次则直接调用service()方法

7.Servlet注解方式

1.快速入门

image-20240125092641909

1.代码实例
package annotation;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
//使用注解配置路由,一个servlet可以有多个路由,访问网址为http://localhost:8080/servlet/ok1 或者http://localhost:8080/servlet/ok2
@WebServlet(urlPatterns = {"/ok1", "/ok2"})
public class OkServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("注解的doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("注解的doPost");
    }
}

2.结果

image-20240125093844838

image-20240125093924181

2.Servlet注解方式解密
1.与xml方式的区别

image-20240125094850575

简要介绍
  1. 浏览器向Tomcat服务发送请求
  2. 服务扫描所有类的全路径并且通过反射获取注解对象,从而得到urlPatterns(路由)
  3. 将其与浏览器地址最后的/xxx比对,如果比对成功则调用init()方法和service()方法
  4. 第二次就直接调用service()方法
2.Servlet注解的参数说明

image-20240125093204460

3.注解URL的4种匹配方式
1.精确匹配

image-20240125102457867

image-20240125102617687

image-20240125102629995

image-20240125102635046

2.目录匹配

image-20240125102704651

image-20240125102838187

image-20240125102846193

image-20240125102855041

3.扩展名匹配

image-20240125102949068

image-20240125103237714

image-20240125103245219

image-20240125103254255

4.任意匹配

image-20240125103315610

image-20240125103509103

image-20240125103534263

image-20240125103540140

4.URL配置注意事项

image-20240125104755761

image-20240125105134594

8.课后练习

1.练习一

image-20240125105501857

login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/servlet/cat" method="post">
  username:<input name="username" type="text">
</form>
</body>
</html>
CatServlet.java
package HomeWork;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class CatServlet implements Servlet {
    private int num = 0; //统计次数
    @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("访问次数:" + (++num));
        //向下转型获取请求方式
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if (method.equals("GET")) {
            System.out.println("GET");
        }
        else if (method.equals("POST")) {
            System.out.println("POST");
        }
    }


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

    @Override
    public void destroy() {

    }
}

web.xml

image-20240125135254570

结果

image-20240125135318697

image-20240125135338394

2.练习二

image-20240125135421608

login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/servlet/dog" method="post">
  username:<input name="username" type="text">
</form>
</body>
</html>
DogServlet.java
package HomeWork;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class DogServlet extends HttpServlet {
    //统计次数
    private int get = 0;
    private int post = 0;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GET:" + (++get));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("POST:" + (++post));
    }
}

web.xml

image-20240125140257291

结果

image-20240125140329241

image-20240125140340201

3.练习三

image-20240125140424331

PigServlet.java
package HomeWork;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.InetAddress;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = {"/pig1", "/pig2"})
public class PigServlet extends HttpServlet {
    //统计次数
    private int get = 0;
    private int post = 0;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("发出请求的浏览器的ip:" + req.getRemoteAddr());
        System.out.println("GET:" + (++get));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("发出请求的浏览器的ip:" + req.getRemoteAddr());
        System.out.println("POST:" + (++post));
    }
}

结果

image-20240125141918306

image-20240125141926631

image-20240125141949918

相关推荐

  1. <span style='color:red;'>Servlet</span>

    Servlet

    2024-04-09 02:28:01      45 阅读
  2. <span style='color:red;'>servlet</span>

    servlet

    2024-04-09 02:28:01      66 阅读
  3. <span style='color:red;'>Servlet</span>

    Servlet

    2024-04-09 02:28:01      31 阅读
  4. <span style='color:red;'>Servlet</span>

    Servlet

    2024-04-09 02:28:01      35 阅读
  5. servlet

    2024-04-09 02:28:01       30 阅读
  6. <span style='color:red;'>Servlet</span>

    Servlet

    2024-04-09 02:28:01      21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 02:28:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 02:28:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 02:28:01       82 阅读
  4. Python语言-面向对象

    2024-04-09 02:28:01       91 阅读

热门阅读

  1. SSH常见运维总结

    2024-04-09 02:28:01       29 阅读
  2. 深入了解 STL:强大的编程工具

    2024-04-09 02:28:01       36 阅读
  3. Springboot注解知识-文字描述(学习笔记)

    2024-04-09 02:28:01       28 阅读
  4. D435i发布的话题学习

    2024-04-09 02:28:01       34 阅读
  5. 23种设计模式的概念

    2024-04-09 02:28:01       29 阅读
  6. TCP协议

    TCP协议

    2024-04-09 02:28:01      32 阅读
  7. Leetcode 482. 密钥格式化

    2024-04-09 02:28:01       33 阅读
  8. CentOS7编译ZLMediaKit并使能WebRTC

    2024-04-09 02:28:01       40 阅读
  9. Android 允许其他应用读取本应用的私有目录

    2024-04-09 02:28:01       32 阅读
  10. 大模型日报2024-04-08

    2024-04-09 02:28:01       42 阅读