Response
Request与Response对象随着访问请求而创建,随着响应完毕而销毁
Response对象继承体系结构
-
ServletResponse
-- 父接口-
HttpServletResponse
-- 子接口-
org.apache.catalina.connector.Response
-- 孙实现类,(tomcat服务器实现的)
-
-
一、Response对象的功能:设置响应消息
1.设置响应行
响应行的格式:
HTTP/1.1 200 ok
;
- 设置状态码:
response.setStatus(int sc)
2.设置响应头
setHeader(String name, String value)
3.设置响应体【具体步骤,就是IO流的步骤】
- 获取输入流
-
PrintWriter getWriter()
:字符输出流 -
ServletOutputStream getOutputStream()
:字节输出流
-
- 使用输出流,将数据输出到客服端浏览器
- 调用相应的【write】方法
二、重定向
1.两种方式
- 方式1
resp.setStatus(302);
resp.setHeader("location", request.getContextPath() + "/index.jsp");
- 方式2
resp.sendRedirect(request.getContextPath() + "/index.jsp");
2.forward和redirect区别
重定向的特点:redirect
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
- 如果想要获取当前项目需要虚拟路径(request.getContextPath())
转发的特点:forward
request.getRequestDispatcher("/forward").forward(request, response)
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
三、路径
注意: 服务器内部使用跳转【getDispatcher(?).forward(?)】可以不加虚拟路径!【sendRedirect(?)最好加上虚拟路径】
路径分为相对路径和绝对路径
1.相对路径【不推荐使用】:相对路径不可以确定唯一资源
以 . 开头代表当前,以.. 开头代表回退一级别;
注意!需要搞清楚当前资源与目前资源之间的相对位置关系【根据全路径关系找】,如下【不能理解为像前端或者Linux下是进入了/index路径下需要回退一级才能访问同级别的路径!】
@WebServlet("/index")
public class Index extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.sendRedirect(request.getContextPath() + "/redirect");【相对路径,省略项目虚拟路径】
resp.sendRedirect(request.getContextPath() + "/redirect");【绝对路径,推荐写法】
}
}
/*
上面的案例中,端口为80,项目路径为/response!
/index的完整路径是 http://localhost/response/index
/redirect的完整路径是http://localhost/response/redirect
他们的关系是同级别的。
*/
2.绝对路径:【推荐使用】通过绝对路径可以确定唯一资源
绝对路径的写法:
http://localhost/response/redirect
(/response是项目虚拟路径) 可以简写为/response/redirect
,服务器内还可以简写为/redirect
总之,就是以/
开头的路径
使用规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出【forward;sendRedirect和外部的html内的相关标签】
-
给客服端浏览器使用:需要加上虚拟目录(项目的访问路径)
- 【推荐虚拟目录动态获取】:
request.getContextPath()
,【达到解耦合的效果】- 比如html等文件中的,
- 【推荐虚拟目录动态获取】:
-
给服务器使用:不需要加虚拟目录
- 转发路径forward
四、小案例介绍
1.服务器输出字符数据到浏览器
获取字符输入流--输出数据
注意:响应体得先处理乱码问题
-
PrintWriter pw = response.getWriter()
:获取的流的默认编码是ISO-8859-1 - 设置该流的默认编码,【获取流之前设置,并告诉浏览器使用的解码方式】
-
response.setContentType("text/html;charset=utf-8")
;
-
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("我是中文!");
2.服务器输出字节数据到浏览器【不用手动刷新和关闭,服务器会自动刷新等处理】
服务器的字节流和字符流对象在使用完之后,tomcat应该会自动关闭。
- 获取字节输出流--输出数据
resp.setContentType("text/html;charset=utf-8");
ServletOutputStream out = resp.getOutputStream();
out.write(new byte[]{'a','b','c','d'});
3.验证码【以后自己下工具】
- 本质:图片
- 目的:防止恶意表单注册
下面的AWT案例了解即可
@WebServlet("/picture")
public class VerificationImg extends HttpServlet {
private Random random = new Random();
private String str = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width = 100;
int height = 25;
// 1.创建一个对象,在内存中存放一张图片(验证码图片对象)
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写验证码
for (int i = 0; i < 4; i++) {
int index = random.nextInt(str.length());
char ch = str.charAt(index);
// 写验证码
g.drawString(ch +"",width/5 * i + 15, height/2 + 5);
}
// 2.4画干扰线
Color[] color = {Color.BLUE, Color.RED, Color.PINK, Color.cyan, Color.yellow};
for (int i = 0; i < 6; i++) {
g.setColor(color[random.nextInt(color.length)]);
// 随机生成左坐标点
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
// 3.将图片输出到页面展示
ImageIO.write(image,"jpg",resp.getOutputStream());
}
}