03.servlet体系和Http
[TOC]
servlet体系结构
servlet—是一个接口
实现
GenericServlet—是一个抽象类
继承
HttpServlet—是一个抽象类
==GenericServlet== :
将servlet接口中的其他的方法都给了默认实现,只将service方法作为抽象方法。定义一个Servlet类时,可以继承GenericServlet,重写他的service方法就可以了。如果定义一个Servlet类时,可以实现Servlet接口,重写他的(init() , getServletConfig() , service() , getServletInfo() , **destroy()**)
==HttpServlet==:对http协议的封装的servlet类。
使用:定义一个类继承HttpServlet,然后重写doGet和doPost方法就可以了。
1 | ????? |
1. http
http概念:超文本传输协议。 Hyper text Transform protocol
传输协议:客户端和服务器端进行通信的时候,发送的数据的格式。
1.1 特点
- http协议底层是TCP协议。
- 默认端口号:80
- 基于请求/响应模型的:一次请求对应一次响应。
- 无状态的:多次请求与响应之间是互相独立的,数据不能交互。
1.2 版本
- 1.0:每一次请求响应都需要建立新的连接
- 1.1:重复使用连接。keep-alive
1.3 请求的数据格式
- 请求行:GET /Demo01 HTTP/1.1
- 请求头:包含了请求的信息:
- user-agent:浏览器告诉服务器,当前使用的是什么浏览器哪个版本来访问你的。
- Referer:http://localhost/ ,告诉服务器,当前请求是从哪里来的。
- 作用:1.防盗链,2.统计工作
1 | //主机 |
- 请求空行:空行,分割请求头和请求体的。
- 请求体:封装post请求的参数的。
1.4 响应的数据格式
- 响应行 HTTP/1.1 200 OK
- 组成部分
- ==协议版本==:http/1.1 长连接, http/1.0 短连接
- ==响应码(状态码)==:服务器对浏览器的每一次请求都会响应一个状态值。
- 1XX:服务器接收客户端的消息,但是没有接受完成,等待一段时间后,发送一个1xx的状态码给浏览器。
- 2XX 成功访问。 200
- 3XX 重定向 302(重定向) 304(访问缓存)
- 4XX 客户端错误
- 404 请求路径没有对应的资源
- 405 请求类型不支持 get post
- 5Xx 服务器端错误:500(服务器内部出现异常)
- 组成部分
- 响应头:
- 格式:头名称:值
- 具体内容:
- HTTP/1.1 200 OK
- Content-Type: text/html
- Content-dispostion:服务器告诉客户端用什么样的方式打开相应的数据
- in-line: 默认值,使用浏览器页面打开。
- attachment;filename=xxx; 以附件的形式打开,文件下载。
- 响应空行, 就是一个换行
- 作用:分割响应头和响应体
- 响应体:传输的具体数据,响应给浏览器的结果。
1.5 请求方式
- GET:
- get请求的参数实在url地址栏中的。
- 因为url长度是有限制的。大约4kb , 所以传输的数据最大不能超过4kb。
- 不安全
- POST:
- 请求参数在方法体中
- 请求传输的数据大小没有限制
- 相对安全。
2. request对象和response对象
request,resposne对象由服务器来创建,我们仅仅是使用它
2.1 request对象
request对象:请求对象
request对象里面封装了所有的请求的消息
2.1.1 request对象的常用方法
常用方法
1 | request.getMethod(); //返回请求的方式 GET/POST/PUT/... |
获取请求头信息的方法
1 | //请求头数据 |
拿到请求体的信息(GET请求没有请求体)
1 | //获取字符流对象 |
获取参数的方式
1 |
|
请求对象的编码问题
tomcat8以前的版本中,GET和POST中文都会乱码。
但是在**jdk8?**的版本中,get请求的默认编码格式变成了UTF-8,所以不会有乱码的情况出现了。
1 | request.setCharacterEncoding("utf-8"); |
2.1.2 request对象的体系结构
- ServletRequest – 接口
- HttpServletRequest –接口
- org.apache.catalina.connector.RequestFacade 实现类
2.1.3 用户登陆案例
- 编写login.html页面 username 和 password两个输入框
- 使用Druid连接池,操作mysql中的user表。
- 使用jdbcTemplate技术封装jdbc;
- 登陆成功后跳转到successServlet中展示:登陆成功
- 登陆失败跳转到errorServlet中展示:登陆失败。
2.2 response对象
response对象:响应对象
response,服务器发送给客户端的数据
response对象中设置了所有的响应给浏览器的消息。
2.1 设置响应行:设置状态码
1 |
|
getRequestURI()和getRequestURL()
1 | String requestURI = req.getRequestURI();///day09/response01 |
2.设置响应头
1 | resp.setCharacterEncoding( "UTF-8" ); |
3.设置响应体,使用输出流,将数据输送到浏览器端
1 | //通过resp的对象创建一个打印输出路对象 |
2.3 Request、Response对象的内存地址维护
在同一个浏览器中不断的向同一个Servlet发送请求,reqeust和response不断的新建和销毁但是内存地址没有改变。是因为tomcat根据访问的IP地址对reqeust和response内存地址进行维护,当reqeust和response对象销毁后,tomcat不会立刻将该内存地址销毁,而是将该内存进行占位,等到下次创建新的reqeust和response对象就会分配到这个内存中。
避免了不断分配新内存造成资源浪费。
如果该内存长时间(默认30分钟)没有reqeust和response对象,将会销毁该内存地址,或是存放其他的对象。
2.4 转发和重定向的区别 forward和redirect的区别
2.4.1转发
请求的转发。request.getRequestDispatcher(“/request07”).forward(req,resp);
1.url地址栏不变
2.转发无法访问当前项目以外的服务
3.转发是一次请求。
4.req域中的存储的数据在 转发后能够取出来
5.转发的路径中不写项目的虚拟目录
2.4.2 重定向
response.sendRedirect( contextPath + “/testRedirect”);
1.url地址栏会变
2.重定向可以访问当前项目以外的其他服务器。
3.两次请求
4.重定向后无法取出重定向前req域中的数据。
5.重定向的路径中要添加虚拟目录
3. 相对路径和绝对路径
3.1 相对路径
相对路径:通过相对路径不可以确定唯一的资源。相对路径指的是当前资源访问地址之间的关系,而不是文件在文件系统中的路径关系
./index.html
./ : 代表的是当前路径下。
../ :上一级目录下。
3.2 绝对路径
绝对路径:通过绝对路径可以确定唯一的资源。
/index.html
4. ServletContext对象
概念:代表的是整个web应用。可以和程序的服务器进行通信,ServletContext对象是单例的。
4.1 获取ServletContext对象
1 | //通过request对象获取。 |
4.2 ServletContext对象作用
- 获取文件的MIME类型
- MIME类型:在互联网通信的过程中定义的一种文件数据类型。
- text/html 大类型/小类型
1 | //获取文件的mime类型 |
- 作为域对象存储数据
1 |
|
==突破了重定向req无法共享数据的局限性==。**ServletContext的域对象在整个生命周期中被所有的servlet对象所共享。**
- 获取文件的真实路径
1 | //拿到文件的真实路径,“/”代表的就是web工程的classpath路径。 |