Request和Response对象详解

简介: 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); 
目录
相关文章
|
6月前
|
应用服务中间件 数据安全/隐私保护
|
6月前
|
Java 应用服务中间件 API
Request&Response(1)
Request&Response
71 0
|
6月前
|
前端开发 Java 应用服务中间件
Request&Response(4)
Request&Response
45 0
|
6月前
|
Java Maven 数据安全/隐私保护
Request&Response(2)
Request&Response
53 0
|
6月前
|
Java 数据库连接 数据库
Request&Response(5)
Request&Response
55 0
|
7月前
|
Java 数据库连接 数据库
Request 和 Response详解(下)
Request 和 Response详解(下)
94 1
|
7月前
|
存储 缓存 前端开发
Request 和 Response详解(中)
Request 和 Response详解(中)
93 0
|
应用服务中间件
|
存储
Request和Response详解
Request和Response详解
122 0
|
缓存 应用服务中间件 API
Request 和 Response总结
Request 和 Response总结