response对象的方法有哪些_java学习之web基础(4):Response和ServletContext

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

7e754a2a9c9bcfe84d019780d850adb8.png
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
org.apache.catalina.core.ApplicationContextFacade@7c6c6fd7
org.apache.catalina.core.ApplicationContextFacade@7c6c6fd7
true
image/jpeg
D:1_CodejavajavaWebjavaWeb_outartifactsservlet_learn_war_explodedb.txt
haha
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值