自学内容网 自学内容网

请求(request)

目录

前言

request概述

request的使用

获取前端传递的数据

实例

请求转发 

特点

语法

实例

实例1 

实例2 【关联实例1】

域对象

组成

作用范围:

生命周期:

使用场景:

使用步骤

存储数据对象

获得数据对象

移除域中的键值对【数据对象】


前言

在之前我们学习到真正处理前后端交互是重写 doGet()方法和doPost()方法。我们有注意到这些方法都有一个共同的参数列表:

HttpServletRequest req, HttpServletResponse resp

request概述

request是Servlet.service()方法的一个参数【在上面指的是req 】,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。

因此,我后面讲的request 对象 就是指 req 对象

如下图所示

request的使用

  • 封装了请求头数据;

  • 封装了请求正文数据,如果是GET请求,那么就没有正文;

  • request是一个域对象,可以把它当成Map来添加获取数据;

  • request提供了请求转发和请求包含功能。\

接下来我将针对 如何获得前端数据 ,域对象,请求转发进行详细叙述

获取前端传递的数据

  • 使用getParameter()方法获得前端界面传递给服务器的数据
  • getParameter()方法 是 HttpServletRequest 的继承父类 ServletRequest 的方法

我们注意以下的方法

// 参数为key ,在前端一般是 name 属性值 ,返回值一般是我们输入的值
    String getParameter(String var1);
// 获得所有存储 key 的集合 Enumeration

    Enumeration<String> getParameterNames();
//通过传递的key 值 返回的是一个String类型的数组

    String[] getParameterValues(String var1);

注意第三个方法,常用于复选框 type=checkbox 时,这种情况下 name(key)值都是相同的

重点是 掌握第一个方法的使用

实例

前端写一个简单的用户登录表单,使用getParameter() 获得你输入的内容

请求转发 

首先我先提一下 “ 资源跳转” 我们可以理解为网页的切换。在前端HTML网页,我们使用超链接

<a href="目标网页"></a>来实现跳转。 在后端我们有两种方式完成的网页的切换(资源跳转)

资源跳转有两种形式

  • 请求转发
  • 重定向

本篇博客,我介绍的请求转发的具有应用

特点

  • 1 不能访问外部资源
  • 2浏览器中的urL 是不变的,一直是同一个请求在浏览器看来

语法

1 创建一个 RequestDispatcher 类型的对象 

  • 通过请request对象 调用getRequestDispatcher("url")
 RequestDispatcher rd = request.getRequestDispatcher("/BServlet");

2 调用该对象的forword方法

 rd.forward(request, response);

为了方便,我们也可以合并写,这个大家都懂

实例

实例1 

刚刚举例 说使用 请求转发无法访问外部资源。我现在通过请求转发的形式,来访问百度试一下

前端代码,一个简单的表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>第一个web项目</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <!-- Content here -->
    <form action="/login"  method="post">
    <div class="form-group" >
        <label for="exampleInputEmail1" >用户账户</label>
        <input type="text" class="form-control" id="exampleInputEmail1" name="username" aria-describedby="emailHelp">
        <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
    </div>
    <div class="form-group">
        <label for="exampleInputPassword1">用户密码</label>
        <input type="password" class="form-control" id="exampleInputPassword1" name="password">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>

</body>
</html>

后端 重写 doPost方法

@WebServlet("/login")
 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        System.out.println("欢迎使用post请求方式查询");
        req.getRequestDispatcher("https://www.baidu.com/").forward(req, resp);
        //resp.sendRedirect("https://www.baidu.com/");

    }

启动服务器,浏览器手动访问 该Servlet 

  • 不管提交的表单是否符合条件,观察是否会跳转到百度

但如果访问本机资源,如BServlet. 是可以的

BServlet 

发现

跳转成功

实例2 【关联实例1】

同时我们也应该注意到,浏览器的搜索栏一直都没有变化

即使在后面使用请求转发,跳转到BServlet,也是如此

域对象

组成
  • PageContext;

  • ServletRequest;

  • HttpSession;

  • ServletContext;

注意:

所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据

这里的域对象,我只说ServletRequest类型的request 域对象,同时我们也知道request对象 是 访问Servlet 时,自动创建的。其他的域对象,当具体使用时,再添加到博客中。

特点

  • 可以作为一个仓库,存储数据,当我们要使用时,再从中获取相关数据
作用范围:
  • HttpServletRequest 对象的作用范围是单个 HTTP 请求。
  • 数据只能在同一个请求的生命周期内共享,即从客户端发送请求到服务器处理完请求并返回响应的这段时间内有效。
生命周期:
  • 每次新的请求都会创建一个新的 HttpServletRequest 对象。

  • 当请求处理完毕后,该对象会被销毁。

使用场景:
  • 适用于在同一个请求的不同处理阶段之间传递数据。

  • 例如,在一个请求处理过程中,前端控制器将数据传递给业务逻辑层或视图层。

使用步骤
存储数据对象

调用setAttribute(String name, Object value)方法,存储key-value 键值对形式的对象

  • void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,
获得数据对象

Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;

移除域中的键值对【数据对象】

void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;


原文地址:https://blog.csdn.net/m0_74124657/article/details/144066465

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!