Request&Response

Request和Response的概述

Request是请求对象,Response是响应对象

Request对象

  • Request:使用request对象来==获取==请求数据

Request继承体系

Request获取请求数据

HTTP请求数据总共分为三部分内容,分别是==请求行、请求头、请求体==

对于这三部分内容,request对象都提供了对应的API方法来获取,具体如下:

  • 获取请求方式: GET

String getMethod()
  • 获取虚拟目录(项目访问路径): /request-demo

String getContextPath()
StringBuffer getRequestURL()
  • 获取URI(统一资源标识符): /request-demo/req1

String getRequestURI()
  • 获取请求参数(GET方式): username=zhangsan&password=123

String getQueryString()

获取请求头数据

对于请求头的数据,格式为key: value,所以根据请求头名称获取对应值的方法为:

String getHeader(String name)

获取请求体数据

浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST

对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:

  • 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法

ServletInputStream getInputStream()

该方法可以获取字节

  • 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法

BufferedReader getReader()

获取请求参数的通用方式

GET方式

String getQueryString()

POST方式

BufferedReader getReader();

通用方法:

  • 获取所有参数Map集合

Map<String,String[]> getParameterMap()
  • 根据名称获取参数值(数组)

String[] getParameterValues(String name)
  • 根据名称获取参数值(单个值)

String getParameter(String name)

idea快速配置servlet

中文乱码问题

GET,POST通用方法

username=new String(username.getBytes(StandardCharsets.ISO_8859_1),(StandardCharsets.UTF_8));

request请求转发

请求转发的实现方式

req.getRequestDispatcher("资源B路径").forward(req,resp);

传递一个数据

需要使用request对象提供的三个方法:

  • 存储数据到request域[范围,数据是存储在request对象]中

void setAttribute(String name,Object o);
  • 根据key获取值

Object getAttribute(String name);
  • 根据key删除该键值对

void removeAttribute(String name);

Response对象

  • Request:使用request对象来==获取==请求数据

Reponse的继承体系和Request的继承体系也非常相似:

Response设置响应数据功能介绍

  1. 响应行

对于响应行,比较常用的就是设置响应状态码

void setStatus(int sc);
  1. 响应头

设置响应头键值对

void setHeader(String name,String value);
  1. 响应体

对于响应体,是通过字符、字节输出流的方式往浏览器写,

获取字符输出流:

PrintWriter getWriter();

获取字节输出流

ServletOutputStream getOutputStream();

Respones请求重定向

1.Response重定向(redirect):一种资源跳转方式。

(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求

(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径

(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B

(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫==重定向==

2.重定向的实现方式:

resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");

简化方式:

resposne.sendRedirect("/资源B的访问路径")

路径问题:什么时候加虚拟路径,什么时候不加

  • 浏览器使用:需要加虚拟目录(项目访问路径)

  • 服务端使用:不需要加虚拟目录

Response响应字符数据

1.返回一个简单字符串

  • 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();

  • 通过字符输出流写数据: writer.write("aaa");

2.返回一串html字符串,并且能被浏览器解析

PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");

==注意:==一次请求响应结束后,response对象就会被销毁掉,所以不要手动关闭流。

3.返回一个中文的字符串你好,需要注意设置响应数据的编码为utf-8

//设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
writer.write("你好");

Response响应字节数据

  • 通过Response对象获取字节输出流:ServletOutputStream outputStream = resp.getOutputStream();

  • 通过字节输出流写数据: outpu tStream.write(字节数据);

流的copy的代码还是比较复杂的,所以我们可以使用别人提供好的方法来简化代码的开发

(1)pom.xml添加依赖

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

(2)调用工具类方法

//fis:输入流
//os:输出流
IOUtils.copy(fis,os);

SqlSessionFactory工具类抽取

在写Servlet的时候,因为需要使用Mybatis来完成数据库的操作,所以对于Mybatis的基础操作就出现了些重复代码,如下

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new 
    SqlSessionFactoryBuilder().build(inputStream);

可以编写一个工具类

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

工具类抽取后,可以直接使用

工具类抽取以后,以后在对Mybatis的SqlSession进行操作的时候,就可以直接使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值