Servlet(下篇)

news2024/11/18 7:46:00

哥几个来学 Servlet 啦 ~~

这个是 Servlet(上篇)的链接,

(2条消息) Servlet (上篇)_小枫 ~的博客-CSDN博客icon-default.png?t=N5K3https://blog.csdn.net/m0_64247824/article/details/131229873主要讲了 Servlet的定义、Servlet的部署方式、Servlet 的运行原理、Servlet 的生命周期 ~~

本篇主要讲解 HttpServlet 类 ~~

目录

🌲一、HttpServlet 类

🥗核心方法:

① 代码示栗🌰:处理 GET 请求 和 POST 请求

🌳二、Response 乱码问题

🌴三、HttpServletRequest

① 代码示栗🌰:打印请求信息

② 代码示栗🌰:通过 query string 获取 GET 请求中的参数

③ 代码示栗🌰:采用 form 表单获取 POST 请求中的参数

Request 乱码问题

④ 代码示栗🌰:JSON 格式 获取 POST 请求中的参数

🌵四、HttpServletResponse

① 代码示栗🌰:设置状态码

② 代码示栗🌰:自动刷新

③ 代码示栗🌰:重定向


🌲一、HttpServlet 类

HttpServlet 是继承于 GenericServlet 抽象类而来的。

而这个  GenericServlet 抽象类又实现了 Servlet、ServletConfig、Serializable 接口

因此, HttpServlet类 中实现了 Servlet 里的方法(比如我们上一篇所说的 init() 、service()、destroy() 等方法)

        我们写 Servlet 代码的时候,首先第一步就是先创建类,继承自 HttpServlet,并重写其中的某些方法。

🥗核心方法:

方法名称调用时机
init在 HttpServlet 实例化之后被调用一次
destory在 HttpServlet 实例不再使用的时候调用一次
service收到 HTTP 请求的时候调用
doGet收到 GET 请求的时候调用(由 service() 方法调用)
doPost收到 POST 请求的时候调用(由 service() 方法调用)
doPut/doDelete/doOptions/...收到其他请求的时候调用(由 service() 方法调用)

我们实际开发的时候主要重写 doXXX 方法,很少会重写 init / destory / service 。

因为 service()方法 会解析HttpServletRequest中的方法参数,并调用以下方法之一:doGet() 、doPost() 、doHead() 、doPut() 、doTrace() 、doOptions() 和doDelete() 。

service()方法 源码:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

使用 HttpServlet 抽象类时,还需要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。

我们以 doGet()方法 来举例:

补全完之后,要把代码中的 “super.doGet(req, resp);” 删除!!

可以看见里面要传两个参数:1. HttpServletRequest 对象  2. HttpServletResponse 对象。

 HttpServletRequest 为 服务器 从 客户端 收到的 请求

HttpServletResponse 为 服务器 要 发送给 客户端 而构造出来的 响应

① 代码示栗🌰:处理 GET 请求 和 POST 请求

创建 ServletMethod.java, 创建 doGet 方法 和 doPost 方法

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;

@WebServlet("/method")
public class ServletMethod extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这行代码相当于用于往 响应的 body 中写入文本格式数据
        resp.getWriter().write("Get response");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这行代码相当于用于往 响应的 body 中写入文本格式数据
        resp.getWriter().write("Post response");
    }
}

同时,我们创建 testMethod.html, 放到 webapp 目录中,形如:

 注意:这个文件与 WEB-INF 同级

然后在 testMethod.html 里写入:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TestMethod</title>

    <!-- 引入 jquery -->
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>

</head>
<body>
    <button onclick="sendGet()">发送 GET 请求</button>
    <button onclick="sendPost()">发送 POST 请求</button>
    <script>
        function sendGet() {
            //使用 ajax 技术(要先引入 jquery ~~)
            $.ajax({
                // 方法名
                method:'GET',
                // 路径
                url:'method',
                // 连接服务器成功后调用的方法
                // body 就是 响应里的 body
                success:function(body) {
                    console.log(body)
                }
            });
        };
    </script>

<script>
    function sendPost() {
        $.ajax({
            method:'POST',
            url:'method',
            success:function(body) {
                console.log(body)
            }
        });
    };
</script>

</body>
</html>

重新部署程序,在浏览器中通过

TestMethodhttp://localhost:8080/HelloServlet/testMethod.html访问,可以看到:

用 Fiddler 抓包可以看到它们两个请求的响应:

GET 请求的响应:

