JavaWeb学习(四) --------- Servlet包下的请求与响应接口


一、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
在这里插入图片描述
2.给这个module添加Web Application框架,在Web-INF目录下配置lib,并给External Libraries 配置Tomcat jar包,前两步详情请见上一篇文章
在这里插入图片描述
3.配置好了之后,我们在src下,创建controller包(MVC规范),在包下,新建Servlet
在这里插入图片描述
4.给新建的Servlet类起名为MyServlet,同时要勾选下图中划红线的部分(默认勾选)
在这里插入图片描述
5.创建完之后,我们发现Servlet框架自动生成,同时我们看下方划红线的部分,这是一个注解,有了这个注解,我们就不必在web.xml文件中导入类,value可以认为是给这个Servlet接口实现类起别名
在这里插入图片描述
6.接下来,我们给项目配置Tocat启动按钮
在这里插入图片描述
7.将Tomcat按钮与MyServlet文件关联起来,同时起名叫myWeb
在这里插入图片描述
8.查询Http网络协议包中请求行相关信息,在doGet与doPost方法中加入如下代码(源码放于最后)
在这里插入图片描述
9.在web目录下新建html文件(网页的位置别建错了)
在这里插入图片描述
10.在html文件中写入一个请求方式为get和一个请求方式为post的表单,action中要用"/项目名/目标文件名"的形式
在这里插入图片描述
11.要完成对于两种请求方式中请求参数的查询,需要写入以下代码(注意requst.getParameter()方法的使用)
在这里插入图片描述
12.当然,我们配置的Tomcat启动按钮中,别忘了打开资源更新选项
在这里插入图片描述
13.启动Tomcat,打开myWeb站下的MyWebPage.html网页
在这里插入图片描述
14.先验证以get请求方式提交,输入内容如下
在这里插入图片描述
15.切回终端,输出如下内容
在这里插入图片描述
16.接着验证以post方式提交表单
在这里插入图片描述
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 {

    }
}

效果如图
在这里插入图片描述

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

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值