JavaWeb 之 response对象详解(四)
目录
Response对象
响应信息的封装对象,封装了HTTP响应(行、头、体)
一.操作响应行
响应状态码。
- setStatus(int status); 设置发送给客户端的状态码
若未设置状态码,且服务器运行正常,Web服务器会默认产生一个状态码为200的状态行。
- sendError(int sc,String errorMsg); 设置错误状态码及提示信息
建议该方法仅发送4xx和5xx状态码。
代码:
/**
* 操作响应行
* @return
*/
public String run2() throws IOException {
//1、设置状态码
HttpServletResponse r = getResponse();
// r.setStatus(500);
//2、设置错误状态码及提示信息
r.sendError(404,"你找错了,呵呵");
return null;
}
二.操作响应头
Key:value
方法声明 |
功能描述 |
void addHeader(String name, String value) |
这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段 |
void setHeader(String name, String value) |
|
void setCharacterEncoding(String charset) |
该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。 设置响应体码表:”utf-8” (后面响应体中详解) |
void setContentType(String type) |
该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8 (后面响应体中详解) |
void addIntHeader(String name, int value) |
这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦 |
void setIntHeader(String name, int value) |
|
void setContentLength(int len) |
该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值 无需手动设置,由服务器自行设置 |
代码:
/**
* 操作响应头
* @return
*/
public String run3() {
//1、设置响应头
HttpServletResponse r = getResponse();
r.setHeader("k1","v1");
r.setHeader("k1","v2");
//2、追加响应头
r.addHeader("k2","v1");
r.addHeader("k2","v2");
return null;
}
三.请求重定向
1.请求重定向原理
response对象.setStatus(302);
response对象.setHeader(“location”,”http://www.baidu.com”);
2.请求重定向的开发写法
格式:
- 外网:return “redirect:http://网址”
- 内部:return “redirect:/资源路径?参数”;
/**
* 请求重定向:
* run4重定向到run5
*/
public String run5(){
System.out.println("run5");
return null;
}
public String run4(){
System.out.println("run4");
// return "redirect:http://www.czxy.com";
return "redirect:/d1?method=run5";
}
3.请求转发和请求重定向 区别
1. 请求转发使用request对象,重定向使用response对象
2. 请求转发使用服务器端路径,重定向使用客户端路径
3. 请求转发不能跳转外网,重定向可以
4. 请求转发是服务器内部的跳转,不依赖网速,跳转速度极快。
重定向是依赖浏览器的跳转,严重依赖网速,跳转速度略慢
5. 请求转发:请求转发N次,请求和响应仅一次。 占用资源少
重定向:重定向N次,响应n+1次。占用大量资源
6. 请求转发可以访问受保护目录资源,重定向不能
7.请求转发不会改变地址栏路径,重定向会改变路径。
安全:请求转发。会隐藏后面转发程序的访问路径。
程序BUG:由于请求转发不会更改地址,会导致用户重复访问某个Servlet程序。改为重定向
8、 请求转发可以使用request作用域,重定向不能
重定向:
- 跳转外网
- 改变地址栏路径
请求转发:
其他所有情况 (尤其是需要使用request作用域进行数据传递)
4.延迟重定向(扩展)
X秒后重定向到?路径
response对象.setHeader(“refresh”,”x;http://网址”);
response对象.setHeader(“refresh”,”x;/项目名/路径”);
getResponse().setHeader("refresh","5;/javaweb_day05_1/index.jsp");
四.操作响应体
浏览器看到的任何信息 (响应体)
- 字符流:适用于向响应体中写出 纯文本,前端代码 (JSP)
- 字节流:适用于 文件下载
/**
* 操作响应体
* @return
*/
public String run7() throws IOException {
//1、字符流
// PrintWriter w = getResponse().getWriter();
// w.write("你好");
// w.write("<h1>还好</h1>");
// w.write("<script>alert('还不错');</script>");
//2、字节流
// ServletOutputStream sos = getResponse().getOutputStream();
// sos.write("你好".getBytes("utf-8"));
return null;
}
注意事项:
1、流无需手动close().tomcat会帮忙管理
2、操作响应体时,不建议进行请求转发或重定向
3、某一个servlet只能执行一个流(字节流/字符流)【一山难容二虎】
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
注: 如果本篇有需要改进的地方或错误,欢迎大神们指定一二~~
上一篇: idea新手第一个Servlet程序