🍎道阻且长,行则将至。🍓
本文是javaweb的第三篇,介绍了Request请求转发与Response响应。
上一篇:JavaWeb《二》Servlet、Request请求
下一篇:敬请期待
@Toc
一、Request请求转发🍏
请求转发(forward)是一种在服务器内部的资源跳转方式。例如浏览器发送请求给服务器,服务器中对应的资源A接收到请求,A处理完请求后将请求发给资源B,B处理完后将结果响应给浏览器,这个过程就是请求转发。
- 实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
继续上一篇的,我们创建两个servlet,req1
和req2
,在第一个里面请求转发到第二个;只需要在doGet里面添加request.getRequestDispatcher("/req2").forward(request,response);
- 转发数据
请求转发资源间共享数据:使用Request对象。
request对象提供的三个方法:
1.存储数据到request域[范围,数据是存储在request对象]中void setAttribute(String name,Object o);
2.根据key获取值Object getAttribute(String name);
3.根据key删除该键值对void removeAttribute(String name);
继续上面代码添加:
//req1
request.setAttribute("msg","hello");
//请求转发
request.getRequestDispatcher("/req2").forward(request,response);
//req2
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
二、Response对象🍓
Request:使用request对象来==获取==请求数据
Response:使用response对象来==设置==响应数据
在上一篇中把内容返回到网页上就是一个响应。
1.响应数据
HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体
,对于这三部分内容的数据,respone对象都提供了一些方法来进行设置:
- 响应行
例如一个响应行:HTTP/1.1 200 OK
,第一个是协议和版本,第二个是状态响应码,第三是状态码描述。通常是要设置状态响应码:void setStatus(int sc);
- 响应头
Content-Type: text/html
,响应头是一个键值对,设置:void setHeader(String name,String value);
- 响应体
响应体是通过字符、字节输出流的方式往浏览器写,
获取字符输出流:PrintWriter getWriter();
获取字节输出流:ServletOutputStream getOutputStream();
2.Respones请求重定向
==Response重定向(redirect):一种资源跳转方式。==
浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
- 重定向的实现方式:
给浏览器响应一个302
的状态码+location的一个访问资源B
的路径
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
重定向
浏览器地址栏路径会变化,因为进行重定向访问的时候,是浏览器发送两次请求。因此可以使用服务器外部资源。
而上一节的请求转发
不会发生地址栏路径变化,其是服务内部操作。
3.响应字符数据
我们可以在浏览器上显示一些字符,也可以显示带html标签的类型。
- 返回一个简单的字符串
aaa
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("aaa");
- 返回一串html字符串,并且能被浏览器解析
PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");
4.响应字节数据
- 将字节数据(图片等)写到浏览器,需要两个步骤:
- 通过Response对象获取字节输出流:
ServletOutputStream outputStream = resp.getOutputStream();
- 通过字节输出流写数据:
outputStream.write(字节数据);
实现:
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff))!= -1){
os.write(buff,0,len);
}
fis.close();
- 也可以使用别人提供好的方法来简化代码:
- pom.xml添加依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
- 调用工具类方法
//fis:输入流 os:输出流
IOUtils.copy(fis,os);
实现:
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
IOUtils.copy(fis,os);
fis.close();
快来试一试吧!
☕物有本末,事有终始,知所先后。🍭