本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。
简述:
response对象用来设置响应消息。
- 设置响应行(
格式:HTTP/1.1 200 ok
)
-
setStatus(int sc):
用来设置状态码。
-
setHeader(String name, String value):
设置响应头。 - 设置响应体:
- 使用步骤:
- 字符输出流:
PrintWriter getWriter()
- 字节输出流:
ServletOutputream getOutputStream()
- 使用输出流,将数据输出到客户端浏览器。
案例:
将字符输出到浏览器
// 设置响应体编码的两种方法,第一种了解即可,第二种是我们使用的
// 方法一:第一步,在获得流对象之前,设置流的编码方式, 默认编码:ISO-8859-1
resp.setCharacterEncoding("utf-8");
// 方法一:第二步,通知浏览器服务器发送的消息数据的编码,建议浏览器使用该编码解码
resp.setHeader("content-type", "text/html;charset=utf-8");
// 方法二:我们使用该方法
resp.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = resp.getWriter();
printWriter.write("字符流输出");
将字节输出到浏览器
resp.setContentType("text/html;charset=utf-8");
OutputStream outputStream = resp.getOutputStream();
outputStream.write("字节流输入".getBytes("utf-8"));
实现重定向的两种代码实现:
// 方法一:
// 设置状态码为302
response.setStatus(302);
// 设置响应头location
response.setHeader("location","/虚拟目录+/servlet访问路径");
// 方法二:对方法一的封装,因为重定向的状态码就是302,没有必要自己手动设置,设置响应头location也是固定的,我们只需要写重定向的路径即可。
response.sendRedirect("/虚拟目录+/servlet访问路径");
通过前面的学习,我们在这里总结下forward和redirect的区别和优缺点。
重定向(redirect)的特点:
- 地址栏发生变化。
- 重定向可以访问其他站点(服务器)的资源。
- 重定向是两次请求,不能使用request对象来共享数据。
转发(forward) 的特点:
- 转发地址栏路径不变。
- 转发只能访问当前服务器下的资源。
- 转发是一次请求,可以使用request对象来共享数据。
注意: 这里我们会发现一个问题,那就是当我们重定向时,我们的路径的写法是虚拟目录 + Servlet的访问路径
,而我们请求转发只写Servlet访问路径
即可,我们可以通过判断路径给谁使用来解决这个问题。
- 当我们路径给客户端浏览器使用时,我们需要加虚拟目录(建议:
request.getContextPath()
来动态获取虚拟目录),例如:<a>、<form>、重定向等等都需要加虚拟目录。 - 当我们路径给服务器使用时,就可以不用加虚拟目录,例如请求转发,因为请求转发是在服务器内部进行的,请求转发的过程大体是:当一个servlet接收到了一个请求,这个servlet处理完这个请求后需要另一个servlet接着进行处理,此时就需要将处理了一半的servlet、response发送到第二个servlet接着处理的过程。
案例:生成图形验证码(了解即可)
int width = 80;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 得到画笔对象
Graphics graphics = image.getGraphics();
// 设置画笔颜色
graphics.setColor(Color.cyan);
// 填充背景色
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.DARK_GRAY);
graphics.drawRect(0, 0, width - 1, height - 1);
graphics.setColor(Color.magenta);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
Random random = new Random();
for (int i = 1;i <= 4;i++) {
int index = random.nextInt(str.length());
graphics.drawString(str.charAt(index) + "", i * 15, height/2);
}
// 生成干扰线
graphics.setColor(Color.gray);
for (int i = 1;i <= 6;i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
}
// 将生成的图片输出到页面
ImageIO.write(image, "jpg", resp.getOutputStream());