从零开始的java学习Day19----------Web基础上(HTTP协议,servlet简介、Response)

前言:Web基础篇的内容比较散乱,主要是因为目前实际开发都是使用的封装好的框架,并没有实际使用到一些底层的东西。但是目前一些主流web开发框架其实都是基于java内Web基础的支持。适当的了解,有助于后续框架的学习。

HTTP协议

HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。
HTTP作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容
浏览器和服务器交互过程: 浏览器请求, 服务请求响应

请求:

  • ​ 请求行
  • ​ 请求头
  • ​ 请求体

​ 响应:

  • ​ 响应行
  • ​ 响应头
  • ​ 响应体

请求部分

在这里插入图片描述

请求行
示例:

GET /myApp/success.html?username=zs&password=123456 HTTP/1.1
或者
POST /myApp/success.html HTTP/1.1

第一个空格前:请求方式(7种,put,delete等)

  • ​ GET:明文传输, 不安全,参数跟在请求路径后面,对请求参数大小有限制,
  • ​ POST: 暗文传输,安全一些,请求参数在请求体里,对请求参数大小没有有限制,

第二个空格前:URI:统一资源标识符(即:去掉协议和IP地址部分)
最后:协议版本:现都使用HTTP/1.1

请求头

从第2行到空行处,都叫请求头,以键值对的形式存在,但存在一个key对应多个值的请求头.
作用:告诉服务器,浏览器相关的设置

Accept:浏览器可接受的MIME类型 ,告诉服务器客户端能接收什么样类型的文件。
User-Agent:浏览器信息.
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Content-Length:表示请求参数的长度
Host:初始URL中的主机和端口
Referrer:来自哪个页面、防盗链
Content-Type:内容类型,告诉服务器,浏览器传输数据的MIME类型,文件传输的类型,application/x-www-form-urlencoded .
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1HTTP 1.1默认进行持久连接 )
Cookie:这是最重要的请求头信息之一(会话技术, 后面会有专门的时间来讲的)
Date:Date: Mon, 22Aug 2011 01:55:39 GMT请求时间GMT
请求体

注意:只有请求方式是post的时候,才有请求体
请求体其实就是post请求时,请求参数所在的位置

响应部分

在这里插入图片描述

响应行

示例:

HTTP/1.1 200 OK

第一个空格前:协议/版本

第二个空格前:响应状态码
在这里插入图片描述
常用状态码
200:正常,成功
302:重定向(例如告诉客户端,跳转到另一个地址)
304:表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求. 读取缓存
404:客户端错误(一般是路径写错了,没有这个资源)
500:服务器内部错误

第三个空格前:响应码的描述

响应头
和请求头一样,从第2行到空行处,都叫请求头,以键值对的形式存在,但存在一个key对应多个值的请求头.

Location: http://www.it315.org/index.jsp指示新的资源的位置,通常和状态,302一起使用,完成请求重定向
Content-Type: text/html; charset=UTF-8; 设置服务器发送的内容的MIME类型,文件下载时候
Refresh: 5;url=http://www.it315.org指示客户端刷新频率。单位是秒
Content-Disposition: attachment; filename=a.jpg 指示客户端(浏览器)下载文件
Content-Length:80 告诉浏览器正文的长度
Server:apachetomcat 服务器的类型
Content-Encoding: gzip服务器发送的数据采用的编码类型
Set-Cookie:SS=Q0=5Lb_nQ;path=/search服务器端发送的Cookie
Cache-Control: no-cache (1.1)
Pragma: no-cache (1.0) 表示告诉客户端不要使用缓存
Connection:close/Keep-Alive
Date:Tue, 11 Jul 2000 18:23:51 GMT
响应体

页面展示内容, 和网页右键查看的源码一样

servlet

Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容

servlet与普通的java程序的区别

必须实现servlet接口
必须在servlet容器(服务器)中运行
servlet程序可以接收用户请求参数以及向浏览器输出数据

Servlet什么时候销毁
服务器关闭的时候销毁

Servlet的生命周期方法

* init():Servlet的对象被创建的时候调用
* service():每次有请求访问这个Servlet都会调用
* destroy():Servlet的对象被销毁的时候调用

Response对象

Response就是服务器发给客户端的响应信息
HttpServletResponse对象封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
开发人员必须学会使用HttpServletResponse,才能给浏览器发送数据

响应的组成部分
  • 响应行(协议版本、响应状态码)
  • 响应头(键值对)
  • 响应体(显示在页面上的内容、下载的内容)

Response对象,不需要我们自己创建,Servlet类的方法会自己传入(写在入参里面,直接使用)

常用API
设置响应状态码
void setStatus(int 状态码)                    //设置此响应的状态代码
用给定名称和值设置响应头
void setHeader(String key, String value)     //设置响应头的键值对
获取字符输出流
PrintWriter getWriter()                           //获得一个链接客户端的字符输出流,可以用于对浏览器输出字符
//可以使用输出流的writer方法,直接输出字符
示例:
输出流.writer("abc")

注意(纯数字)
如果输出的是纯数字,就不能使用writer方法,不会被浏览器正确识别,需要使用print方法才能正确输出
示例:

输出流.print("123")

注意(中文输出)
如果输出的是中文,也不能直接输出,因为我们输出的字符编码和浏览器使用的编码不同,直接输出会出现中文乱码现象
所以我们可以使用以下方法来优化

setCharacterEncoding("字符集")                                //设置服务端使用的编码方式,可以设置为UTF-8/GBK等等
response.setHeader("content-type","text/html;charset=字符集") //告诉浏览器,服务端的响应内容使用的字符集
上述两步可以优化为:
setContentType("text/html;charset=字符集")                    //直接一步完成上述两步的操作
获取字节输出流
OutputStream response.getOutputStream()    //获得一个连接客户端的字节输出流,可以用于对浏览器输出文件

常见响应头介绍

location(比较重要)
重定向操作:通常告知浏览器马上向该地址发送请求,通常和响应码302 一起使用

content-encoding :(了解)
设置当前数据的压缩格式,告知浏览器以何种压缩格式解压数据

content-disposition
告诉浏览器弹出一个下载的提示框
通知浏览器以何种方式获取数据(直接解析数据(网页,图片文本),或者以附件方式(下载文件))

content-type
告诉客户端,服务器响应的数据的类型是什么。
实体头部用于指示资源的MIME类型(MIME类型:用于提示当前文件的媒体类型,例如图片——(image/png)、音频——(audio/ogg)。它的作用与传统上Windows上的文件扩展名相同。该名称源于 最初用于电子邮件的MIME标准。)
注意:我们content-type常用的设置一般都是——“text/html;charset=utf-8"
其中:
“text/html;” :设置浏览器以文件格式解析数据;
“charset=utf-8”:响应数据的编码表。

示例:使用location响应头实现重定向跳转到百度

//设置响应状态码为302
response.setStatus(302);          //302表示重定向
//设置重定向的网页到百度
response.setHeader("location","http://www.baidu.com");

上面代码可以使用一句代码简化(sendRedirect方法)

response.sendRedirect("http://www.baidu.com");
//sendRedirect方法可以自动设置状态码和重定向的的网页

示例:向页面输出中文数据没有乱码

response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你好中文世界");

ServletContext

  • ServletContext是一个容器(域对象)可以存储键值对数据(String key,Object value),保存在ServletContext中的数据不仅可以提供给所有的servlet使用,而且可以在整个项目范围内使用(后期的过滤器、监听器也可以使用ServletContext)。
  • 服务器会在启动的时候,就为它所部署的每一个项目都创建一个ServletContext实例对象,并且每个项目中有且只有一个ServletContext实例对象。

常用API介绍

获得ServletContext对象
1、Servlet类本身就有获得ServletContext对象的方法

ServletContext servletContext = this.getServletContext()     //在Servlet类中执行此方法,直接获得一个ServletContext对象

2、使用request对象获取ServletContext对象

ServletContext servletContext = request.getServletContext()  

3、使用ServletConfig对象获取ServletContext

ServletContext servletContext = getServletConfig().getServletContext();

操作ServletContext对象内置容器(Map集合)

存储数据

void setAttribute(String name, Object object)     //往servletcontext容器中存入数据,name为数据名称,object为数据的值

获得数据

Object getAttribute(String name)               //从ServletContext中获取数据,根据指定的数据名称

移除数据

void removeAttribute(String name)          // 从ServletContext中移除数据,根据指定的数据名称
ServletContext获取资源文件的真实路径
  • 我们的代码执行时,是会将我们我们在idel里编写的代码编译成class文件来执行,实际执行的文件目录和我们编写代码处的路径是不同的
  • 我们可以通过ServletContext对象的getRealPath方法,获得到执行时的Web根目录
string realPath = servletContext.getRealPath("")          默认得到的字符串是到项目的Web目录下的
//示例:找wbe目录下img文件夹里的1.txt文件
string realPath = servletContext.getRealPath("img/1.txt")
ServletContext将资源文件转换成字节输出流
  • 我们之前都是通过类加载器获得文件的输入流的,但是类加载器只能获得到src目录下,如果我们是需要获得到Web目录下的东西的话,可以使用
  • ServletContext对象的getResourceAsStream方法,得到一个默认路径在Web目录下的流文件
InputStream inputStream = servletContext.getResourceAsStream("2.txt")      //默认得到的流的路径是到项目的Web目录下的
//示例:找wbe目录下img文件夹里的1.jpg文件
InputStream inputStream = servletContext.getResourceAsStream("img/1.jpg")
ServletContext作用总结

概念:首先是一个容器,以键值对的形式进行数据存储。它会在服务器启动的时候,创建对象,并且每一个项目只有一个ServletContext实例对象。
作用域:整个项目
三个作用

  • 1、可以读取资源在当前项目中的文件位置,获取真实路径(web下面的文件的真实路径),getRealPath()

  • 2、可以作为域对象在项目全局范围内提供共享数据

    • setAttribute(name,value),存数据
    • removeAttribute(name),移除数据
    • getAttribute(name),获取数据
  • 3、将资源文件转换成流(web下面的文件),getResourceAsStream()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值