Servlet(HttpServletResponse响应对象)

文章目录

  • Servlet(HttpServletResponse响应对象)
    • HTTP协议:
      • URL的组成部分
      • http请求方法
      • 请求报头
      • 响应报头
      • 互联网媒体类型
      • 请求体
    • 请求与响应对象综述
    • 原理
    • HttpServletResponse response 响应对象
      • 响应JSON字符串
      • 响应中文数据乱码 解决方法
      • 服务器给浏览器响应文件(字节流)
      • 重定向
        • 重定向 不能重定向到WEB-INF下的资源!

HTTP协议:

  • 什么是HTTP,Http是超文本传输协议,从浏览器到服务器称为请求,从服务器回到浏览器称之为响应
URL的组成部分

  • 协议

    • 协议确定如何传输请求,我们主要使用http与https,常见的还有ftp与file
  • 主机名
    • 主机名标识服务器。运行在本地计算机(localhost)和本地网络的服务器可以简单地表示,比如用一个单词,或一个数字 IP 地址。在 Internet 环境下,主机名通常以一个顶级域名(TLD)结尾,比如 .com 或 .net。另外,也许还会有子域名作为主机名的前缀。子域名可以是任何形式的,其中 www 最为常见。子域名通常是可选的。
  • 端口
    • 每一台服务器都有一系列端口号。一些端口号比较“特殊”,如 80 和 443 端口。如果省略端口值,那么默认 80 端口负责 HTTP 传输,443 端口负责 HTTPS 传输。如果不使用 80 和 443 端口,就需要一个大于 1023 1 的端口号。通常使用容易记忆的端口号,如3000、8080 或 8088。
  • 路径
    • URL 中影响应用程序的第一个组成部分通常是路径(在考虑协议、主机名和端口的基础上做决定很合理,但是不够好)。路径是应用中的页面或其他资源的唯一标识。
  • 查询字符串
    • 查询字符串是一种键值对集合,是可选的。它以问号(?)开头,键值对则以与号(&)分隔开。所有的名称和值都必须是 URL 编码的。对此,JavaScript 提供了一个嵌入式的函数 encodeURIComponent 来处理。例如,空格被加号(+)替换。其他特殊字符被数字型字符替换。
  • 信息片断
    • 该信息不会发送到服务端,一般只涉及到前段设置锚点,用于页面的跳转
http请求方法
  • HTTP 协议确定了客户端与服务器通信的请求方法集合(通常称为 HTTP verbs)。很显然,GET 和 POST 最为常见。在浏览器中键入一个 URL(或点击一个链接),服务器会接收到一个 HTTP GET 请求,其中的重要信息是 URL 路径和查询字符串。至于如何响应,则需要应用程序结合方法、路径和查询字符串来决定。
  • 对于一个网站来说,大部分页面都响应 GET 请求。 POST 请求通常用来提交信息到服务器后台(例如表单处理)。服务器将请求中包含的所有信息(例如表单)处理完成之后,用以响应的 HTML 通常与相应的 GET 请求是一样的。与服务器通信时,浏览器只使用 GET 和POST 方法(如果没有使用 AJAX)
请求报头
  • 我们浏览网页时,发送到服务器的并不只是 URL。当你访问一个网站时,浏览器会发送很多“隐形”信息。服务器会因此得知优先响应哪种语言的页面(例如,在西班牙下载 Chrome 浏览器,如果有西班牙语的版本,就会接收到一个西班牙语的访问页面)。它也会发送“用户代理”信息(浏览器、操作系统和硬件设备)和其他一些信息。所有能够确保你了解请求对象头文件属性的信息都将会作为请求报头发送。
响应报头
  • 正如浏览器以请求报头的形式发送隐藏信息到服务器,当服务器响应时,同样会回传一些浏览器没必要渲染和显示的信息,通常是元数据和服务器信息。我们已经熟悉内容类型头信息,它告诉浏览器正在被传输的内容类型(网页、图片、样式表、客户端脚本等)。特别要注意的是,不管 URL 路径是什么,浏览器都根据内容类型报头处理信息。因此你可以通过一个叫作 /image.jpg 的路径提供网页,也可以通过一个叫作 /text.html 的路径提供图片。除了内容类型之外,报头还会指出响应信息是否被压缩,以及使用的是哪种编码。响应报头还可以包含关于浏览器对资源缓存时长的提示。响应报头也会返回一些服务器信息。
