今日内容

HTTP协议:响应消息

Response对象

ServletContext对象

一、HTTP协议:

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

数据格式:

1. 请求行

2. 请求头

3. 请求空行

4. 请求体

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

数据格式:

2.1) 响应行

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

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

1. 状态码都是3位数字

2. 分类:

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

2. 2xx:成功。代表:200

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

4. 4xx:客户端错误。

* 代表:

* 404(请求路径没有对应的资源)

* 405:请求方式没有对应的doXxx方法处理

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

2.2)响应头:

1. 格式:头名称: 值

2. 常见的响应头:

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

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

* 值:

* in-line:默认值,在当前页面内打开

* attachment;filename=xxx:以附件形式打开响应体。文件下载

2.3)响应空行

2.4)响应体:传输的数据

* 响应字符串格式

            HTTP/1.1 200 OKContent-Type: text/html;charset=UTF-8Content-Length: 101Date: Wed, 06 Jun 2018 07:08:42 GMT(响应空行)<html><head><title>$Title$</title></head><body>hello , response</body></html>

二、Response对象

1、功能:设置响应消息

1. 设置响应行

1. 格式:HTTP/1.1 200 ok

2. 设置状态码:setStatus(int sc)

2. 设置响应头:setHeader(String name, String value)

3. 设置响应体:

* 使用步骤:

1. 获取输出流

* 字符输出流:PrintWriter getWriter()

* 字节输出流:ServletOutputStream getOutputStream()

2. 使用输出流,将数据输出到客户端浏览器

2、案例:

2.1) 完成重定向

* 重定向:资源跳转的方式

* 代码实现:

                //1. 设置状态码为302response.setStatus(302);//2.设置响应头locationresponse.setHeader("location","/day15/responseDemo2");//简单的重定向方法response.sendRedirect("/day15/responseDemo2");       

* 重定向的特点:redirect

1. 地址栏发生变化

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

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

* 转发的特点:forward

1. 转发地址栏路径不变

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

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

* forward 和  redirect 区别

* 路径写法:

路径分类

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

* 如:./index.html

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

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

* ./:当前目录

* ../:后退一级目录

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

* 如:http://localhost/day15/responseDemo2        /day15/responseDemo2(简化写法)

* 以/开头的路径

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

* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)  如:<a> , <form>、重定向..

* 建议虚拟目录动态获取:request.getContextPath()

* 给服务器使用:不需要加虚拟目录   如:请求转发的路径

2.2)服务器输出字符数据到浏览器

步骤:

1. 获取字符输出流

2. 输出数据

注意:

* 乱码问题:

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

2. 设置该流的默认编码

3. 告诉浏览器响应体使用的编码,同时建议浏览器使用该编码解码

//简单的形式,设置编码,是在获取流之前设置

response.setContentType("text/html;charset=utf-8");

2.3)服务器输出字节数据到浏览器

步骤:

1. 获取字节输出流

2. 输出数据

2.4)验证码(字节数据)(动态生成)

1. 本质:图片

2. 目的:防止恶意表单注册

package cn.itcast.web.servlet;import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;@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);}
}
<!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>

三、ServletContext对象:

1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信。由于ServletContext对象可以和程序的容器(服务器)来通信,所以可以获取文件的(真实)服务器路径

2. 获取:

通过request对象获取    request.getServletContext();

通过HttpServlet获取     this.getServletContext();

package cn.itcast.web.servletcontext;import javax.servlet.ServletContext;
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("/servletContextDemo1")
public class ServletContextDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*ServletContext对象获取:1. 通过request对象获取request.getServletContext();2. 通过HttpServlet获取this.getServletContext();*///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}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

3. 功能:

3.1)获取MIME类型:

MIME类型:在互联网通信过程中定义的一种文件数据类型

格式: 大类型/小类型   如:text/html       image/jpeg

获取:String getMimeType(String file)

package cn.itcast.web.servletcontext;import javax.servlet.ServletContext;
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("/servletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*ServletContext功能:1. 获取MIME类型:* MIME类型:在互联网通信过程中定义的一种文件数据类型* 格式: 大类型/小类型   text/html      image/jpeg* 获取:String getMimeType(String file)2. 域对象:共享数据3. 获取文件的真实(服务器)路径*/    //2. 通过HttpServlet获取ServletContext context = this.getServletContext();//3. 定义文件名称String filename = "a.jpg";//image/jpeg//4.获取MIME类型String mimeType = context.getMimeType(filename);System.out.println(mimeType);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

3.2)域对象:共享数据

