IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Request(请求)&Response(响应) -> 正文阅读

[Java知识库]Request(请求)&Response(响应)

Request&Response


在这里插入图片描述

Request(请求)

Request继承体系

在这里插入图片描述

注:

1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。

2.使用request对象,查阅javaEE API文档的 HttpServletRequest接口

Request获取请求数据(核心功能)

获取请求数据

1.请求行:

GET /request-demo/req1?username=zhangsan HTTP/2
  • String getMethod():获取请求方式:GET
  • Strintg getContextPath():获取虚拟目录(项目访问路径):/request-demo
  • StringBuffer get RequestURL():获取URL(统一资源定位符):http://local:8080/request-demo/req1
  • String get RequestURI():获取URL(统一资源标识符):/request-demo/req1
  • String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123

2.请求头

User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
  • String getHeader(String name):根据请求头名称获取值

3.请求体

POST请求才有请求体

  • ServletinputStream getinputStream();获取字节输入流
  • BufferedReader getReader():获取字符输入流

通用方式获取请求参数

  • GET:

    String getQueryString()
    
  • POST

    BufferedReader getReader()
    

思考:

get请求方式与post请求方式区别在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet与doPost方法内的代码?

Request通用方式获取请求参数

  • Map<String,String[]> getParameterMap():获取所有参数map集合
  • String[] getParameterValues(String name):根据名称获取参数值(数组)
  • String getParameter(String name):根据名称获取参数值(单个)
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;
import java.util.Map;

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get.....");

        //1.获取所有的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            //username;zhangsan
            System.out.print(key+":");

            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value+" ");
            }
            System.out.println();
        }
        //根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //根据key获取单个参数值
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username );
        System.out.println(password );

    }


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

Request请求转发

  • forward:请求转发,一种在服务器内部的资源跳转方式

在这里插入图片描述

  • 实现方式:

    req.getRequestDispatcher("资源B路径").forward(req,resp);
    
  • 请求转发资源间共享数据:使用Request对象

    void setAttribute(String name,Object o):存储数据到request域中
    Object getAttribute(String name):	根据key,获取值
    void removeAttribute(String name):	根据key删除键值对
    
  • 例:

/**
 * 请求转发
 */

@WebServlet("/req5")
public class requestDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo5...");

        //存储数据
        request.setAttribute("ityc","yc");
        
        //删除数据
        request.removeAttribute("ityc");
        
        //请求转发
        request.getRequestDispatcher("/req6").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

@WebServlet("/req6")
public class requestDemo06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo6...");
        //获取数据
        Object ityc = request.getAttribute("ityc");
        System.out.println(ityc);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

结果:

在这里插入图片描述

  • 请求转发特点:
    • 浏览器地址栏不发生改变
    • 只能转发到当前服务器
    • 一次请求可以在转发的资源间使用request共享数据

Response(响应)

在这里插入图片描述

一:Response设置响应数据功能介绍

  • 响应数据分为3部分:

    1. 响应行:

      HTTP/2 200 OK
      
      void setStatus(int sc):设置响应状态码
      
    2. 响应头

      content-type: text/html
      
      void SetHeader(String name,String value):设置响应头键值对
      
    3. 响应体

      <html><head></head><body></body></html>
      
      PrintWriter getWriter():获取字符输出流
      ServletOutputStream getOutputStream():获取字节输出流
      

二:Response完成重定向

  • 重定向(Redirect):一种资源跳转方式

在这里插入图片描述

  • 实现方式:

    resp.setStatus(302);
    resp.setHeader("location","资源B的路径");
    
  • 联系

    @WebServlet("/resp1")
    public class ResponseDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("resp1.....");
            //重定向
            //1.设置响应状态码302
            //response.setStatus(302);
    
            //2.设置响应头location
            //response.setHeader("location","/Request-Tomcat/resp2");
    
            //简化方式完成重定向
            response.sendRedirect("/Request-Tomcat/resp2");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    @WebServlet("/resp2")
    public class ResponseDemo2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("sesp2....");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
  • 重定向特点:

    • 浏览器地址栏路径发生变化。
    • 可以重定向到任意位置。服务器内部,外部均可。
    • 两次请求,不能在多个资源使用request共享数据。

三:Response响应字符数据

  • 使用:

    1.通过Response对象获取字符输出流
    PrintWriter writer = response.getWriter();
    
    2.写数据:
      writer.write("aaa");
      writer.write("<h1>啊啊啊<h2>");//还可以写标签
    
    
    3.写标签时要设置对应的ContentType
      response.setContentType("text/html;charset=UTF-8");
    
  • 注意:

    1. 该流不需要关闭,随着响应的结束,response对象销毁,由服务器关闭

    2. 中文乱码问题,原因通过Response获取的字符输出流默认编码是:.ISO-8859-1

      resp.setContentType("text/html;charset=utf-8")
      

四:Rsponse响应字节数据

  • 使用:

    1.通过Response对象获取字符输出流
    ServletOutputStream outputStream = resp.getOutputStream();
    2.写数据
    outputStream.write(字节数据);
    
  • 例:将一张图片通过流,响应至浏览器

  • /*
    * 响应字节数据:设置字节数据的响应体
    * */
    @WebServlet("/resp4")
    public class ResponseDemo4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //1.读取文件
            FileInputStream fileInputStream = new FileInputStream("D://a.jpg");
          //2.获取response字节输出流
            ServletOutputStream outputStream = response.getOutputStream();
          //3.完成流的copy
            /*byte[] bytes = new byte[1024];
            int len = 0;
            while((len =fileInputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
            }*/
    		//简化书写版
            IOUtils.copy(fileInputStream,outputStream);
            fileInputStream.close();
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-18 23:18:09  更:2022-06-18 23:19:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 10:42:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码