@[Toc]
1 Response继承体系
response和request一样
2 Response响应
2.1 响应行
方法名 | 方面类型 | 方法作用 |
setStatus(int sc) | void | 设置响应状态码 |
2.2 响应头
方法名 | 方法类型 | 方法作用 |
setHeader(String name, String value) | void | 设置响应头键值对 |
2.3 响应体
方法名 | 方法类型 | 方法作用 |
getWriter | PrintWriter | 获取字符输出流 |
getOutputStream | ServletOutputStream | 获取字节输出流 |
3 Response 重定向
3.1 什么是重定向
重定向(Redirect):一种资源跳转方式
3.1.1 重定向实现的步骤
- 告诉浏览器,这件事我处理不了:状态码302
- 你去找别人吧,告诉别人的位置 location:xxx
3.1.2 例子
两个核心的方法:
- SetStatus(302 ):用来设置状态码
- SetHeader("location","虚拟路径/资源B的路径"):用来让服务器找下家
package com.you.web.response;
import javax.jws.WebService;
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;
@WebServlet(urlPatterns = "/webResponse01")
public class webResponse01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("webResponse01....");
/*1、设置状态码*/
resp.setStatus(302);
/*2、设置重定向资源目录*/
resp.setHeader("location","/JavaWeb_Demo_05_war/webResponse02");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
package com.you.web.response;
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;
@WebServlet(urlPatterns = "/webResponse02")
public class webResponse02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("webResponse02....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
3.2 重定向简化
基于3.1 重定向需要两个核心方法,但是都是固定的代码,只有资源路径需要更改,所以Java的开发者替我们封装了一个代码只需要传入资源路径即可。
方法名 | 方法类型 | 方法作用 |
sendRedirect(String location) | void | 传入资源路径,完成重定向 |
如下
resp.sendRedirect("/JavaWeb_Demo_05_war/webResponse02");
3.3 重定向的特点
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置(服务器内部、外部均可)
- 两次请求,不能再多个资源适用request共享数据
3.4 资源路径(要不要加虚拟目录)
3.4.1 两种情况
- 浏览器使用:需要加虚拟目录(项目访问路径)
- 服务端使用:不需要加虚拟目录
3.4.2 动态配置虚拟目录
上一章:一文搞懂Request http://t.csdn.cn/8FGMd 提到一个方法可以获取虚拟目录
方法名 | 方法类型 | 方法作用 |
getContextPath | String | 获取虚拟目录(资源的访问路径) |
将WebResponse01 修改成 如下代码
【效果】
简单提一下为什么要动态配置虚拟目录?
因为在项目开放过程中,我们很有可能修改项目的访问路径,这样的话重定向的可维护性非常的差,所以需要配置虚拟目录。
4 Response响应字符数据
4.1 使用
- 通过Response对象获取字符输出流。
PrintWriter writer = resp.getWriter();
- 写数据
wirter.write("aaa")
这个流是不需要关闭的,随着响应结束,response对象销毁,由服务器关闭
4.1.1 实战
写一段如下的代码
@WebServlet("/webResponse03")
public class webResponse03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("aaa");
writer.write("<h1>aaa</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
效果
4.2 设置格式
浏览器默认认为所有的字符串都是文本格式,若是想渲染前端标签,需要设置格式
加上这一句,设置成html格式就可以了
resp.setHeader("content-type","text/html");
效果图:
4.3 解决中文乱码
getWriter的默认编码规则是ISO-8859-1,使用中文字符会乱码。
核心方法:不仅可以设置格式,还可以设置编码
void setContentType(String type)
设置编码需要在获取之前
@WebServlet("/webResponse03")
public class webResponse03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 解决中文乱码 */
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("若风");
writer.write("<h1>aaa</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
5 Response响应字节数据
5.1 使用
- 通过Response对象,获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
- 写数据
outputStream.write(字节数据);
5.2 例子
5.2.1 准备图片
首先找到一张石原里美的图片放到一个地方
5.2.2 代码
package com.you.web.response;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/webResponse04")
public class webResponse04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 1、读取文件 */
FileInputStream fis = new FileInputStream("D:\\Project\\Pro\\JavaWeb-Demo-05\\src\\main\\resources\\static\\1.jpg");
/* 2、获取字节输出流 */
ServletOutputStream os = resp.getOutputStream();
/* 3、完成流的Copy */
byte[] buff = new byte[1024];
int len = 0;
while((len = fis.read(buff))!=-1)
{
os.write(buff);
}
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
5.2.3 效果
可以看到美美的石原里美了!
5.2.4 IOUtils 的使用
IOUtils包含一些工具类,用于处理读,写和拷贝。这些方法基于InputStream, OutputStream, Reader 和 Writer工作。
此处用到了IOUtils 流的Copy
5.2.4.1 导入依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
5.2.4.2 使用IOUtils 代替手写的Copy
@WebServlet("/webResponse04")
public class webResponse04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 1、读取文件 */
FileInputStream fis = new FileInputStream("D:\\Project\\Pro\\JavaWeb-Demo-05\\src\\main\\resources\\static\\1.jpg");
/* 2、获取字节输出流 */
ServletOutputStream os = resp.getOutputStream();
/* 3、完成流的Copy */
IOUtils.copy(fis,os);
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
5.2.4.3 效果图
美美的石原里美还在!