Servlet

创建一个get 响应

  1. 创建一个该API 的类文件

    image-20250422111929394

  2. 然后继承HelloServlet

  3. 编写逻辑
    发起一个get 请求

    从请求获取name 参数
    如果有这个name 参数,那么就返回hello name 的字样
    没有这个name 参数那就提示传参错误

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.example.demo;

    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;

    import java.io.IOException;
    import java.io.PrintWriter;

    public class IndexServlet extends HelloServlet{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    System.out.println("index servlet"); // 只会在终端输出,不会显示在浏览器中
    // 获取一个name 参数
    String name=request.getParameter("name");
    PrintWriter out=response.getWriter();
    if (name==null){
    out.println("<h1>参数错误</h1>");
    }else{
    out.println("<h1>Hello "+name+"</h1>");
    }
    super.doGet(request, response);
    }
    }

  4. 修改web.xml

    文件在

    src/main/webapp/WEB-INF/web.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
    version="6.0">

    <servlet>
    <servlet-name>index</servlet-name>
    <servlet-class>com.example.demo.IndexServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern>/index</url-pattern>
    </servlet-mapping>
    </web-app>

    主要添加了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <servlet>
    <servlet-name>index</servlet-name>
    <servlet-class>com.example.demo.IndexServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern>/index</url-pattern>
    </servlet-mapping>

    配置<servlet>标签的作用

    <servlet>标签的作用是对 Servlet 进行定义,告知 Servlet 容器(如 Tomcat)哪一个类属于 Servlet,以及该 Servlet 的名称。其配置项如下:

    • <servlet-name>:为 Servlet 指定一个名称,这个名称会在后续的<servlet-mapping>标签里使用,用来将 URL 模式和 Servlet 建立关联。它只是一个逻辑名称,能够随意命名。
    • <servlet-class>:指定 Servlet 类的全限定名,也就是包含完整包名的类名。Servlet 容器会依据这个类名来加载和实例化 Servlet。

    配置<servlet-mapping>标签的作用

    <servlet-mapping>标签的作用是把 URL 模式和 Servlet 名称关联起来,这样当客户端发起 HTTP 请求时,Servlet 容器就能够依据请求的 URL 来确定应该调用哪个 Servlet 进行处理。其配置项如下:

    • <servlet-name>:引用之前在<servlet>标签中定义的 Servlet 名称。
    • <url-pattern>:指定和 Servlet 关联的 URL 模式。当客户端请求的 URL 和这个模式相匹配时,Servlet 容器就会调用对应的 Servlet 来处理该请求。
  5. 运行效果
    image-20250422120129630

    image-20250422120142289

  6. 其他请求方式
    其他请求方式,只需要重载doxxx 就行

    image-20250422120340318

其他方式注册路由

创建一个新的类,然后添加路由的信息

image-20250422121237128

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.example.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(name = "getBookServlet", value = "/get/book")
public class GetBookServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("getBookServlet");
String size=req.getParameter("size");
if(size==null){
resp.getWriter().println("<h1>参数错误</h1>");
}
else{
resp.getWriter().println("<h1>You get book size is: "+size+"</h1>");
}

}
}

image-20250422121147658

这个是通过类前面的注解

@WebServlet(name = "getBookServlet", value = "/get/book")

这个方式进行注册

探究函数的执行顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.example.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(name = "getBookServlet", value = "/get/book")
public class GetBookServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("getBookServlet");
String size=req.getParameter("size");
if(size==null){
resp.getWriter().println("<h1>参数错误</h1 >");
}
else{
resp.getWriter().println("<h1>You get book size is: "+size+"</h1>");
}
}

@Override
public void init() throws ServletException {
System.out.println("getBookServlet init");
super.init();
}

@Override
public void destroy() {
System.out.println("getBookServlet destroy");
super.destroy();
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("getBookServlet HttpServlet");
super.service(req, resp);
}

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("getBookServlet Servlet");
super.service(req, res);
}
}

当发起第一次携带请求的时候

image-20250422122403430

Init > service(ServletRequest req, ServletResponse res) > service(HttpServletRequest req, HttpServletResponse resp) > doXX

然后我们关闭服务器

image-20250422122521669

最后才会执行destroy

两个service 的执行逻辑有什么不同

service(HttpServletRequest req, HttpServletResponse resp),只能在 HttpServlet 子类中使用,支持 HTTP 协议的细节(如req.getMethod()获取请求方法)。

service(ServletRequest req, ServletResponse res) 是 Servlet 接口的原始定义,适用于所有 Servlet(无论是否基于 HTTP),但无法直接访问 HTTP 特有的功能。


Servlet
https://tsy244.github.io/2025/04/22/javaee/Servlet/
Author
August Rosenberg
Posted on
April 22, 2025
Licensed under