Request 和Response 说明

举报
兰舟千帆 发表于 2022/07/21 19:16:41 2022/07/21
【摘要】 Request 和Response 说明 简单作用说明从单词字面意思上看,我们明白一个人是请求,一个是响应。我们写Servlet代码的时候我们会常常看见这两个参数。我们需要了解这两个参数器到了什么样的作用。引用黑马的说明request:获取请求数据浏览器会发送HTTP请求到后台服务器[Tomcat]HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]后台服务器[Tomcat]会对H...

Request 和Response 说明

简单作用说明

从单词字面意思上看,我们明白一个人是请求,一个是响应。

我们写Servlet代码的时候我们会常常看见这两个参数。

在这里插入图片描述
在这里插入图片描述
我们需要了解这两个参数器到了什么样的作用。

引用黑马的说明

request:获取请求数据

浏览器会发送HTTP请求到后台服务器[Tomcat]
HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务

response:设置响应数据

业务处理完后,后台就需要给前端返回业务处理的结果即响应数据把响应数据封装到response对象中
后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果浏览器最终解析结果,把内容展示在浏览器给用户浏览

在这里插入图片描述
代码测试案例

package jgd;

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.BufferedReader;
import java.io.IOException;
@WebServlet("/dod/*")
public class ServletDemo8 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        获取到请求方式
        String method = req.getMethod();
        System.out.println("请求方式:"+method);
//        获取虚拟访问目录(项目访问路径)
        String contextPath = req.getContextPath();
        System.out.println("虚拟目录:"+contextPath);
//        获取url
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("url"+requestURL.toString());
//        获取资源标识符
        String requestURI = req.getRequestURI();
        System.out.println("资源标识符"+requestURI);
//        获取请求参数
        String queryString = req.getQueryString();
        System.out.println("请求参数"+queryString);
//        获取浏览器版本的一个请求头
        String agent = req.getHeader("user-agent");//获取
        System.out.println("浏览器"+agent);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
//        获取post的2请求体
//        1:获取字符输入流
        BufferedReader br = req.getReader();
//        读取数据
        String line = br.readLine();
        System.out.println(line);
//        一次请求完毕后,request对象被销毁后,流会自动关闭

    }
}


package jgd;

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("/demo9")
public class ServletDemo9 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");

        resp.setHeader("content-type", "text/html;character=utf-8");
        resp.setContentType("text/html;charset=utf-8");//html
//       resp.setContentType("text/plain; charset=utf-8"); 文本
//        charset=UTF-8.如果该方法在getWriter()方法被调用之前调用,那么响应的字符编码将仅从给出的内容类型 中设置。该方法如果在getWriter()方法被调用之后或者在被提交之后调用,
//        将不会设置响应的字符编码,在使用http协议的情况中,该方法设 置 Content-type实体报头。
        resp.getWriter().write("<h1>" + name + ",欢迎你</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.out.println("POST。。。");
    }
}

==需要注意的地方请看代码注释==

==request对象是用来封装请求数据的对象
response对象是用来封装响应数据的对象==

当然这只是我们一个小小的理解

Request的继承体系

然后我们还会发现在不同的Servlet中其中这两个参数的写法也是不一样的。

package jgd;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo1")
public class ServletDemo01 implements Servlet {
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //Servlet被访问的时候service会自动执行
        System.out.println("servlet hello world");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

package jgd;

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("/jgdabc/666")
//可配置多个访问路径,这是精确匹配
//@WebServlet(urlPatterns = {"/demo7","/demo07"})
//@WebServlet(urlPatterns = "/user/*") 目录匹配
//当精确匹配和目录匹配同时都满足的时候,精确匹配优先级别更高
//@WebServlet("*.do") 扩展名匹配
//任意匹配
// /* 的优先级高于/
//@WebServlet("/")
//@WebServlet("/*")

public class ServletDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo7get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
    }
}

一个是存在于继承Servlet的方法参数体中,一个是HttpServlet的doGet()和doPost()两个方法的参数体中。我们可以明显的发现这两个参数的写法是不一样的。但是其实还是一个实现请求一个实现响应。

现在我们来看Request,想必也是有自己的继承体系。

在这里插入图片描述
ServletRequest和HttpServletRequest都是Java提供的。然后它的实现是由Tomcat来完成的。实现类就是RequestFacade。

==该类实现了HttpServletRequest接口,也间接实现了ServletRequest接口。
Servlet类中的service方法、doGet方法或者是doPost方法最终都是由Web服务器[Tomcat]
来调用的,所以Tomcat提供了方法参数接口的具体实现类,并完成了对象的创建==

验证方法就是你把request打印出来,就可以理解了。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。