## HTTP
1、概念:Hyper Text Transfer Protocol 超文本传输协议
* 传输协议:定义了客户端和服务端通信时,发送数据的格式
* 特点:
1、基于TCP/IP的高级协议
2、默认端口号:80
3、基于请求/响应模型的,一次请求对应一次响应
4、无状态的:每次请求之间相互独立,不能交互数据
* 历史版本:
* 1.0:每一次请求响应都会建立新的连接
* 1.1:复用连接
2、请求消息数据格式
1、请求行
请求方式 请求url 请求协议/版本
*请求方式:HTTP协议中有7种请求方式,常用的有2种
* GET:
1、请求参数在请求行中,在url之后
2、请求的url长度有限制的
3、不太安全
* POST:
1、请求参数在请求体中
2、请求的url长度没有限制
3、相对安全
2、请求头:客户端浏览器告诉服务器一些信息
* 格式: 请求头名称:请求头值
*常见的请求头:
1、User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
2、Referer: http://localhost/login.html
* 告诉服务器,(当前请求)从哪里来
* 作用:
1、防盗链
2、统计工作
3、请求空行
就是一行空行,分割请求头和请求体的
4、请求体
* 封装POST请求消息的请求参数的
* 字符串格式:
POST /demo3 HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 17
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: http://localhost
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost/login.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=1381112E0583480CE8884D5D669D7248
username=zhangsan
3、响应消息数据格式
## Request:
1、request对象和respons对象的原理
1、request和response对象是由服务器创建的,由我们来使用他们
2、request对象是来获取请求消息,response对象是来设置响应消息的
2、request对象继承体系结构:
1、ServletRequest -- 接口
| 继承
2、HttpServletRequest -- 接口
| 实现
3、org.apache.catalina.connector.RequestFacade 类(tomcat)
3、request:获取请求消息
功能:
1、获取请求消息数据
1、获取请求行数据
* GET /demo3?username=zhangsan HTTP/1.1
* 方法:
1、获取请求方式:GET
* String getMethod()
2、(*)获取虚拟目录:
* String getContextPath()
3、获取Servlet路径:/demo3
* String getServletPath()
4、获取get方式请求参数:username=zhangsan
* String getQueryString()
5、(*)获取请求URI:/虚拟目录/Servlet路径
* String getRequestURI():/虚拟目录/Servlet路径
* StringBuffer getRequestURL():http://localhost/虚拟目录/Servlet路径
6、获取协议及版本:HTTP/1.1
* String getProtocol()
7、获取客户机的IP地址
* String getRemoteAddr()
2、获取请求头数据
* 方法:
1、String GetHeader(String name):通过请求头的名称获取请求头的值
2、Enumeration<String> getHeaderNames():获取所有的请求头名称
3、获取请求体数据
* 请求体:只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数
* 步骤:
1、获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
2、再从流对象中拿数据
2、其他功能:
1、获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
1、String getParameter(String name):根据参数名称获取参数值
2、String[] getParameterValues(String name):根据参数名称获取参数值的数组
3、Enumeration<String> getParameterNames():获取所有请求的参数名称
4、Map<String,String[]> getparameterMap():获取所有参数的map集合
* 中文乱码问题
* get方式:tomcat 8 已经将get方式乱码问题解决了
* post方式:会乱码
* 解决 :在获取参数前设置request的编码
request.setCharacterEncoding("utf-8");
2、请求转发:一种在服务器内部的资源跳转方式
* 步骤:
1、通过request对象获取请求转发器对象,RequestDispatcher getRequestDispatcher(String path)
2、使用RequestDispatcher对象进行转发:forward(ServletRequest request,ServletResponse response)
* 特点:
1、浏览器地址栏路径没有发生变化
2、只能转发到当前服务器内部资源中
3、转发是一次请求
3、共享数据
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
* 方法:
1、void setAttribute(String name,Object obj):存储数据
2、Object getAttribute(String name):通过键获取值
3、void removeAttribute(String name):通过键移除键值对
4、获取ServletContext
* ServletContext getServletContext()
## 总结案例:用户登录
* 用户登录案例需求:
· 1、编写login.html登录页面
username & password 两个输入框
2、使用Druid数据库连接池技术,操作mysql,test数据库中user表
3、使用JdbcTemplate技术封装JDBC
4、登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
5、登录失败跳转到FailServlet展示:登录失败,用户名或密码错误