互联网媒体类型
  • 内容类型报头信息极其重要,没有它,客户端很难判断如何渲染接收到的内容。内容类型报头就是一种互联网媒体类型,由一个类型、一个子类型以及可选的参数组成。例如,text/html;charset=UTF-8 说明类型是 text,子类型是 html,字符编码是 UTF-8。互联网编号分配机构维护了一个官方的互联网媒体类型清(http://www.iana.org/assignments/media-
    types/media-types.xhtml)。我们常见的 content type、Internet media type 和 MIME type 是可以互换的。MIME(多用途互联网邮件扩展)是互联网媒体类型的前身,它们大部分是相同的。
请求体
  • 除请求报头外,请求还有一个主体(就像作为实际内容返回的响应主体一样)。一般 GET请求没有主体内容,但 POST 请求是有的。 POST 请求体最常见的媒体类型是 application/x-www-form-urlendcoded ,是键值对集合的简单编码,用 & 分隔(基本上和查询字符串的格式一样)。如果 POST 请求需要支持文件上传,则媒体类型是 multipart/form-data ,它是一种更为复杂的格式。最后是 AJAX 请求,它可以使application/json

请求与响应对象综述

HttpServletRequest request 请求对象
HttpServletResponse response 响应对象请求对象与响应对象 由服务器创建 管理 销毁 我们只是使用
当响应完成之后 服务器就会销毁这次的请求对象与响应对象继承体系结构:ServletRequest(接口)<--------继承<-------HttpServletRequest(接口)<--------实现 org.apache.catalina.connector.RequestFacade@6049a827ServletResponse(接口)<---------继承---  HttpServletResponse(接口)<-------------实现------org.apache.catalina.connector.ResponseFacade@3bec9d4

原理

  1. 当浏览器去请求服务器的资源时
  2. 服务器收到请求后 就会创建请求对象的响应对象
  3. 请求对象将我们的请求数据封装
  4. 服务器会把请求对象和响应对象 喜欢递给service()方法
  5. 从请求对象中 去除请求的数据来用
  6. 给浏览器响应数据时 将响应的数据 放到响应对象中
  7. 当服务器真正响应浏览器时 就从响应对象中 取出数据响应给浏览器

  • 当响应完成之后 服务器就会销毁这次的请求对象与响应对象

HttpServletResponse response 响应对象

  • 概念
响应对象(通常传递到回调方法,这意味着你可以随意命名它,通常命名为 res 、 resp 或response )的生命周期始于 Node 核心对象 http.ServerResponse 的实例。Express 添加了一些附加功能。我们来看看响应对象中最有用的属性和方法(所有这些方法都是由 Express添加的)
  • 内容
响应行:包含协议版本,状态码,还有状态描述响应头:也是键值对的形式存在的响应实体:字符串或者是流信息
  • 方法
设置响应头:response.setHeader(键,值)  忽略大小写设置刷新:refresh
可以单独写秒数,代表的是多少秒后刷新本页面
也可以写秒数;url="地址" 代表的是多少秒后刷新并跳转到指定地址设置响应的编码集:
Response.setHeader("content-type","text/html;charset=服务器编码集")
需要注意的是需要把这句话放在其他代码之上设置响应字体:
输出字符串:
Response.getWriter()  得到的是PrintWirter
输出流信息:
Response.getOutputStream() 返回的是ServletOutputStream,可以直接用OutputStream来接,剩下的就全是普通的流信息了res.status(code)
设置 HTTP 状态代码。Express 默认为 200(成功),所以你可以使用这个方法返回状态404(页面不存在)或 500(服务器内部错误),或任何一个其他的状态码。对于重定向(状态码 301、302、303 和 307),有一个更好的方法: redirect res.set(name,value) 设置响应头 这通常不需要手动设置res.cookie(name,vaue,[options]),res.clearCookie(name,[options])
设置或清除客户端 cookies 值。需要中间件支持res.redirect([status],url)
重定向浏览器。默认重定向代码是 302(建立)。通常,你应尽量减少重定向,除非永久移动一个页面,这种情况应当使用代码 301(永久移动)res.send(body),res.send(status,body)
向客户端发送响应及可选的状态码。Express 的默认内容类型是text/html 。如果你想改为 text/plain ,需要在 res.send 之前调用res.set('Content-Type','text/plain') 。如果 body 是一个对象或一个数组,响应将会以 JSON 发送(内容类型需要被正确设置),不过既然你想发送 JSON,我推荐你调用 res.json res.json(json),res.json(status,json)
向客户端发送 JSON 以及可选的状态码res.jsonp(json),req.jsonp(status,json)
向客户端发送 JSONP 及可选的状态码res.type(type)
一个简便的方法,用于设置 Content-Type 头信息。基本上相当于  res.set('Content-Type','type') ,只是如果你提供了一个没有斜杠的字符串,它会试图把其当作文件的扩展名映射为一个互联网媒体类型。比如, res.type('txt') 会将 Content-Type 设为text/plain 。此功能在有些领域可能会有用(例如自动提供不同的多媒体文件)但是通常应该避免使用它,以便明确设置正确的互联网媒体类型res.format(object)
这个方法允许你根据接收请求报头发送不同的内容。这是它在 API 中的主要用途,简单的例子:`res.format({'text/plain':'hithere','text/html':'<b>hi there</b>'}) `res.attachment([filename]),res.download(path,[filename],[callback])
这两种方法会将响应报头 Content-Disposition 设为 attachment ,这样浏览器就会选择下载而不是展现内容。你可以指定 filename 给浏览器作为对用户的提示。用 res.download 可以指定要下载的文件,而 res.attachment 只是设置报头。另外,你还要将内容发送到客户端res.sendFile(path,[option],[callback])
可根据路径读取指定文件并将内容发送到客户端。使用该方法很方便
使用静态中间件,并将发送到客户端的文件放在公共目录下 然而,如果你想根据条件在相同的 URL 下提供不同的资源,这个方法可以派上用场res.links(links)
设置链接响应报头。这是一个专用的报头,在大多数应用程序中几乎没有用处res.locals,res.render(view,[locals],callback)
res.locals 是一个对象,包含用于渲染视图的默认上下文。res.render 使用配置的模板引擎渲染视图(不能把 res.render 的 locals 参数与 res.locals 混为一谈,上下文在 res.locals 中会被重写,但在没有被重写的情况下仍然可用)。 res.render 的默认响应代码为 200,使用 res.status 可以指定一个不同的代码。
  • 代码
