前言: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.1(HTTP 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()