JavaWebDay02
HTTP协议概述
-
HTTP(HyperText Transfer Protocol):超文本传输协议
-
作用:用于浏览器与服务器之间的数据传输,规定了浏览器和服务器的传输格式
-
组成:
-
请求:浏览器发送数据到服务器的过程
-
响应:服务器返回数据到浏览器的过程
-
-
特点:
-
无状态
协议对客户端没有状态存储,对事务处理没有“记忆”能力
-
无连接
HTTP/1.1之前,由于无状态的特点,每次请求都需要通过TCP三次挥手四次握手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
-
基于请求和响应
基本的特性,由客户端发起请求,服务器响应
-
简单快速、灵活
-
通信使用明文、请求和响应不会对通信方进行确实、无法保护数据的完整性。
-
HTTP请求概述
组成
请求行,请求头,请求体
请求行概述
-
请求行格式
POST请求:POST /day02/login HTTP/1.1
GET请求:GET /day02/login?username=jack&pwd=111 HTTP/1.1
-
请求行组成
-
请求方式
-
请求地址
-
协议和版本
POST方式 GET方式 地址栏 数据在请求体中发送,所以不在地址栏上显示 数据在请求行上发送,所以在地址栏上可以看见参数 大小 理论上没有限制 不同的浏览器有区别,1k 安全性 更高 更低 缓存 POST邮寄,发送数据不使用本地缓存 GET从服务器上获取数据,会使用缓存。如果本地浏览器已经缓存了页面,而且服务器的数据也没有修改,不再从服务器上得到数据 获取请求行相关方法
HttpServletRequest对象的方法 功能说明 String getMethod() 获得请求方式 String getRequestURI() 获得统一资源标识符 StringBuffer getRequestURL() 获得统一资源定位符:网址 String getProtocol() 获得协议和版本 String getContextPath() 获取项目访问路径 String getRemoteAddr() 获取客户端IP地址 请求头概述
常见请求头 作用 Referer 服务器端获取浏览器上一次访问的地址 If-Modified-Since 服务器端获取浏览器缓存页面的时间 User-Agent 服务器端获取客户端操作系统类型和浏览器类型 Connection 获得HTTP协议连接状态 保持连接 keep-alive 断开连接 close Host 获取服务器的地址和端口 获取请求头相关方法
HttpServletRequest对象的方法 功能描述 String getHeader(String headName) 根据请求头名获得值 Enumertion<String> getHeaderNames() 获得所有请求头的名 返回一个迭代器 hasMoreElement:判断是否还有下一个元素 nextElement:获得下一个元素 请求体概述
用户输入的内容
只要用户输入的并提交给服务器的数据都可以统称为请求参数(请求体)
POST才有请求体,GET没有
HttpServletRequest对象的方法 描述 String getParameter(String name) 根据参数名获得参数值 String[] getParameterValues(String name) 根据参数名获得多个参数值 返回是数组 Enumeration<String> getParameterNames() 获得所有请求参数的名字 返回迭代器对象 Map<String,String[]> getParameterMap() 获得所有请求参数信息 返回map集合 key:参数名 value:参数值 BeanUtils工具使用-封装参数
BeanUtils常用方法 作用 void populate(Object bean, Map<String, Object> properties) 将map集合的数据封装到指定的bean对象 简单记忆:后付钱(后面的参数赋值给前面的对象) 使用条件
-
类必须是public修饰的
-
类必须有public的无参构造方法
-
成员变量必须有对应的getter和setter方法
参数的乱码问题
乱码原因:Tomcat默认使用欧洲码表(ISO-8859-1:不支持汉字)解码参数
解决办法:
在获取请求参数之前通过请求对象的方法设置解码使用的码表,
代码:request.setCharacterEncoding("utf8");
Tomcat8.0开始,GET方式请求不需要考虑乱码问题了,如果使用Tomcat8.0之前的版本,则也需要手动处理乱码问题,详情参考:https://blog.csdn.net/lxf512666/article/details/52939573/
转发与重定向
转发和重定向的作用:实现页面的跳转 实现转发和重定向的方法 转发的方法:request.getRequestDispatcher("要转发的页面地址").forward(request,response); 重定向方法:response.sendRedirect("重定向方法")区别 转发 重定向 地址栏 不会变化 会变成重定向的页面地址 跳转位置 服务器内部 浏览器 请求次数 1次 2次 请求域数据 不会丢失 会丢失 -
面试题:转发或重定向后续代码还会执行吗?
会,但没有意义了
-
面试题:什么时候使用转发,什么时候使用重定向?
如果需要共享请求域的数据,则只能使用转发,否则可以随便选择。
Servlet作用域概述
-
作用域就是服务器端的一小块内存区域,底层结构就是一个map集合,用于Servlet之间共享数据
-
Servlet的三个作用域:
请求域、会话域、上下文域
-
请求域的相关方法
请求域相关方法 作用 Object getAttribute("键") 根据键从请求域中获得值 void setAttribute("键",Object数据) 往请求域中存储键值对数据 void removeAttribute("键") 根据键从请求域中删除键值对数据
关于根目录使用说明
根目录 /
服务器端根目录( / ):http://localhost:8080/项目访问地址/
浏览器端根目录( / ):http://localhost:8080/
这就是为什么有些地方需要"/login"这样写,有些地方"login"这样写
-