本文是javaweb的第三篇,介绍了Request请求转发与Response响应。
上一篇:JavaWeb《二》Servlet、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);
Request:使用request对象来获取请求数据
Response:使用response对象来设置响应数据
在上一篇中把内容返回到网页上就是一个响应。
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();Response重定向(redirect):一种资源跳转方式。

浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
302的状态码+location的一个访问资源B的路径resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
重定向浏览器地址栏路径会变化,因为进行重定向访问的时候,是浏览器发送两次请求。因此可以使用服务器外部资源。
而上一节的请求转发不会发生地址栏路径变化,其是服务内部操作。
我们可以在浏览器上显示一些字符,也可以显示带html标签的类型。
aaaresponse.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("aaa");
PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("aaa
");
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();
commons-io commons-io 2.6
//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();
☕物有本末,事有终始,知所先后。🍭
🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