(Serlet进阶 HttpServletResponse和HttpServletRequest)2020.11.23

目录

HttpServletResponse接口

HttpServletResponse是ServletResponse直接子接口
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
HttpServletResponse是在javax.servlet.http包下 ServletResponse是在javax.servlet包下

HttpServletResponse:tomcat创建servlet对象调用service方法之前自动给我们创建的对象,主要作用是响应数据给浏览器 响应数据包括以下几种类型 文本内容、图片、视频 …

response 组成:响应行、响应头、响应体
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

响应行

(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
响应行:协议/版本 状态码 状态码描述
最常用的状态码
  200:成功
  302:重定向
  401:未授权
  404:资源未找到
  405:没有处理当前请求方式的能力
  500:服务器代码错误

HTTP协议

概述:http超文本传输协议、是一种基于请求和响应的无状态的应用层tcp协议。
  基于请求和响应:请求和响应是成对出现、先有请求后有响应
  无状态:浏览器与服务器进行数据交互的时候、浏览器不会记录上次的交互信息
 http://localhost/login/login
 https://www.baidu.com/
 HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer ,是以安全为目标的HTTP通道,简单的讲是HTTP的安全版本,即HTTP下加入SSL层,简称HTTPS。
版本
  0.9: 服务器与浏览器只能交互文本内容
  1.0: 服务器与浏览器之间允许发送超文本、但是一次只能从服务器获取一个资源
  1.1: 服务器与浏览器之间允许发送超文本
Https:主要作用:
  1、网站安全的标识
  2、可以保证浏览器与服务器数据交互的数据安全
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
TCP三次握手,因为HTTP是基于TCP协议的,所有也可以认为是HTTP的三次握手:
  第一次握手:浏览器给服务器发送一条信息
  第二次握手:服务器收到了浏览器发送的信息、此时浏览器并不知道数据已经被服务器接收、服务器会给浏览器响应一条数据通知浏览器已经收到了
  第三次握手:浏览器收到了服务器返回的数据、开始数据交互
三次握手根本目的:保证数据的安全性

响应头

概述:服务器通知浏览器的一些信息
响应头信息大全:
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
https://www.cnblogs.com/wangshuazi/p/9809756.html 更多的头信息
重要的响应头信息:
Content-disposition 通知浏览器以下载方法打开 attachment; fileName=文件名
Content-Type 返回的内容类型 image/jpg vedio/mp4 text/html
location 立马重定向
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
refresh 定时重定向 5;url=http://www.baidu.com
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

如何设置响应头

setHeader(key,value) 设置响应头
addHeader(key,value) 添加响应头
区别:
 setHeader()一个key 对应一个值如果出现多个key相同、最终最后一个生效
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
 addHeader()一个Key 允许对应多个值(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
设置模板
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

响应图片案例

/*
 *   响应图片案例
 */
public class Response_Demo04 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//通知浏览器返回的内容类型
		resp.setHeader("content-type", "image/jpg");
		//获取资源在服务器中的真实路径
		String path = req.getServletContext().getRealPath("/img/娃娃.jpg");
		//创建文件字节输入流对象
		FileInputStream fis = new FileInputStream(path);
		//一次性读取的字节个数
		byte arr[] = new byte[1028*8];
		int len;//读取到的有效字节个数
		//获取响应流
		ServletOutputStream fos = resp.getOutputStream();
		while((len=fis.read(arr))!=-1) {
			//响应回浏览器
			fos.write(arr, 0, len);
		}
		//关闭资源
		fos.close();
		fis.close();
		
	}

}

文件下载案例

开发download.html
开发rd5这个servlet

/*
 *   下载图片案例
 */
public class Response_Demo05 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取你要访问的文件名称
		String fileName = req.getParameter("fileName");
		//通知浏览器以附件下载的形式打开该资源 URLEncoder.encode(str,编码字符集)  对文件名进行编码解决中文文件名乱码问题
		resp.setHeader("content-disposition", "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));
		//根据你要下载的资源找到该资源在服务器中的真实路径 /img/李小璐.jpg
		String path = req.getServletContext().getRealPath("/img/"+fileName);
		//创建字节文件输入流对象
		FileInputStream fis = new FileInputStream(path);
		byte arr[] = new byte[1024*8];
		int len;
		//获取响应流对象
		ServletOutputStream fos = resp.getOutputStream();
		while((len=fis.read(arr))!=-1) {
			//响应内容
			fos.write(arr, 0, len);
		}
		//关闭资源
		fos.close();
		fis.close();
	}

}

响应体

概述:服务器处理完请求后、返回给浏览器的内容
 API:
  response.getWrite().print(); 向页面输出文本内容
  response.getWrite().write(); 向页面输出文本内容
  response.getOutputStream(); 向页面输入流
 区别:
  print() 原样打印
  write() 如果涉及到数字的时候、会将数字变为对应码表上的值打印比如 97打印a
 效果
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
 乱码:当我们响应体中包含中文就会乱码
  原因:编码和解码方式不一致造成的、页面是utf-8解码、response缓冲区默认编码方式是iso-8859-1
 设置response缓冲区编码
 resp.setContentType(“text/html;charset=utf-8”); 放在方法中的第一行
一个servlet中不可以同时使用响应文本、和响应流
 错误演示
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

响应表格

/*
   *     响应表格
 */
