目录

  • 一、HttpServletRequest 接口
  • 1. 概述
  • 2. 作用
  • 3. request对象
  • 4. 实例
  • 二、HttpServletResponse 接口
  • 1. 概述
  • 2. 作用
  • 3. response对象
  • 4. 实例
  • 三、请求对象和相应对象生命周期



一、HttpServletRequest 接口

1. 概述

HttpServletRequest 接口继承自 ServletRequest 接口,其主要作用是封装 HTTP 请求消息。由于 HTTP 请求消息分为请求行、请求头和请求体三部分。因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求体的相关方法。
注:

  1. HttpServletRequest接口来自于 Servlet 规范中,在 Tomcat 中存在于 servlet-api.jar 这个包下
  2. HttpServletRequest接口实现类由 Http 服务器负责提供
  3. HttpServletRequest接口负责子 doGet/doPost 方法运行时读取Http请求协议包信息
  4. 开发人员习惯于将 HttpServletRequest 接口

2. 作用

由于 HttpServletRequest 接口中定义了获取请求行、请求头和请求体中相关方法,所以我们可以利用 HttpServletRequest 可以完成

  1. 读取Http请求协议中请求行的相关信息
  2. 读取保存在Http请求协议包中请求头或请求体中请求参数信息
  3. 代替浏览器向Http服务器申请资源文件调用

3. request对象

我们发现 Servlet 接口实现类中,重写其doGet()与doPost()方法时,形参为request与response,分别代表请求与响应对象,通过调用对象下的方法,我们可以获取Http协议包中的相关信息。

request对象常用的方法有:

方法

作用

getRequestURL()

获取URL

getRequestURI()

获取URI

getRemoteAddr()

返回发出请求的客户机的IP地址

getRemoteHost()

返回发出请求的客户机的完整主机名

getRemotePort()

返回客户机所使用的网络端口号

getLocalAddr()

返回WEB服务器的IP地址

getLocalName()

返回WEB服务器的主机名

getHeader()

获取请求头

getParameter()

获取请求参数

getAttribute()

返回指定属性值

getCookies()

返回客户端发送的Cookie

getSession()

返回和客户端相关的session

getParameterValues()

返回请求中的参数值

getCharacterEncoding()

返回字符编码方式

getParameterNames()

返回请求中所有参数名字

getProtocol

获取请求所使用的协议名称

getServerPath()

返回请求文件路径

getInputStream()

返回请求的输入流中的数据

4. 实例

设计一个程序,获取Http网络协议包中请求行中相关信息,以及请求头和请求体中的参数信息

1.在之前的项目中,新建一个module,起名为HttpSevletRequest

java给request添加请求头 java http请求头_java


2.给这个module添加Web Application框架,在Web-INF目录下配置lib,并给External Libraries 配置Tomcat jar包,前两步详情请见上一篇文章

java给request添加请求头 java http请求头_java_02


3.配置好了之后,我们在src下,创建controller包(MVC规范),在包下,新建Servlet

java给request添加请求头 java http请求头_java_03


4.给新建的Servlet类起名为MyServlet,同时要勾选下图中划红线的部分(默认勾选)

java给request添加请求头 java http请求头_java_04


5.创建完之后,我们发现Servlet框架自动生成,同时我们看下方划红线的部分,这是一个注解,有了这个注解,我们就不必在web.xml文件中导入类,value可以认为是给这个Servlet接口实现类起别名

java给request添加请求头 java http请求头_服务器_05


6.接下来,我们给项目配置Tocat启动按钮

java给request添加请求头 java http请求头_运维_06


7.将Tomcat按钮与MyServlet文件关联起来,同时起名叫myWeb

java给request添加请求头 java http请求头_html_07


8.查询Http网络协议包中请求行相关信息,在doGet与doPost方法中加入如下代码(源码放于最后)

java给request添加请求头 java http请求头_java给request添加请求头_08


9.在web目录下新建html文件(网页的位置别建错了)

java给request添加请求头 java http请求头_运维_09


10.在html文件中写入一个请求方式为get和一个请求方式为post的表单,action中要用"/项目名/目标文件名"的形式

java给request添加请求头 java http请求头_运维_10


11.要完成对于两种请求方式中请求参数的查询,需要写入以下代码(注意requst.getParameter()方法的使用)

java给request添加请求头 java http请求头_html_11


12.当然,我们配置的Tomcat启动按钮中,别忘了打开资源更新选项

java给request添加请求头 java http请求头_java给request添加请求头_12


13.启动Tomcat,打开myWeb站下的MyWebPage.html网页

java给request添加请求头 java http请求头_java给request添加请求头_13


14.先验证以get请求方式提交,输入内容如下

java给request添加请求头 java http请求头_服务器_14


15.切回终端,输出如下内容

java给request添加请求头 java http请求头_html_15


16.接着验证以post方式提交表单

java给request添加请求头 java http请求头_服务器_16


17.输出内容如下