@WebServlet(name = "ServletRespon", value = "/san1")
public class ServletRespon extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter writer = response.getWriter();// writer.write("baby get down");writer.write("<font color='red' size='7'>baby get down</font>");}
  • 运行结果

响应JSON字符串

"{"username":"san","password":"123456"}"设置浏览器 告诉浏览器 JSON字符串
"application/json; charset=UTF-8"
默认格式:"text/html; charset=UTF-8"
  • 测试代码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("application/json; charset=UTF-8");String s="{\"username\":\"san\",\"password\":\"123456\"}";PrintWriter writer = response.getWriter();writer.write(s);}
  • 运行结果

响应中文数据乱码 解决方法

  • 原因:tomcat服务器 默认用的编码 ISO-8859-1
    浏览器没有这个码表 使用自己默认的码表 解码会乱码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html; charset=UTF-8");PrintWriter writer = response.getWriter();writer.write("一树梨花压海棠");}
  • 解决方法
设置服务器的码表
response.setCharacterEncoding("utf-8");
设置浏览器用utf-8
response.setHeader("Content-Type", "text/html;charset=UTF-8");
以上两行代码 可以综合合并
response.setContentType("text/html; charset=UTF-8");
  • 测试代码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html; charset=UTF-8");PrintWriter writer = response.getWriter();writer.write("一树梨花压海棠");}
  • 运行结果

服务器给浏览器响应文件(字节流)

放在web根目录下的资源 可以在浏览器输入文件资源路径 来进行访问web/WEB-INF 目录下的资源 通过浏览器输入文件资源路径 不能访问
使用字节流来读取文件 进行响应
  • 代码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String r = this.getServletContext().getRealPath("/WEB-INF/01.jpg");FileInputStream in = new FileInputStream(r);//通过响应对象,获取字节流,写给浏览器ServletOutputStream out = response.getOutputStream();/*int len=0;byte[] bytes=new byte[1024];while ((len=in.read(bytes))!=-1){out.write(bytes);out.flush();}*///流的对拷IOUtils.copy(in, out);in.close();out.close();}
  • 运行结果

重定向

  • 作用:可以进行页面资源的跳转
  • 特点
1. 两次请求 两次响应
2. 地址栏会发生变化
3. 可以跳转内部资源 也可以跳转外部资源
  • 原理