POST 请求的响应 

🌳二、Response 乱码问题

如果我们在响应代码中写入中文,例如:

此时在浏览器访问的时候,会看到 "乱码" 的情况:

 关于 "乱码":

中文的编码方式有很多种,其中最常见的就是 utf-8 。

如果没有显式的指定编码方式,则浏览器不能正确识别编码,就会出现乱码的情况。

可以在代码中,通过 resp.setContentType("text/html; charset=utf-8"); 显式的指定编码方式:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //这行代码相当于告诉 客户端的浏览器 : 我们返回的请求是一个 utf-8 格式的
        //resp 就是要返回给客户端的响应
        resp.setContentType("text/html;charset=utf-8");
        // 这行代码相当于用于往 响应的 body 中写入文本格式数据
        resp.getWriter().write("Get 响应");
    }

此时,就不会出现乱码现象了:

通过抓包也可以看出  Content-Type 被设置成了 text/html;charset=utf-8

        Request 乱码问题会在下面的“③ 代码示栗🌰:采用 form 表单获取 POST 请求中的参数” 中提及。

🌴三、HttpServletRequest

HttpServletRequest 可以理解为 服务器 从 客户端 收到的请求

一个 Http 请求中里包含什么内容,那么 这个 HttpServletRequest 就有什么参数。比如:方法、URL、版本号、header、body ...

核心方法:

方法描述
String getProtocol()返回请求协议的名称和版本。
String getMethod()返回请求的 HTTP 方法的名称,例如:GET、POST 或 PUT。
String getRequestURI()从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请 求的 URL 的一部分。
String getContextPath()返回指示请求上下文的请求 URI 部分。
String getQueryString()返回包含在路径后的请求 URL 中的查询字符串。
Enumeration getParameterNames()返回一个 String 对象的枚举,包含在该请求中包含的参数的名 称。
String getParameter(String name)以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
String[] getParameterValues(String name)返回一个字符串对象的数组,包含所有给定的请求参数的值,如 果参数不存在则返回 null。
Enumeration getHeaderNames()返回一个枚举,包含在该请求中包含的所有的头名。
String getHeader(String name)以字符串形式返回指定的请求头的值。
String getCharacterEncoding()返回请求主体中使用的字符编码的名称。
String getContentType()返回请求主体的 MIME 类型,如果不知道类型则返回 null。
int getContentLength()以字节为单位返回请求主体的长度,并提供输入流,或者如果长 度未知则返回 -1。
InputStream getInputStream()用于读取请求的 body 内容,返回一个 InputStream 对象。

通过这些方法可以获取到一个请求中的各个方面的信息。

注意:请求对象是服务器收到的内容,不应该修改。因此上面的方法也都只是 "读" 方法,而不是 "写" 方法。

① 代码示栗🌰:打印请求信息

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.util.Enumeration;

@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //这行代码相当于告诉 客户端的浏览器 : 我们返回的请求是一个 utf-8 格式的
        //resp 就是要返回给客户端的响应
        resp.setContentType("text/html;charset=utf-8");

        // 先创建一个 StringBuilder 类,让它来接收 客户端的浏览器 发过来的请求的信息
        StringBuilder respBody = new StringBuilder();

        //返回请求协议的名称和版本
        respBody.append(req.getProtocol());
        respBody.append("<br>");//由于返回的是 html 格式的代码,因此换行不能用 "\n",而是用 "<br>"

        //返回请求的 HTTP 方法的名称
        respBody.append(req.getMethod());
        respBody.append("<br>");

        //从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分
        respBody.append(req.getRequestURI());
        respBody.append("<br>");

        //返回指示请求上下文的请求 URI 部分
        respBody.append(req.getContextPath());
        respBody.append("<br>");

        //返回包含在路径后的请求 URL 中的查询字符串
        respBody.append(req.getQueryString());
        respBody.append("<br>");

        //获取header
        respBody.append("<h3>headers:</h3>");
        //返回一个枚举,包含在该请求中包含的所有的头名
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            //一个一个获取,再一个一个拼装
            String headerName = headerNames.nextElement();
            respBody.append(headerName + " ");
            //通过 header名 获取header
            respBody.append(req.getHeader(headerName));
            respBody.append("<br>");
        }

        //这行代码相当于用于往 响应的 body 中写入文本格式数据
        //注意:write()里的参数是String类型
        resp.getWriter().write(respBody.toString());
    }
}

使用 Smart Tomcat 部署,访问:localhost:8080/HelloServlet/showRequest

② 代码示栗🌰:通过 query string 获取 GET 请求中的参数

Get 请求中的参数一般都是通过 query string 传递给服务器的,形如:

https://v.bitedu.vip/personInf/student?userId=1111&classId=100

此时浏览器通过 query string 给服务器传递了两个参数:userId 和 classId,值分别是 1111 和 100。

在服务器就可以通过 getParameter 来获取到参数的值。

创建 GetParameter 类:

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;

@WebServlet("/getParameter")
public class GetParameter extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //这行代码相当于告诉 客户端的浏览器 : 我们返回的请求是一个 utf-8 格式的
        //resp 就是要返回给客户端的响应
        resp.setContentType("text/html;charset=utf-8");

        //获取 名为userId 的参数
        String userId = req.getParameter("userId");
        //获取 名为classId 的参数
        String classId = req.getParameter("classId");

        //这行代码相当于用于往 响应的 body 中写入文本格式数据
        resp.getWriter().write("userId = " + userId + "<br>classId = " + classId);
    }
}

重新部署程序,在浏览器中通过 localhost:8080/HelloServlet/getParameter 访问,可以看到:

如果 url 后面不写参数,那么参数的值为 null

如果 url 后面写了参数,那么就可以获取到值了

③ 代码示栗🌰:采用 form 表单获取 POST 请求中的参数

POST 请求的参数一般通过 body 传递给服务器,body 中的数据格式有很多种。如果是采用 form 表单的形式,仍然可以通过 getParameter 获取参数的值。

创建类 PostParameter

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;

@WebServlet("/postParameter")
public class PostParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/http;charset=utf-8");
        String userId = req.getParameter("userId");
        String classId = req.getParameter("classId");
        resp.getWriter().write("userId = " + userId + "   classId = " + classId);
    }
}

创建 testPost.html, 放到 webapp 目录中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TestPost</title>
</head>
<body>
    <form action="postParameter" method="post">
        <input type="text" name="userId">
        <input type="text" name="classId">
        <input type="submit" value="提交">
    </form>
</body>
</html>

重新部署程序,通过 URL http://127.0.0.1:8080/ServletHelloWorld/testPost.html 访问

输入参数,点击提交之后

可以看到跳转到了新的页面,并显示出了刚刚传入的数据

 那如果输入的参数里含有中文呢?

 那么就会出现乱码

 

用 Fiddler 抓包 发现是一串 看不懂的字符

Request 乱码问题

解决post提交方式的乱码:

request.setCharacterEncoding("UTF-8");

结果:不再乱码

而 解决get提交的方式的乱码:

parameter = newString(parameter.getbytes("iso8859-1"),"utf-8");

④ 代码示栗🌰:JSON 格式 获取 POST 请求中的参数

创建 PostParameterJson 类

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.io.InputStream;

@WebServlet("/postParameterJson")
public class PostParameterJson extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //告诉 客户端浏览器 body 的格式是 json 格式的
        resp.setContentType("application/json;charset=utf-8");
        //处理请求里的body
        String body = readBody(req);
        //往 响应的 body 中写入文本格式数据
        resp.getWriter().write(body);
        //打印从请求中得到的Body
        System.out.println(body);
    }

    private String readBody(HttpServletRequest req) throws IOException {
        //获取请求正文的长度
        int contentLength = req.getContentLength();
        //创建一个byte数组来接收请求的body
        //为什么要用 byte 呢? 因为接收的时候是按照字节流接收的
        byte[] body = new byte[contentLength];
        //创建一个输入流对象
        InputStream inputStream = req.getInputStream();
        //将请求的body写入到数组中
        inputStream.read(body);
        //将 byte 数组转化为 String,并设置为 utf-8字符集
        return new String(body, "utf-8");
    }
}

创建 testPostJson.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>testPostJson</title>

    <!-- 引入 jquery -->
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
    <button onclick="sendPostJson()">发送 Json格式 的 POST请求</button>

    <script>
        function sendPostJson() {          
            let message = {
                "userId":123,
                "password":456,
            }
            
            $.ajax({
                type:'post',
                url:'postParameterJson',
                contentType:'application/json;charset=utf-8',

                data:JSON.stringify(message),
                
                success:function(body) {
                    console.log(body);
                }
            });
        };
    </script>    

</body>
</html>

在浏览器中通过 testPostJsonhttp://localhost:8080/HelloServlet/testPostJson.htmltestPostJson 访问, 可以看到

