文章目录
-
- 1.HTTP协议概述
- 2.Response对象功能
- 3.重定向的案例
- 4.服务器输出字符数据到浏览器
- 5.输出字符数据导致中文乱码的解决方法
- 6.服务器输出字节数据到浏览器
- 7.验证码的制作与切换
1.HTTP协议概述
1.响应消息:
1.响应行
组成:协议/版本 响应状态码 状态码状态
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
1.状态码都是三位数字
2.HTTP响应状态码分类:
1.1xx
:服务器接收客户端消息,但没有接收完成,等待一段时间后发送1xx码
2.2xx
:成功。代表:200
3.3xx
:重定向。代表:304(重定向),304(访问缓存)
4.4xx
:客户端错误。
代表:404(请求路径没有对应的资源)
代表:405(请求方式没有对应的doXxx()方法)
5.5xx
:服务器端错误。
代表:500(服务器内部出现异常)
2.响应头
1.Content-Type :服务器告诉客户端本次响应体数据格式以及编码格式
2.Content-disposition:服务器告诉客户端以什么格式打开响应体数据
in-line:默认值,在当前页面打开
attachment;filename =xx:以附件的形式打开响应体。
3.响应空行
4.响应体
2.Response对象功能
功能:设置响应消息
1.设置响应头
格式:HTTP/1.1 200 ok
设置状态码:setStatus(int sec)
2.设置响应行:setHeader(String name,String value)
3.设置响应体:
获取字符输出流:PrintWriter getWriter ()
获取字节输出流:ServletOutputStream getOutputStream()
使用输出流将数据输出到客户端浏览器
3.重定向的案例
1.重定向:完成资源的跳转
2.代码实现:
重定向的方法:
response.setStatus(302);
response.setHeader("location","/18-Http-Response/ResponseDemo2");
简单的重定向的方法:
response.sendRedirect("/18-Http-Response/ResponseDemo2");
3.重定向的特点:
1.地址栏发生变化
2.重定向可以访问其他站点(服务器)的资源
3.重定向是两次请求
4.转发的特点:
1.转发地址栏路径不变
2.转发只能访问当前服务器下的资源
3.转发只是一次请求
5.路径分类:
1.相对路径:通过相对路径不可以确定唯一资源
以./
开头,代表当前目录
以../
开头,代表后退一级目录,当前目录的父目录的父目录
规则:找到当前资源和目标l资源之间的相对位置关系
2.绝对路径:通过绝对路径可以获得唯一资源
以/
开头
规则:判断定义的路径是给谁用的?判断请求将来从哪发出
给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
建议虚拟目录动态获取:Request.getContextpath()
给服务器使用:不需要加虚拟目录(服务器内部的转发)
package servlet;
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("/ResponseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1......");
// //访问ResponseDemo1会自动跳转到ResponseDemo2的资源
// //设置状态码为302
// response.setStatus(302);
// //设置响应头的location
// response.setHeader("location","/18-Http-Response/ResponseDemo2");
//简单的重定向的方法
//这个方法的原理和上面的相同
response.sendRedirect("/18-Http-Response/ResponseDemo2");
//因为虚拟目录有时可能会改变,所以最好动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/ResponseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
package servlet;
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("/ResponseDemo2")
public class ResponseDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2........");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4.服务器输出字符数据到浏览器
步骤:
获取字符输出流:PrintWriter pw = response.getWriter();
输出数据:pw.write("hello");
package servlet;
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;
import java.io.PrintWriter;
@WebServlet("/ResponseDemo3")
public class ResponseDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取字符输出流
PrintWriter pw = response.getWriter();
//输出数据
pw.write("hello");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
5.输出字符数据导致中文乱码的解决方法
获取流之前设置流的编码:
response.setCharacterEncoding("utf-8");
告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码:
response.setHeader("content-type","text/html;charset=utf-8");
最终的简单的形式,设置编码:
response.setContentType("text/html;charset=utf-8");
package servlet;
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;
import java.io.PrintWriter;
@WebServlet("/ResponseDemo4")
public class ResponseDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取流之前设置流的编码,流的默认编码为:ISO-8859-1设置为:GBK
//response.setCharacterEncoding("utf-8");
//告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码
//response.setHeader("content-type","text/html;charset=utf-8");
//简单的形式,设置编码
response.setContentType("text/html;charset=utf-8");
//获取字符输出流
PrintWriter pw = response.getWriter();
//输出数据
pw.write("你好 response");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
6.服务器输出字节数据到浏览器
获取字节输出流:
ServletOutputStream outputStream = response.getOutputStream();
输出数据:
outputStream.write("hello".getBytes());
package servlet;
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.IOException;
import java.io.PrintWriter;
@WebServlet("/ResponseDemo5")
public class ResponseDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取字节输出流
ServletOutputStream outputStream = response.getOutputStream();
//2.输出数据
outputStream.write("hello".getBytes());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
7.验证码的制作与切换
验证码的制作:
package servlet;
import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/CheckCodeServlet")
public class CheckCodeSevlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
//创建一个对象,在内存中代表图片
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//美化图片
//填充背景色
Graphics g = image.getGraphics();//画笔对象
//设置画笔的颜色
g.setColor(Color.pink);
g.fillRect(0,0,width,height);
//画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
String str ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
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,25);
}
//画干扰线
for(int i=0;i<5;i++){
//随机生成四个点
int x1 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int x2 = ran.nextInt(width);
int y2 = ran.nextInt(height);
g.setColor(Color.GREEN);
g.drawLine(x1,y1,x2,y2);
}
//将图片输出到页面
ImageIO.write(image,"jpg",response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
验证码的切换:
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
/*
点击超链接或者图片,需要换一张
1.给超链接或者图片绑定单击事件
2.重新设置图片的src属性值
*/
onload=function(){
//获取图片对象
var img = document.getElementById("checkCode");
//绑定单击事件
img.onclick=function () {
//加时间戳(为了保证验证码能够随机出现)
var date = new Date().getTime();
img.src = "/18-Http-Response/CheckCodeServlet?"+date;
}
}
</script>
</head>
<body>
<img id="checkCode" src="/18-Http-Response/CheckCodeServlet">
<a id="change" href="">看不清换一张</a>
</body>
</html>