response
HTTP响应消息
1. 响应行
组成:协议/版本 响应状态码 状态码描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
状态码都是3位数字
分类:
1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2xx:成功。代表:200
3xx:重定向。代表:302(重定向),304(访问缓存)
4xx:客户端错误。
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法
5xx:服务器端错误。代表:500(服务器内部出现异常)
2. 响应头:
格式:头名称: 值
常见的响应头:
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
值:
in-line:默认值,在当前页面内打开
attachment;filename=xxx:以附件形式打开响应体。文件下载
3. 响应空行
4. 响应体:传输的数据
一个完整的响应字符串:
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>
设置状态码:setStatus(int sc)
设置响应头:setHeader(String name, String value)
设置响应体:
// 解决乱码
response.setContentType("text/html;charset=utf-8");
1. 获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
//ResponseDemo1
package cn.figo.web.response;
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("ResponseDemo1 1111111111");
request.setAttribute("msg","hello");
// 重定向
//response.setStatus(302);
//response.setHeader("location","/servlet_learn/ResponseDemo2");
//简单重定向
//response.sendRedirect("/servlet_learn/ResponseDemo2");
//重定向可以重定向到其他站点
//response.sendRedirect("https://www.baidu.com/");
//这个是绝对路径,实际路径为http://localhost:8080/ResponseDemo2,
// 但是ResponseDemo2的真实路径为 http://localhost:8080/servlet_learn/ResponseDemo2
//response.sendRedirect("/ResponseDemo2"); //访问失败
// 可以使用相对路径
//response.sendRedirect("./ResponseDemo2");
// 请求转发 可以使用 request域共享数据
request.getRequestDispatcher("/ResponseDemo2").forward(request,response);
// 转发就不需要加虚拟目录,给服务器用不需要加虚拟路径,给浏览器用需要加虚拟目录,
// 因为重定向浏览器地址栏要变,因此必须加虚拟目录
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
// /ResponseDemo2
package cn.figo.web.response;
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("/ResponseDemo2")
public class ResponseDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ResponseDemo2 2222222222");
//重定向是两次请求。不能使用request对象来共享数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
//再请求转发回ResponseDemo1,会造成死循环,浏览器提示重定向次数过多
//request.getRequestDispatcher("/ResponseDemo1").forward(request,response);
// 服务器输出字节数据到浏览器
//简单的形式,设置编码
response.setContentType("text/html;charset=utf-8");
//1.获取字符输出流
//PrintWriter pw = response.getWriter();
//2.输出数据
//pw.write("<h1>hello response</h1>");
//pw.write("你好啊啊啊 response");
//1.获取字节输出流
ServletOutputStream sos = response.getOutputStream();
//2.输出数据
sos.write("你好".getBytes("utf-8"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
![9870dce76c070122d72a4c76441006e0.png](https://i-blog.csdnimg.cn/blog_migrate/ede9c1365167eaee5db013240cea08f4.jpeg)
![7e754a2a9c9bcfe84d019780d850adb8.png](https://i-blog.csdnimg.cn/blog_migrate/e9e8aa99fc5fe93c978274dc6235c828.jpeg)
ResponseDemo1 1111111111
ResponseDemo2 2222222222
hello
ServletContext对象:代表整个web应用,可以和程序的容器(服务器)来通信
获取该对象有两种方式:
通过request对象获取
request.getServletContext();
通过HttpServlet获取
this.getServletContext();
获取MIME类型:
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 text/html
String getMimeType(String file)
共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
获取文件的真实(服务器)路径
String getRealPath(String path)
// ServletContentDemo1
package cn.figo.web.servletContent;
import javax.servlet.ServletContext;
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("/ServletContentDemo1")
public class ServletContentDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 通过request对象获取
ServletContext context1 = request.getServletContext();
//2. 通过HttpServlet获取
ServletContext context2 = this.getServletContext();
System.out.println(context1);
System.out.println(context2);
System.out.println(context1 == context2);//true
//3. 定义文件名称
String filename = "a.jpg";//image/jpeg
//4.获取MIME类型
String mimeType = context2.getMimeType(filename);
System.out.println(mimeType);
// 获取文件的服务器路径
String b = context2.getRealPath("/b.txt");//web目录下资源访问
System.out.println(b);
//设置数据
context2.setAttribute("msg","haha");
//获取数据
Object msg = context1.getAttribute("msg");
System.out.println(msg);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
![0ffb168b754bd8d3c3a01cf4bfba9f2e.png](https://i-blog.csdnimg.cn/blog_migrate/f8ba5240f07d3487707ee2ea3ff0aacb.jpeg)
org.apache.catalina.core.ApplicationContextFacade@7c6c6fd7
org.apache.catalina.core.ApplicationContextFacade@7c6c6fd7
true
image/jpeg
D:1_CodejavajavaWebjavaWeb_outartifactsservlet_learn_war_explodedb.txt
haha