点击按钮,则浏览器就会给服务器发送一个 POST 请求,body 中带有 JSON 格式(使用 Fiddler 抓包):

服务器收到这个结果之后,又把数据返回了回去(打印到控制台上):

注意:到目前为止,服务器拿到的 JSON 数据仍然是一个整体的 String 类型,如果要想获取到 userId 和 classId 的具体值,还需要搭配 JSON 库进一步解析。

我们需要引入 Jackson 这个库, 进行 JSON 解析:

🍕(1) 在中央仓库中搜索 Jackson,选择 JackSon Databind

🍔(2) 选择 2.12.3 版本

🍟(3) 把中央仓库中的依赖配置添加到 pom.xml 中, 形如

🌭(4) 在 PostParameterJson 类中修改代码

import com.fasterxml.jackson.databind.ObjectMapper;

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.io.InputStream;

//创建一个 类 来接收数据,这个类里的 成员变量 要与 Json 里的字符串的 key 相同~~
class JsonData {
    public String userId;
    public String password;
}

@WebServlet("/postParameterJson")
public class PostParameterJson extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //告诉 客户端浏览器 body 的格式是 html 格式的
        resp.setContentType("text/html;charset=utf-8");
        //处理请求里的body
        String body = readBody(req);

        //ObjectMapper类 是 Json 的核心类
        ObjectMapper objectMapper = new ObjectMapper();

        //用这个创建出来的 JsonData 类来接收数据
        // 通过 readValue() 方法把 body 这个字符串转成 JsonData 对象
        JsonData jsonData = objectMapper.readValue(body, JsonData.class);

        resp.getWriter().write("userId = " + jsonData.userId + "   password = " + jsonData.password);
    }

    private String readBody(HttpServletRequest req) throws IOException {
        //获取请求正文的长度
        int contentLength = req.getContentLength();
        //创建一个byte数组来接收请求的body
        //为什么要用 byte 呢? 因为接收的时候是按照字节流接收的
        byte[] body = new byte[contentLength];
        //创建一个输入流对象
        InputStream inputStream = req.getInputStream();
        //将请求的body写入到数组中
        inputStream.read(body);
        //将 byte 数组转化为 String,并设置为 utf-8字符集
        return new String(body, "utf-8");
    }
}

控制台结果:

注意:

  • JsonData 这个类用来解析之后生成的 Json 对象,这个类的属性的名字和类型要和 Json 字符串的 key 相对应。
  • Jackson 库的核心类为 ObjectMapper,其中的 readValue() 方法把一个 Json 字符串转成 Java 对象。其中的 writeValueAsString() 方法把一个 Java 对象转换成 Json 格式字符串。
  • readValue 的第二个参数为 JsonData 的类对象,通过这个类对象,在 readValue 的内部就可以借助反射机制来构造出 JsonData 对象,并且根据 Json 中的 key 把对应的 value 赋值给 JsonData 的对应字段。

🌵四、HttpServletResponse

        HttpServletResponse 就是 服务器 构造出来的响应,并且要将这个响应返回给 客户端。

        Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式,转成一个字符串,并通过 Socket 写回给浏览器。

核心方法:

方法描述
void setStatus(int sc)为该响应设置状态码。
void setHeader(String name, String value)设置一个带有给定的名称和值的 header。如果 name 已经存在,则覆盖旧的值。
void addHeader(String name, String value)添加一个带有给定的名称和值的 header,如果 name 已经存在, 不覆盖旧的值,并列添加新的键值对。
void setContentType(String type)设置被发送到客户端的响应的内容类型。
void setCharacterEncoding(String charset)设置被发送到客户端的响应的字符编码(MIME 字符集)例如, UTF-8。
void sendRedirect(String location)使用指定的重定向位置 URL 发送临时重定向响应到客户端。
PrintWriter getWriter()用于往 body 中写入文本格式数据。
OutputStream getOutputStream()用于往 body 中写入二进制格式数据。

注意:响应对象是服务器要返回给浏览器的内容,一个 HTTP 响应报文里有什么内容,程序员就可以设置什么内容。因此上面的方法都是 “写” 方法。

此外,对于 状态码 / 响应头 的设置要返回到 getWriter / getOutStream 之前,否则可能设置失效。

① 代码示栗🌰:设置状态码

实现一个程序,用户在浏览器通过参数指定要返回响应的状态码。

创建 StatusServlet 类:

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;

@WebServlet("/statusServlet")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求里的状态码
        String statusString = req.getParameter("status");

        //如果不为空
        if (statusString != null) {
            //将响应里的状态码设置为刚刚获取到的
            resp.setStatus(Integer.parseInt(statusString));
        }

        //将响应里的状态码写到响应的 body 中
        resp.getWriter().write("status = " + resp.getStatus());
    }
}

访问 localhost:8080/HelloServlet/statusServlet

变换不同的 status 的值,就可以看到不同的响应结果。

② 代码示栗🌰:自动刷新

实现一个程序,让浏览器每秒钟自动刷新一次,并显示当前的时间戳。

创建 AutoRefreshServlet 类:

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.util.Date;

@WebServlet("/autoRefreshServlet")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过 设置 HTTP 的响应报文里的 Header 中的 Refresh 字段,可以实现自动刷新
        resp.setHeader("Refresh", "1");

        //获取毫米级的 时间戳
        long time = new Date().getTime();

        //将时间戳写入到相应的 Body 中
        resp.getWriter().write("TimeStamp = " + time);
    }
}

访问:localhost:8080/HelloServlet/statusServlet

抓包结果:

③ 代码示栗🌰:重定向

实现一个程序,返回一个重定向 HTTP 响应,自动跳转到另外一个页面。

创建 RedirectServlet 类:

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;

@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置状态码
        resp.setStatus(302);
        //使用指定的重定向位置 URL 发送临时重定向响应到客户端。
        resp.sendRedirect("https://www.csdn.net/");
    }
}

访问 http://localhost:8080/HelloServlet/redirectServlet 

发现成功跳转到了 CSDN 界面

 并且通过抓包可以看到 状态码被设置为 302 (临时重定向)

        虽然说 Servlet 是一门古老的技术,现在很多公司都用的是SpringMVC-Spring-MyBatis / SpringBoot 做开发了,但是它们都相当于 Servlet 的简化版,因此,学习完 Servlet ,你将有更好的基础去面对后面的框架的知识。 所以,加油吧 ~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【总结】网页状态码——200正常、302重定向、304客户端有缓存、400浏览器请求传参异常、404未找到、405方法不允许、500服务器异常

目录 200正常500异常--服务器异常Java代码400异常----传参相关的异常get方法长度限制400异常&#xff0c;加了RequestParam(value "name") 必须传值400异常&#xff0c;后端类型是Integer&#xff0c;前端传的是string&#xff0c;转换失败400异常&#xff0c;日期格…

一文带你学习“国密算法”

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

ES6--一

1、ES6之includes()方法 Array.prototype.includes方法返回一个布尔值&#xff0c;表示某个数组是否包含给定的值&#xff0c;与字符串的includes方法类似。 一般常用这种写法 : [1,2,3].includes(2) 表示2在不在 前面的数组里 项目里 参数 1&#xff09;第一个参数是要…

VUE L 计算监视属性 ⑥

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs计算属性 C o m p u t e d Computed Computed监视属性 W a t c h Watch Watch总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;…

SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)

文章目录 0. 引入依赖1. 实例创建与关闭2. 创建索引3. 测试索引库存在不存在4. 删除索引库5. 遍历导入数据6. 批量导入数据&#xff08;推荐&#xff09; RestHighLevelClient 是 Elasticsearch 官方提供的Java高级客户端&#xff0c;用于与Elasticsearch集群进行交互和执行各种…

基于Java+Swing实现中国象棋游戏

基于JavaSwing实现中国象棋游戏 一、系统介绍二、功能展示三、其他系统四、获取源码 前言 中国象棋是起源于中国的一种棋&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史。由于用具简单&#xff0c;趣味性强&#xff0c;成为流行极为广泛的棋艺活动。 …

操作系统之死锁详解

本文已收录于专栏 《自考》 目录 背景介绍死锁的前提死锁的概念死锁的分类死锁的产生原因条件 死锁的解决预防避免检测与恢复 死锁的实现总结提升 背景介绍 最近一直在做操作系统的测试题&#xff0c;在做题的过程中发现有很多地方涉及到了关于死锁的知识点。今天就回归课本来自…

机器学习——手写数据集的介绍以及案例讲解

系列文章目录 机器学习聚类——DBSCAN&#xff08;Density-based spatial clustering of applications with noise&#xff0c;基于密度的聚类算法&#xff09; 机器学习集成学习——Adaboost分离器算法 机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法 机器学习的…

“交通·未来”第27期:基于随机效应机器学习的多区域居民出行模式选择分析...