public class Response_Demo07 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//解决乱码
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter pw = resp.getWriter();
		pw.print("<table width='600px' height='200px' border='1px solid'>");
		pw.print("<tr><td>姓名</td><td>性别</td><td>年龄</td><td>爱好</td></tr>");
		pw.print("<tr><td>pgone</td><td>男</td><td>18</td><td>少妇</td></tr>");
		pw.print("<tr><td>罗志祥</td><td>男</td><td>32</td><td>多人运动</td></tr>");
		pw.print("<tr><td>宋哲</td><td>男</td><td>39</td><td>经纪人老婆</td></tr>");
		pw.print("</table>");
	}

}

(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

HttpServletRequest接口

HttpServletRequest是ServletRequest直接子接口
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
HttpServletRequest是在javax.servlet.http包下 ServletRequest是在javax.servlet包下

HttpServletRequest是在tomcat创建servlet示例的时候在调用service()方法之前自动创建的对象。浏览器与服务器进行通讯、通讯过程中会携带一些信息、这个信息就会被封装到request对象中、我们就可以使用这个对象获取浏览器发送给服务器一些信息

HttpServletRequest:请求行、请求头、请求体(只有在post提交时候才有)
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

请求行

(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
请求行获取
request.getMethod() 获取请求方法
request.getContextPath() 获取当前项目名称
request.getRequestURL() 获取请求URL(包含协议和端口)
request.getRequestURI() 获取请求URI(不包含协议和端口)
request.getQueryString() 获取地址栏中?后的参数

/*
 * 请求行 信息的获取
 *  request.getMethod() 获取请求方法
	request.getContextPath()获取当前项目名称
	request.getRequestURL()获取请求URL(包含协议和端口)
	request.getRequestURI()获取请求URI(不包含协议和端口)
	request.getQueryString()获取地址栏中?后的参数
 */
public class Request_Demo01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		
		String method = request.getMethod();
		System.out.println("请求方法:"+method);
		String name = request.getContextPath();
		System.out.println("项目名称:"+name);
		StringBuffer url = request.getRequestURL();
		System.out.println("获取请求URL(包含协议和端口):"+url);
		String uri = request.getRequestURI();
		System.out.println("获取请求URI(不包含协议和端口):"+uri);
		String str = request.getQueryString();
		System.out.println("获取地址栏中?后的参数:"+str);
	}

}

请求头

概述:浏览器通知服务器的一些信息
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
API
request.getHeader(key) 根据key获取值
request.getHeaderNames() 获取当前请求中所有的key
代码

/*
 * 请求头数据获取
 *    request.getHeader(key) 根据key获取值
      request.getHeaderNames() 获取当前请求中所有的key
 */
public class Request_Demo02 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//获取浏览器的类型
		String user_agent = request.getHeader("user-agent");
		//获取主机的端口和ip
		String host = request.getHeader("host");
		System.out.println(user_agent);
		System.out.println(host);
		System.out.println("=============");
		Enumeration<String> headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			//获取的所有的key
			String key = (String) headerNames.nextElement();
			//根据key获取value
			String value = request.getHeader(key);
			System.out.println(key+"\t"+value);
		}
	}

}

请求体

概述:请求体就是浏览器访问服务器所携带的表单域中数据、(只有post请求才有请求体)
请求体:
(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23
请求体中如果包含中文、乱码
原因:编码与解码方式不一致 页面采用utf-8编码 request缓冲区默认解码方式iso-8859-1
解决 request.setCharacterEncoding(“utf-8”);
tomcat8.x之后 get提交乱码已经默认解决了

获取请求体数据

API
  request.getParameter(key) 根据key获取一个值
   request.getParameterValues(key) 根据key 获取多个值
   request.getParameterMap()将整个表单的数据封装到Map中去
代码示例

/*
 * 请求体参数的获取
 * API
	  request.getParameter(key) 根据key获取一个值
	  request.getParameterValues(key) 根据key 获取多个值
	  request.getParameterMap()将整个表单的数据封装到Map中去 
 */
public class Request_Demo03 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//解决post提交乱码
		request.setCharacterEncoding("UTF-8");
		//根据key获取一个值
		String name = request.getParameter("name"); 
		System.out.println(name);
		//根据key获取一个值
		String sex = request.getParameter("sex"); 
		String work = request.getParameter("work"); 
		System.out.println(sex);
		System.out.println(work);
		//根据key 获取多个值
		String[] hobbys = request.getParameterValues("hobby");
		System.out.println(Arrays.toString(hobbys));
		//将整个表单的数据封装到Map中去 
		Map<String, String[]> map = request.getParameterMap();
		Set<Entry<String,String[]>> set = map.entrySet();
		for (Entry<String, String[]> entry : set) {
			System.out.println(entry.getKey()+"\t"+Arrays.toString(entry.getValue()));
		}
		
		
	}

}

(Serlet进阶  HttpServletResponse和HttpServletRequest)2020.11.23

文件上传案例

文件上传必要属性
表单 post提交 enctype=“multipart/form-data”
servlet 上必须加注解
@MutiPartConfig

步骤
  1、在html文件夹下创建一个上传页面
  2、开发upload对应的servlet

@MultipartConfig
public class UploadServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1、根据文件名获取提交的文件资源
		Part part = req.getPart("fileName");
		//2、将文件资源写入到硬盘上 d:upload 文件内
		File file = new File("d:/upload");
		//如果此文件夹不存在
		if(!file.exists()) {
			//创建文件夹
			file.mkdir();
		}
		//3、获取文件名称
		String fileName = part.getSubmittedFileName();
		//4、拼装写入路径  d:/upload/野结衣.avi
		String path =file+"/"+fileName;
		//5、将文件资源写入到该路径
		part.write(path);
		
	}

}

上一篇:HttpServletRequest


下一篇:HttpServletRequest