1. setAttribute(String name,Object value)

2. getAttribute(String name)

3. removeAttribute(String name)

ServletContext对象范围:所有用户所有请求的数据

package cn.itcast.web.servletcontext;import javax.servlet.ServletContext;
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("/servletContextDemo3")
public class ServletContextDemo3 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*ServletContext功能:1. 获取MIME类型:2. 域对象:共享数据3. 获取文件的真实(服务器)路径*/  //2. 通过HttpServlet获取ServletContext context = this.getServletContext();//设置数据context.setAttribute("msg","haha");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
package cn.itcast.web.servletcontext;import javax.servlet.ServletContext;
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("/servletContextDemo4")
public class ServletContextDemo4 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*ServletContext功能:1. 获取MIME类型:2. 域对象:共享数据3. 获取文件的真实(服务器)路径*/  //2. 通过HttpServlet获取ServletContext context = this.getServletContext();//获取数据Object msg = context.getAttribute("msg");System.out.println(msg);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

3.3)获取文件的真实(服务器)路径

由于ServletContext对象可以和程序的容器(服务器)来通信,所以可以获取文件的(真实)服务器路径。

方法:String getRealPath(String path)

String b = context.getRealPath("/b.txt");//web目录下资源访问

System.out.println(b);

String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问

System.out.println(c);

String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问

System.out.println(a);

package cn.itcast.web.servletcontext;import javax.servlet.ServletContext;
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.File;
import java.io.IOException;@WebServlet("/servletContextDemo5")
public class ServletContextDemo5 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*ServletContext功能:1. 获取MIME类型:2. 域对象:共享数据3. 获取文件的真实(服务器)路径*/ // 通过HttpServlet获取ServletContext context = this.getServletContext();// 获取文件的服务器路径String b = context.getRealPath("/b.txt");//web目录下资源访问System.out.println(b);// File file = new File(realPath);String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问System.out.println(c);String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问System.out.println(a);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

四、案例:

文件下载需求:

1. 页面显示超链接

2. 点击超链接后弹出下载提示框

3. 完成图片文件下载

分析:

1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示。如果不能解析,则弹出下载提示框。浏览器的这一个特点不满足需求。

2. 任何资源都必须弹出下载提示框

3. 使用响应头设置资源的打开方式:  content-disposition:attachment;filename=xxx

步骤:

1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

2. 定义Servlet

1. 获取文件名称

2. 使用字节输入流加载文件进内存

3. 指定response的响应头: content-disposition:attachment;filename=xxx

4. 将数据写出到response输出流

package cn.itcast.web.download;import cn.itcast.web.utils.DownLoadUtils;
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.FileInputStream;
import java.io.IOException;@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取请求参数,文件名称String filename = request.getParameter("filename");//2.使用字节输入流加载文件进内存//2.1找到文件服务器路径ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/img/" + filename);//2.2用字节流关联FileInputStream fis = new FileInputStream(realPath);//3.设置response的响应头//3.1设置响应头类型:content-typeString mimeType = servletContext.getMimeType(filename);//获取文件的mime类型response.setHeader("content-type",mimeType);//3.2设置响应头打开方式:content-disposition//解决中文文件名问题//1.获取user-agent请求头、String agent = request.getHeader("user-agent");//2.使用工具类方法编码文件名即可filename = DownLoadUtils.getFileName(agent, filename);response.setHeader("content-disposition","attachment;filename="+filename);//4.将输入流的数据写出到输出流中ServletOutputStream sos = response.getOutputStream();byte[] buff = new byte[1024 * 8];int len = 0;while((len = fis.read(buff)) != -1){sos.write(buff,0,len);}fis.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

问题:

中文文件名问题

解决思路:

1. 获取客户端使用的浏览器版本信息

2. 根据不同的版本信息,设置filename的编码方式不同

工具类:DownLoadUtils.java

package cn.itcast.utils;import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}
}