2020年6月份&#xff0c;公众号正式推出了“交通未来”系列线上公益学术活动等你来~&#xff0c; 2023年&#xff0c;新起航新征程&#xff0c;我们继续前行~ 6月24日下午15:30&#xff0c;我们将迎来活动的第27期。 1、讲座主题 基于随机效应机器学习的多区域居民出行模式选择…

工作三--知识点

1、split 切割字符串 2、includes 而不是写成 if&#xff08;useContext pm_global_teamrole_project_manager || pm_global_teamrole_task_manager || pm_global_teamrole_task_parent_manager&#xff09; 因为 的 优先级 高于 ||&#xff0c;这样写 只能 前面的&…

大数据学习(3)

大数据学习&#xff08;3&#xff09; 1 Hive-SQL-DML语句1.1 Hive SQL Load 加载数据语句1.1.1 Load功能1.1.2 Load语法规则1.1.3 Load 语法实验1.1.3.1 Load Data From Local FS1.1.3.2 Load Data From HDFS1.1.3.3 Overwrite选项 1.2 Hive SQL Insert 插入数据语句1.3 Hive …

河道垃圾自动识别监测算法 opencv

河道垃圾自动识别监测系统通过pythonopencv网络模型技术&#xff0c;河道垃圾自动识别监测算法对水面上的垃圾进行自动识别&#xff0c;一旦发现垃圾污染将自动发出警报。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python…

Win10文件夹选项在哪里打开?Win10文件夹选项打开方法

Win10文件夹选项在哪里打开&#xff1f;Win10电脑中用户不知道在哪里才能打开文件夹选项&#xff0c;这时候用户随意打开Win10电脑上的一个文件夹&#xff0c;然后点击右上角的选项&#xff0c;打开之后就能打开文件夹选项了&#xff0c;也可以打开电脑的运行窗口&#xff0c;在…

自动化漏洞猎人代码分析

0x00 前言 安全人员可以扫描&#xff0c;网络上悬赏网站等的漏洞&#xff0c;如果能够发现其存在着安全漏洞&#xff0c;则可以通过提交漏洞的方式来获得一定的赏金&#xff0c;国外的这类悬赏的网站比较多&#xff0c;比如hackone&#xff0c;这上面列出了大量的资产信息&…

你不得不知道的箭头函数和普通函数使用区别!

前言 箭头函数是 ES6 新增的一种函数类型&#xff0c;它采用箭头 > 定义函数&#xff0c;也称为 lambda 函数。箭头函数语法更为简洁&#xff0c;用起来很是方便顺手。 但它存在一些需要注意的问题和局限性。在实际使用时&#xff0c;我们需要根据具体情况来选择合适的函数…

【夜深人静学数据结构与算法 | 第九篇】栈与队列

目录 ​前言&#xff1a; 栈&#xff1a; 栈的实际应用&#xff1a; 队列&#xff1a; 队列的实际应用&#xff1a; 总结&#xff1a; 前言&#xff1a; 栈与队列是我们学习的两个经典的数据结构&#xff0c;这两个数据结构应用广泛&#xff0c;在计算机内有很多底层应用…

操作系统2——进程的描述与控制

本系列博客重点在深圳大学操作系统课程的核心内容梳理&#xff0c;参考书目《计算机操作系统》&#xff08;有问题欢迎在评论区讨论指出&#xff0c;或直接私信联系我&#xff09;。 梗概 本篇博客主要介绍操作系统第二章进程的描述与控制的相关知识。 目录 一、前驱图与程序…

大数据从0到1的完美落地之Flume案例1

案例演示 案例演示&#xff1a;AvroMemoryLogger Avro Source&#xff1a;监听一个指定的Avro端口&#xff0c;通过Avro端口可以获取到Avro client发送过来的文件&#xff0c;即只要应用程序通过Avro端口发送文件&#xff0c;source组件就可以获取到该文件中的内容,输出位置为…

数据库详细讲解--下

数据库详细讲解–下 mysql 表外连接 外连接 1.左外连接&#xff08;如果左侧的表完全显示我们就说是左外连接&#xff09; 2.右外连接&#xff08;如果右侧的表完全显示我们就说是右外连接&#xff09; 3.使用左连接&#xff08;显示所有人的成绩&#xff0c;如果没有成绩…

4自由度并联机器狗实现行走功能

1. 功能说明 本文示例将实现R328a样机4自由度并联机器狗行走的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂电池 …