重定向  302 状态码特点:1.两次请求,两次响应2.地址栏发生变化3.不仅可以访问内部资源,也可访问外部资源代码:
// 设置状态码 302 重定向
response.setStatus(302);
// 设置响应头 location
response.setHeader("location","http://127.0.0.1:8080/MyServlet/index.j
sp");
// 以上两步可以合成一个简便方法
response.sendRedirect("http://www.baidu.com");
  • 代码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("请求指令");response.setStatus(302);//跳转外部资源//response.setHeader("location", "https://www.baidu.com");//跳转内部资源response.setHeader("location", "http://localhost:8080/ReqiestResponse_war_exploded/san1");}
以上两步可以进行合并 重定向要将项目的上下文路径写上
response.sendRedirect("https://www.baidu.com");
  • 运行结果

重定向 不能重定向到WEB-INF下的资源!

Servlet(HttpServletResponse响应对象)相关推荐

  1. Servlet+常用头信息+响应状态码+响应对象

    一.Servlet 1.概念 什么是Servlet? 1.Servlet 是 java EE 的规范之一.也就是接口.Servlet 接口定义了一套网络请求的规范2.Servlet 是 javaweb ...

  2. [Servlet]研究ServletContext对象

    作者信息 作者姓名:金云龙 个人站点:http://www.longestory.com 个人公众帐号:搜索"longestory"或"龙哥有话说" Servl ...

  3. jsp九大内置对象与servlet中java对象

    jsp九大内置对象 request对象 : getParameter(String name)获取表单提交的数据 getParamegerNames() 获取客户端提交的所有参数名 getAttrib ...

  4. Javaweb核心响应对象

    1 响应对象 1.1 响应对象概述 1.1.1 关于响应 响应,它表示了服务器端收到请求,同时也已经处理完成,把处理的结果告知用户.简单来说,指的就是服务器把请求的处理结果告知客户端.在B/S架构中, ...

  5. web核心 4-response响应对象 servletContext对象 响应行响应体 请求转发 重新定向 从服务器下载与上传资源 切换验证码 网站统计访问次数

    内容介绍 1 ServletContext对象2 response响应对象 ServletContext对象 概述 ServletContext:servlet的上下文对象(全局管理者) 一个项目有且 ...

  6. Servlet中response对象Commit状态的分析

    response是服务端对客户端请求的一个响应,其中封装了响应头.状态码.内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等. 服务端在把response提交到客户端之前,会使用一个缓 ...

  7. 响应对象Response

    1.概念[响应给浏览器] 响应∶回馈结果.在B/S架构中,就是服务器给客户端浏览器反馈结果. 响应对象∶就是在项目中用于发送响应的对象. 实现接口:ServletResponse和HttpServle ...

  8. 创建Session时会把含有Session ID 的Cookie对象加到响应对象上

    从逻辑角度讲,我们应该会这样做,因为创建Session的目的,在于保存会话信息,所以要把SessionID传给浏览器,以便后面的请求能找到服务器中自己的Session,来获取自己的会话信息. 我们来分 ...

  9. Servlet - 九大对象和四个作用域

    1.九大对象 1.apllication(ServletContext):服务器启动后就产生了这个对象,所有客户共享这个内置的application对象 2.request(HttpServletRe ...

  10. Servlet页面间对象传递的方法

    Servlet页面间对象传递的方法 1.request 2.session 3.application 4.cookie 5.其它的

最新文章

  1. Qt paintevent事件
  2. 三问JavaBean
  3. hmacsha256是对称算法吗_HMAC-SHA256签名计算算法
  4. 数据分析---ipython使用
  5. [剑指offer]面试题45:圆圈中最后剩下的数字
  6. python 定义字符串变量_Python变量和字符串详解
  7. python时域信号特征提取(各种因子)
  8. Python常用小技巧(五)——批量读取json文件
  9. linux怎么把mysql数据库备份还原,MySQL数据库备份和还原
  10. 计算机二级java邓伦单_2010年3月计算机等级考试二级Java笔试试题(文字版)
  11. python主线程执行回调函数_Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程...
  12. 【专题】CSDN下载频道5月热门资源top100汇总
  13. jar反编译工具 比jd-gui 功能更强大的 Luyten 查看jar源码, 解决jd反编译代码中break labelxxx 、 static初始块中出现return 等问题
  14. cad2016中选择全图字体怎么操作_CAD2016(精简版)安装教程
  15. python 正则匹配中re.match().group(num=0)
  16. 根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角
  17. 电脑版微信多开,安全不限制个数
  18. 获取qq音乐外链方法+源码
  19. codelite+mingw安装
  20. 两年多里自己都干了什么?

热门文章

  1. 金属、指纹、全网通该有的都有 中兴小鲜3正式发布
  2. GPS的经纬度数据解析和转发
  3. 照片放大模糊怎么变清晰,图片无损放大
  4. 微信小程序tabBar的开发设置
  5. NO JVM installation found. please install a 64-bit JDK,解决方法   Error launching android studio   NO J
  6. 机器学习模型太慢?来看看英特尔(R) 扩展加速 ⛵
  7. c语言库函数总结----ctype.h库
  8. mbedtls | 01 - 移植mbedtls库到STM32的两种方法
  9. Mbed TLS 编码规范
  10. php获取随机的六位数,php生成随机六位数密码代码