Request和Response的概述
Request是请求对象,Response是响应对象
Request对象
Request:使用request对象来==获取==请求数据
Request继承体系
![](https://i-blog.csdnimg.cn/blog_migrate/bec361efd6d2376e9899b780fd951ba4.png)
Request获取请求数据
HTTP请求数据总共分为三部分内容,分别是==请求行、请求头、请求体==
![](https://i-blog.csdnimg.cn/blog_migrate/54c21983a619d89ba01a4cdf473583a2.png)
对于这三部分内容,request对象都提供了对应的API方法来获取,具体如下:
获取请求方式: GET
String getMethod()
获取虚拟目录(项目访问路径): /request-demo
String getContextPath()
获取URL(统一资源定位符): http://localhost:8080/request-demo/req1
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
![](https://i-blog.csdnimg.cn/blog_migrate/873370d2390c44e5d206fa742908bb10.png)
中文乱码问题
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的继承体系也非常相似:
![](https://i-blog.csdnimg.cn/blog_migrate/89ff5bf3e883abecd0fe8c425863b928.png)
Response设置响应数据功能介绍
响应行
![](https://i-blog.csdnimg.cn/blog_migrate/da2c6a3d4c0da25dd5a5c0e3edb77199.png)
对于响应行,比较常用的就是设置响应状态码
void setStatus(int sc);
响应头
![](https://i-blog.csdnimg.cn/blog_migrate/ef0e30e1eee2983726f1aa5a83e84308.png)
设置响应头键值对
void setHeader(String name,String value);
响应体
![](https://i-blog.csdnimg.cn/blog_migrate/b680c0dd8d5a0c2cbb7f41fea20b216c.png)
对于响应体,是通过字符、字节输出流的方式往浏览器写,
获取字符输出流:
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进行操作的时候,就可以直接使用