Response介绍
功能:设置响应消息
1.设置相应行
1.格式:HTTP/1.1 200 OK
2.设置状态码:setStatus(int sc)
2.设置响应头:setHeader(String name,String value)
3.设置响应体:
使用步骤
1.获取输入流
*字符输出流:PrintWriter getWriter()
*字节输出流:ServletOutputStream getOutputStream()
2.使用输出流,将数据输出到浏览器端
response案例
1.完成重定向
重定向:资源跳转的方式
方法一:
//目标:重定向访问demo02
//1设置状态码为302
System.out.println("我访问了demo01");
resp.setStatus(302);
resp.setHeader("location","/demo02");
方法二:
resp.sendRedirect("/demo02");
重定向的特点
1.转发地址栏发生变化
2.重定向唯一访问其他资源
3.重定向请求多次,不可以使用request共享数据
装发的特点
1.转发地址栏路径不变
2.转发只能访问当前路径的资源
3.转发是请求一次,可以使用request共享数据
路径的写法:
1.相对路径:通过相对路径不可以确定唯一资源
*如:./index.xml
*不已/开头,以.路径。./可以省略
*./表示当前目录
*../表示的是上一级目录
*规则:确认访问当前资源和目标资源的相对位置关系
2.绝对路径:通过绝对路径可以确定唯一资源
*如:http://localhost/Respone/demo01
*以/开头的路径
*规则:判断定义的路径是给谁用的
*给客户端用的:需要加虚拟目录
*给服务器使用的:不需要加虚拟目录
*建议动态获取虚拟目录String contextPAth=req.getContextPath();
2.服务器输出字符数据到浏览器
步骤:
1.获取字符输出流
2.输出数据
3.中文乱码现象解决方式
//告诉浏览器,服务器发送信息体的编码,建议那边的解码格式
resp.setHeader("content-type","text/html;character=utf-8");
用下面的精简的
resp.setContentType("text/html;character=utf-8");
3.服务器输出字节数据到浏览器
步骤:
1.获取字符输出流
2.输出数据
resp.setContentType("text/html;character=utf-8");
ServletOutputStream sos=resp.getOutputStream();
sos.write("hello".getBytes());
sos.write("你好".getBytes());
4.验证码生产与显示
示例代码:
生成验证码代码
package com.servelt.learm.demo;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet(urlPatterns = "/demo05checkcode")
public class demo05checkcode extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建一个对象,在内存中代表验证码图片
int width=100;
int height=50;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图片
//2.1填充背景色
Graphics g=image.getGraphics();//获取画笔对象
g.setColor(Color.pink);
g.fillRect(0,0,width,height);
//2.2话边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
//2.3写验证码
String str="ABCDEFGHIJKLMNOPQRSTUWXYZabcdefghijklmnopqrstuvwxyz123456789";//取值范围
//生成随机角标
Random ran=new Random();
for(int i=1;i<=4;i++){
int index=ran.nextInt(str.length());
char ch=str.charAt(index);//随机字符
g.drawString(ch+"",width/5*i,height/2);
}
//2.4画干扰线
for (int i=0;i<10;i++)
{
g.setColor(Color.green);
int x=ran.nextInt(width);
int x2=ran.nextInt(width);
int y1=ran.nextInt(width);
int y2=ran.nextInt(width);
g.drawLine(x,y1,x2,y2);
}
//3.输出图片
ImageIO.write(image,"jpg",resp.getOutputStream());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
html显示验证码及点击跟新代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
/*
分析:
1.点击超链接或图片,换一张
2.重新设置图片的src值
*/
</script>
</head>
<body>
<img src="/demo05checkcode" id="checkimg">
<a href="javascript:void(0)" id="change">看不清?换一种。</a>
<script>
var img=document.getElementById("checkimg");
img.onclick=function () {
//加时间戳,欺骗缓存
var date=new Date().getTime();
img.src="/demo05checkcode?"+date;
}
var changed=document.getElementById("change")
changed.onclick=function () {
//加时间戳,欺骗缓存
var date=new Date().getTime();
img.src="/demo05checkcode?"+date;
}
</script>
</body>
</html>
结果演示: