Request和Response对象详解

一.初识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请求!");
    }

第一个参数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);
    }

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

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);
    }

}

浏览器中在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));
        }

浏览器中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.转发路径,只写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);
    }
}

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);
    }
}

浏览器输入:
在这里插入图片描述
对应输出:
在这里插入图片描述
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");
    }
}

  • 响应字符流形式的数据

@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("服务器输出给客户端!");
    }
}

  • 响应字节流形式的数据

//响应字节流形式的数据
        //使用字节输入流把图片读入程序中
        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();
  • 通过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);
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MrYuShiwen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值