Java web response对象

1. HTTP协议:响应消息

1.1 请求消息:客户端发送给服务器端的数据

数据格式:

  • 请求行
  • 请求头
  • 请求空行
  • 请求体

1.2 响应消息:服务器端发送给客户端的数据

数据格式:

1.2.1 响应行

a. 组成:协议/版本 响应状态码 状态码描述

b. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

状态码都是3位数字

分类:

1xx:服务器接收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码

2xx:成功。代表:200

3xx:重定向。代表:302(重定向),304(访问缓存)

image-20191108204502742

image-20191108204340232

4xx:客户端错误。

  • 404(请求路径没有对应的资源)
  • 405:请求方式没有对应的doXxx方法

5xx:服务器端错误。代表:500(服务器内部出现异常)

image-20191108204902272

1.2.2 响应头

格式:头名称: 值

常见的响应头:

Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式

Content-disposition:服务器告诉客户端以什么格式打开响应体数据

  • 值:
  • in-line:默认值,在当前页面内打开
  • attachment;filename=xxx:以附件形式打开响应体。文件下载

1.2.3 响应空行

1.2.4 响应体

传输的数据

1.2.5 响应字符串格式

1
2
3
4
5
6
7
8
9
10
11
12
13
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT

<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>

2.Response对象

功能:设置响应消息

2.1设置响应行

格式:HTTP/1.1 200 ok

设置状态码:setStatus(int sc)

2.2设置响应头

setHeader(String name, String value)

2.3 设置响应体

使用步骤:

1.获取输出流

  • 字符输出流:PrintWriter getWriter()

  • 字节输出流:ServletOutputStream getOutputStream()

2.使用输出流

将数据输出到客户端浏览器

2.4案例

1.完成重定向

重定向:资源跳转的方式

image-20191116150432958

代码实现:

1
2
3
4
5
6
7
8
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");


//简单的重定向方法,方法2
response.sendRedirect("/day15/responseDemo2");

2.重定向的特点:redirect

地址栏发生变化

重定向可以访问其他站点(服务器)的资源

重定向是两次请求。不能使用request对象来共享数据

3.转发的特点:forward

转发地址栏路径不变

转发只能访问当前服务器下的资源

转发是一次请求,可以使用request对象来共享数据

forward 和 redirect 区别

3.路径写法

3.1路径分类

1.相对路径:通过相对路径不可以确定唯一资源

1
如:./index.html

不以/开头,以.开头路径

规则:找到当前资源和目标资源之间的相对位置关系

1
2
./:当前目录
../:后退一级目录

2.绝对路径:通过绝对路径可以确定唯一资源

1
如:http://localhost/day15/responseDemo2		/day15/responseDemo2

以/开头的路径

3.规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出

  • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径),重定向也需要
1
2
3
建议虚拟目录动态获取:String contextPath = request.getContextPath() // 等于/day15

<a href="/day15/responseDemo2"> , <form>
  • 给服务器使用:不需要加虚拟目录
1
2
转发路径
request.getRequestDispatcher("/responseDemo2").forward(request,response);

4.服务器输出字符数据到浏览器

步骤:

1. 获取字符输出流
2. 输出数据
1
2
PrintWriter pw = response.getWriter();
pw.write("<h1>hello</h1>") //可以输出html

乱码问题:

  1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1

  2. 设置该流的默认编码

  3. 告诉浏览器响应体使用的编码

    //1.设置编码,是在获取流之前设置
    response.setCharacterEncoding(“utf-8”);

    //2.告诉浏览器,服务器发送的消息体数据的编码,建议使用该编码解码,text/html是mime类型
    response.setHeader(“content-type”,”text/html;charset=utf-8”);

    //3.简单的形式
    response.setContentType(“text/html;charset=utf-8”)

    5.服务器输出字节数据到浏览器

  4. 获取字节输出流

  5. 输出数据
1
2
3
4
response.setContentType("text/html;charset=utf-8") // 设置response编码
ServletOutputStream sos = response.getOutputStream();

sos.write("hello".getBytes(“utf-8"));

6.验证码

本质:图片
目的:防止恶意表单注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


int width = 100;
int height = 50;

//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);

String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
//生成随机角标
Random ran = new Random();

for (int i = 1; i <= 4; i++) {
int index = ran.nextInt(str.length());
//获取字符
char ch = str.charAt(index);//随机字符
//2.3写验证码
g.drawString(ch+"",width/5*i,height/2);
}


//2.4画干扰线
g.setColor(Color.GREEN);

//随机生成坐标点

for (int i = 0; i < 10; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);

int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}


//3.将图片输出到页面展示
ImageIO.write(image,"jpg",response.getOutputStream());


}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}

编写HTML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>

<script>
/*
分析:
点击超链接或者图片,需要换一张
1.给超链接和图片绑定单击事件

2.重新设置图片的src属性值

*/
window.onload = function(){
//1.获取图片对象
var img = document.getElementById("checkCode");
//2.绑定单击事件
img.onclick = function(){
//加时间戳
var date = new Date().getTime();

img.src = "/day15/checkCodeServlet?"+date;
}

}

</script>

</head>
<body>


<img id="checkCode" src="/day15/checkCodeServlet" />

<a id="change" href="">看不清换一张?</a>

</body>
</html>
0%