HTTP协议Response相关推荐

  1. rtsp摘要认证协议(Response计算方法)

    From: http://m.blog.csdn.net/blog/WTBEE/9001859 1. rtsp摘要认证协议流程 RTSP协议,全称Real Time Streaming Protoco ...

  2. 三、Web服务器——HTTP协议 Response对象 ServletContext对象 学习笔记

    今日内容 1. HTTP协议:响应消息 2. Response对象 3. ServletContext对象 HTTP协议: 1. 请求消息:客户端发送给服务器端的数据* 数据格式:1. 请求行2. 请 ...

  3. response—Http协议response响应详解刨析

    response概述: - 代表的是HTTP响应的对象- response继承结构- ServletResponse- |- HTTPServletResponse是再ServlsetResponse ...

  4. web/tomcat服务器/http协议 重要知识点

    *请求:浏览器给服务器发送内容*响应:服务器响应浏览器 1.软件的架构[1]*C/S架构的软件:* Client / Server 客户端和服务器端的软件. 都是需要在PC端安装的软件. 比如 QQ, ...

  5. 通过 HTTP 协议做 Web 缓存

    亲,你知道缓存是什么吗? 其实缓存就像办健身卡,我第一次花了699办了一年的卡之后,接下来的一年我都可以免费锻炼. 在web 中, 我们交的不是钱,而是空间,我们耗费一定的空间之后,能够获得网页打开速 ...

  6. Response详细总结

    目录 HTTP协议 Response响应消息 响应行 响应头 响应体 Response对象 案例练习 实现重定向 获取字符流 乱码问题 ServletContext对象 HTTP协议 请求消息:客户端 ...

  7. JavaWeb-10(会话技术之sessionamp;JSP)

    JavaWeb-会话技术之session&JSP 会话管理之Session技术 一.Session 在WEB开发中,server能够为每一个用户浏览器创建一个会话对象(session对象),注 ...

  8. 虚拟网络运维----基于wireshark报文分析快速过滤(tcp,icmp,http)报文时延

    文章目录 虚拟网络运维----基于wireshark报文分析快速过滤(tcp,icmp,http)报文时延 前言 tcp协议高时延报文定位 http协议高时延报文定位 icmp协议高时延报文 虚拟网络 ...

  9. 编程(代码、软件)规范(适用嵌入式、单片机、上位机等)

    目录 前言 第1章 文件 1.1 头文件 1.2 定义文件 第2章 注释规范 2.1 共性注释规范 2.2 文档注释规范 2.3 C语言风格注释规范 第3章 排版规范 3.1 缩进与对齐 风格 3.2 ...

最新文章

  1. 软件工程个人作业01
  2. 项目要开始,应该提出什么样的要求?
  3. 未转变者rust服务器推荐,如果steam只留一个游戏,你会选择吃鸡还是CSGO
  4. c语言变凉存储性,C语言数据的表示和存储(IEEE 754标准)
  5. vs需要迁移_这可能是目前最全面的无服务器迁移实践
  6. CSS3 Media Queries在iPhone4和iPad上的运用
  7. 【BZOJ3512】DZY Loves Math IV(杜教筛)
  8. 【NOI2019】 机器人 【区间dp】【插值】【下降幂多项式】【分段函数】
  9. java程序表头出不来_JAVA SWING 表头不显示问题
  10. SH760模态分析-多种解析与数字计算方法
  11. python字符串代码对象_Python源码剖析 - Python中的字符串对象
  12. JS If...Else
  13. telnet 远程登陆
  14. 【Paper】英文文章图表规范和文献引用格式
  15. Wise Force Deleter强制删除工具
  16. C++递归完成汉诺塔游戏(超详细解读)
  17. 迄今为止见过最好的职业规划
  18. php 计算时间段内的工作日 与节假日
  19. 【网络】华为网络设备认证登录设置
  20. 嵌入式驱动方面,这篇文章讲绝了!

热门文章

  1. 6g运行和8g运行有什么差别
  2. Gunicorn-配置详解
  3. (字符串操作)关于一个字符串加空格。
  4. python中的aliasing
  5. LeetCode——11. 盛最多水的容器
  6. 敏捷-细说敏捷建模思想与实践(转)
  7. 政策更新 | 开发者如何处理软件包可见性
  8. JAVA_基础部分_综合篇
  9. react中类组件this的指向问题
  10. Vue移动网页开发调试过程(第二篇)——weinre