java给request添加请求头 java http请求头_服务器_17


源码如下

package controller;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

import java.io.IOException;
import java.util.Enumeration;

@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url = request.getRequestURL().toString();//读取请求行中url信息
        String method = request.getMethod();//读取请求行中method
        /*
         * URI: 资源文件精准定位地址,在请求行并没有URI这个属性。
         *      实际上URL中截取一个字符串,这个字符串格式"/网站名/资源文件名"
         *      URI用于让Http服务器对被访问的资源文件进行定位
         */
        String uri = request.getRequestURI();//在URL中截取了一段字符串,substring()
        System.out.println(url);
        System.out.println(method);
        System.out.println(uri);

        Enumeration paramNames = request.getParameterNames();
        while (paramNames.hasMoreElements()) {
            String paramName = (String)paramNames.nextElement();
            String value = request.getParameter(paramName);
            System.out.println("请求参数名:" + paramName + " 请求参数值:" + value);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url = request.getRequestURL().toString();//读取请求行中url信息
        String method = request.getMethod();//读取请求行中method
        String uri = request.getRequestURI();//在URL中截取了一段字符串,substring()
        System.out.println(url);
        System.out.println(method);
        System.out.println(uri);
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username:" + username + " password:" + password);
    }
}
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>MyWebPage</title>
</head>
<body>
      <form action="/myWeb/MyServlet" method="get">
          <input type="text" name="username"/>
          <input type="text" name="password"/>
          <input type="submit">以get请求方式提交
      </form>
      <form action="/myWeb/MyServlet" method="post">
          <input type="text" name="username"/>
          <input type="text" name="password"/>
          <input type="submit">以post请求方式提交
      </form>
</body>
</html>

要注意:

我们在查看POST请求参数时,可能会发现出现乱码。这是因为浏览器以POST方式发送请求,请求参数保存在请求体中,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求体二进制内容由当前请求对象(request)负责解码。request默认使用[ISO-8859-1]字符集,一个东欧语系字符集。此时如果请求体参数内容是中文,将无法解码只能得到乱码。
要想解决此问题,只需要调用request下的setCharacterEncoding(“utf-8”)方法,设置解码字符集为utf-8即可

二、HttpServletResponse 接口

1. 概述

HttpServletResponse 接口继承自 ServletResponse 接口,主要用于封装 HTTP 响应消息。

(1)HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
(2)HttpServletResponse接口实现类由Http服务器负责提供
(3)HttpServletResponse接口负责将doGet/doPost方法执行结果写入到响应体交给浏览器
(4)开发人员习惯于将HttpServletResponse接口修饰的对象称为响应对象

2. 作用

(1) 将执行结果以二进制形式写入到响应体
(2) 设置响应头中[content-type]属性值,从而控制浏览器使用。对应编译器将响应体二进制数据编译为文字,图片,视频,命令等
(3) 设置响应头中 location 属性,将一个请求地址赋值给location。从而控制浏览器向指定服务器发送请求。

3. response对象

response对象常用方法有:

方法

功能

addCookie()

将指定的Cookie加入到当前响应中

addHeader(String name, String value)

将指定的名字和值加入到相应头信息中

sendError(int sc)

使用指定状态码发送一个错误到客户端

sendRedirect(String location)

发送一个临时响应到客户端

setContentType(String ContentType)

设置浏览器对响应体二进制数据的解析方式

setStatus(int sc)

给当前响应设置状态码

getWriter()

向Tomcat索要输出流,此输出流将字符文本内容全部输出

getOutputStream()

同为输出流,输出的是二进制格式

4. 实例

编写一段程序,将Java代码中的字符串输出到网站中,且保证输出的中文不乱码,格式按照HTML解析器解析。

通过response对象向Tomcat服务器获取输出流的方式为

PrintWriter out = response.getWriter();

将字符串输出到网站中的方式为

String str = "hello wordl";
PrintWriter out = response.getWriter();
out.print(str)

设置字符集和解码器的方式为

response.setContentType("text/html;charset=utf-8");

该程序完整代码为:

package controller;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

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

@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String res = "Hello World";
           char ch = 'a';
           String res1 = "Java<br/>Mysql<br/>HTML<br/>";
           String res2 = "面向对象<br/>数据库<br/>网页<br/>";
           response.setContentType("text/html;charset=utf-8");
           PrintWriter out = response.getWriter();
           out.print(res);
           out.print(ch);
           out.print(res1);
           out.print(res2);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

效果如图

java给request添加请求头 java http请求头_java_18

三、请求对象和相应对象生命周期

1.在Http服务器接收到浏览器发送的Http请求协议包后,自动为当前的Http请求协议包生成一个请求对象和一个响应对象

2.在Http服务器调用doGet/doPost方法时,负责将请求对象和响应对象作为实参传递方法中,确保doGet/doPost正确执行

3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的请求对象和响应对象销毁

4.请求对象和响应对象生命周期贯穿一次请求的处理过程中,相当于服务端的代言人