Request和Response对象详解

举报
YuShiwen 发表于 2022/03/30 23:42:26 2022/03/30
【摘要】 一.初识Request和Response对象 Request和Response对象都是doGet/doPost方法的形参,都是由服务器创建的 例如: @Override protected v...

一.初识Request和Response对象

  • Request和Response对象都是doGet/doPost方法的形参,都是由服务器创建的
    例如:
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet处理doGet请求!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet处理doPost请求!");
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

第一个参数req是request对象,第二个参数resp是response对象

  • request负责封装请求行信息(请求方式,请求路径,请求参数),response负责封装响应信息(响应头,响应体)。

二.Request对象

1.常用方法(非重点,只做了解):

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet处理doGet请求!");
        System.out.println("————————————----------获取请求行————————————---------");
        //1.获取请求方式 GET/POST
        String method= req.getMethod();
        //2.获取虚拟路径,工程访问路径  /req
        String contextPath = req.getContextPath();
        //3.获取servlet路径  /as
        String servletPath = req.getServletPath();
        //4.获取get方式的请求参数,
        String qs = req.getQueryString();
        //5.获取uri  :contextPath+servletPath  /req/as
        String uri = req.getRequestURI();
        //6.获取url:http://localhost:80/req/as?name=aa
        StringBuffer url = req.getRequestURL();
        //7.获取传输协议名 http
        String protocol = req.getProtocol();
        //8.获取客户端的ip: localhost
        String ip = req.getRemoteAddr();
        System.out.println(method);
        System.out.println(contextPath);
        System.out.println(servletPath);
        System.out.println(qs);
        System.out.println(uri);
        System.out.println(url);
        System.out.println(protocol);
        System.out.println(ip);
        System.out.println("————————————----------获取请求头————————————---------");
        //1.根据头名称获取头值
        String userAgent = req.getHeader("user-agent");
        System.out.println(userAgent);
        String referer = req.getHeader("referer");
        System.out.println(referer);
        //2.获取所有头名称
        Enumeration<String> hnames = req.getHeaderNames();
        while (hnames.hasMoreElements()){
            //循环变量迭代器,取出每一个头名称
            String name = hnames.nextElement();
            //根据头名称获取头值
            String value = req.getHeader(name);
            System.out.println(name+"--"+value);
        }
        System.out.println("————————————----------获取请求体数据————————————---------");
        //ps:get方式无请求体,post方式才有请求体
        //1.从request对象中获取字符流--字符流中包含请求体数据
        BufferedReader br = req.getReader();
        //2.从字符输入流中读取一行数据---请求体数据
        String data = br.readLine();
        System.out.println(data);
    }


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

输出截图:
在这里插入图片描述

2.获取请求参数(重点)

  • 获取单个参数值(getParameter):

根据参数名 获取单个参数值 ,如果是表单 ,参数名就是input的name值。

package com.ysw;

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("/ysw3")
public class HelloServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("注解版,servlet处理get请求!");
        String name = req.getParameter("name");
        String position = req.getParameter("position");
        String route = req.getParameter("route");
        System.out.println(name+"---"+position+"---"+route);
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

浏览器中在url后面输入?name=xxx&position=xxx&route=xxx
例如:
在这里插入图片描述
对应输出:
在这里插入图片描述

  • 获取多个参数名和参数值

System.out.println("——————————————————————————获取多个参数名和参数值—————————————————————-—");
        Enumeration<String> names = req.getParameterNames();
        while (names.hasMoreElements()){
            //获取Enumeration集合中的每一个参数名
            String name1 = names.nextElement();
            //根据参数名 获取多个参数值
            String [] value = req.getParameterValues(name1);
            System.out.println(name1+"--"+ Arrays.toString(value));
        }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

浏览器中url和参数如下:

在这里插入图片描述
对应输出:

在这里插入图片描述

  • 一次性获取所有的参数名和参数值

 System.out.println("——————————————————————————一次性获取所有的参数名和参数值—————————————————————-—");
        Map<String, String[]> parameterMap = req.getParameterMap();
        System.out.println("########################第一种遍历方式####################");
        //把map集合变成set集合,set集合相当于是键值对
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry : entries){
            String key = entry.getKey();
            String[] values = entry.getValue();
            System.out.println(key+":"+Arrays.toString(values));
        }
        System.out.println("########################第二种遍历方式####################");
        Set<String> strings = parameterMap.keySet();
        for (String string : strings) {
            System.out.println(string+"--"+Arrays.toString(parameterMap.get(string)));
        }
        System.out.println("########################第三种遍历方式####################");
        Collection<String[]> values = parameterMap.values();
        for (String[] value : values) {
            System.out.println(Arrays.toString(value));
        }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

对应输出:
在这里插入图片描述

  • 转发

转发的特点:
1.服务器行为
2.只在同一个项目的资源之间进行转发
3.不论转发多少次,只能算是一次请求
4.转发路径,只写servlet路径,不用加上虚拟路径

Servlet0:

@WebServlet("/forward")
public class Servlet0 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入了Servlet0的doGet");
        String name = req.getParameter("name");
        System.out.println(name);
        //1.转发到Servlet的doGet,传入request对象作为forward的实参,说明两个servlet使用的是同一个request对象
        //2.转发是服务器行为,是在同一个项目内部进行转发,因此转发路径只写servlet路径,不用写工程访问路径
        req.getRequestDispatcher("/fw").forward(req,resp);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Servlet1:

@WebServlet("/fw")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入了Servlet1的doGet");
        String name = req.getParameter("name");
        System.out.println(name);
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

浏览器输入:
在这里插入图片描述
对应输出:
在这里插入图片描述
ps:因为Servlet0和Servlet1共用同一个request对象,所有在两个servlet中都可以获取name的参数值

三.Response对象

1.设置状态码 setStatus(int status);
2.设置响应头 setHeader(String name,String value);
3.设置响应体:
字符流响应体:getWriter().write(“字符数据”);–如:文本数据
字节流响应体:getOutputStream().write(); --如;图片,视频,音频

例如:

@WebServlet("/ysw4")
public class HelloServlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("开始重定向,访问一个新网址!");
        //设置状态码,302为重定向
        resp.setStatus(302);
        //设置响应头
        resp.setHeader("location","http://www.baidu.com");
//        //###################简化版本:########################
//        resp.sendRedirect("http://www.baidu.com");
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 响应字符流形式的数据

@WebServlet("/send")
public class ServletOut extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置contentType,避免乱码
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("服务器输出给客户端!");
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 响应字节流形式的数据

//响应字节流形式的数据
        //使用字节输入流把图片读入程序中
        FileInputStream fileInputStream = new FileInputStream("/Users/yushiwen/IdeaProjects/seven_day/src/com/ysw/img/xiamu.jpg");
        //获取字节输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        int i = 0;
        while ((i=fileInputStream.read())!=-1){
            outputStream.write(i);
        }
        fileInputStream.close();
        outputStream.close();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 通过jar包中的类方法对接输入流和输出流

导入jar包:
在这里插入图片描述

 //#############################通过jar包工具########################
        //使用字节输入流把图片读入程序中
        FileInputStream fileInputStream = new FileInputStream("/Users/yushiwen/IdeaProjects/seven_day/src/com/ysw/img/xiamu.jpg");
        //获取字节输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        //通过jar包中的类方法对接输入流和输出流
        IOUtils.copy(fileInputStream,outputStream);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/MrYushiwen/article/details/107553471

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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