C/S:客户端/服务器端
B/S:浏览器/服务器端
静态资源:所有用户访问后,得到的展示结果都一样
静态资源可以直接被浏览器解析
如:html、css、JavaScript
动态资源:每个用户访问后,得到的结果可能不一样。
动态资源需要先转换为静态资源,再返回给浏览器
如:Servlet/jsp,php,asp…
基础传输协议:
TCP:安全协议,三次握手。速度稍慢
UDP:不安全协议,速度快
服务器:安装了服务器软件的计算机
服务器软件:接收用户的请求,处理请求,做出响应。
Web服务器软件:
主要功能是提供网上信息浏览服务
常见的JAVA相关的Web服务器软件:
WebLogic: Oracle公司,大型JavaEE服务器,支持所有的JavaEE规范,收费的。
WebSphere: IBM公司,大型JavaEE服务器,支持所有的JavaEE规范,收费的。
JBOSS: JBOSS公司,大型JavaEE服务器,支持所有的JavaEE规范,收费的。
Tomcat: Apache基金组织,中小型JavaEE服务器,仅仅支持少量的JavaEE规范。开源、免费的。
概念:server apple,运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
将来我们自定义一个类,实现Servlet接口,复写方法。
基本快速使用:
web.xml中配置
1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2.查找web.xml文件,是否有对应的
3.有则找到对应的
4.tomcat会将字节码文件加载进内存并创建其对象
5.调用其方法
被创建:执行init方法,只执行一次(一般用于加载资源)
Servlet什么时候被创建?
在
1.第一次被访问时,创建
*
2.在服务器启动时,创建
*
inint方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
注意:多个用户同时访问时,可能存在线程安全问题。尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次。
被销毁:执行destroy方法,只执行一次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
好处:
支持注解配置。可以不需要web.xml。
在实现类上使用@WebServlet注解,进行配置
@WebServlet("资源路径")
Servlet --- 接口
|继承
GenericServlet --- 抽象类
|继承
HttpServlet --- 抽象类
GenericServlet:
该类将Servlet接口中的方法做了默认空实现,只将service()方法作为抽象
将来定义Servlet类时,可以继承GenericServlet类,实现service方法即可。
HttpServlet:
该类对Http协议的封装,简化操作。
使用步骤:
Servlet相关配置:
urlpartten:Servlet访问路径
一个Servlet可以定义多个访问路径@WebServlet({"url1","url2"})
路径定义规则:
1./xxx:一般路径
2./xxx/xxx:多层路径,目录结构
3.*.do:*通配符
概念: Hyper Text Transfer Protocol 超文本传输协议,规定了 浏览器和万维网之间互相通信的规则
传输协议:定义了客户端和服务器端通信时,发送数据的格式
特点:
历史版本:
1.0版本:每一次请求响应都会建立新的连接
1.1版本:会复用请求
请求消息:客户端发送给服务器端的数据
响应消息:服务器端发送给客户端的数据
请求行:
格式:
请求方式 |
请求url |
请求协议/版本 |
请求方式:
HTTP协议有七种请求方式,常用的两种:
GET:
1. 请求参数在请求行中
2. 请求的URL长度有限制
3. 不太安全
POST:
1. 请求参数在请求体中
2. 请求的URL长度无限制
3. 相对安全
请求头:客户端浏览器告诉服务器一些信息
请求头名称:请求头值
常见的请求头:
User-Agent:浏览器告诉服务器,访问服务器使用的浏览器版本信息
可以在服务器端获取该头的信息,解决浏览器的兼容性问题
Referer: 告诉服务器,当前请求从哪里来的。
作用:防盗链、统计工作
请求空行:
空行,做分隔POST请求头和请求体的作用
请求体:(正文)
封装POST请求消息的请求参数的
响应行:
格式:
协议/版本 |
响应状态码 |
状态码描述 |
HTTP/1.1 |
200 |
OK |
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
状态码均由3位数字组成
响应头:
请求头名称:请求头值
常见的响应头:
Content-Type:服务器告诉客户端本次响应消息体的数据格式及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
常用的值:
in-line:默认值,在当前页面展示
attachment;filename=XXX:以附件格式打开响应体。用于文件下载
响应空行:空格、分隔作用
响应体:传输的数据
request对象继承体系结构
servletRequest --接口
|继承
HttpServletRequest --接口
|实现
org.apache.catalina.connector.RequestFacade --类(Tomcat)
获取请求消息数据:
获取请求行数据:
例:GET / serlvet/deom01?name=zhangsan HTTP/1.1
常用方法:
获取虚拟目录:serlvet
getContextPath()
获取请求的URI/URL:
getRequestURI():serlvet/deom01
getRequestURL():http://locahost/serlvet/deom01
URL:统一资源定位符
URI:统一资源标识符
获取请求头数据
方法:
getHeader(String name):通过请求头名称获取请求头的值
Enumeration
获取请求体数据
请求体:只有PSOT请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
1.获取流对象
BufferedReader getReader():获取字符输入流
ServletInputStream getInputStream():获取字节输入流
2.再从流对象中拿数据
获取请求参数通用方式:get/post通用(常用)
String getParameter(String name):根据参数名称获取参数值
String[] getParameterValues(String name):根据参数名称获取参数值的数组
Enumeration
Map
常见问题:
中文乱码问题:
get方式:Tomcat8 已经将get方式乱码问题解决了
post方式:中文数据会乱码
解决:获取参数前,设置request编码
请求转发(forword):一种在服务器内部的资源跳转方式
步骤:
RequestDispatcher getRequestDispatcher(String path)
forward(ServletRequest request Servletponse reponse)
特点:
共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
获取ServletContext对象:
ServletContext getServletContext()
设置响应行:
格式: HTTP/1.1 200 OK
设置状态码:
setStatus(int sc)
设置响应头:
setHeader(String name,String value)
设置响应体:
使用步骤:
1.获取输出流
字符输出流:PrintWriter getWriter()
默认编码:ISO-8859-1
字节输出流:ServletOutputStream getOutputStream()
2.使用输出流,将数据输出到客户端浏览器
乱码问题:
获取流之前设置流的编码以及告诉浏览器响应体使用的编码:
setContentType("text/html;charset=utf-8");
重定向:redirect (资源跳转的方式)
sendRedirect(String name);
重定向的特点:
是一个全局对象, 服务器会给每一个项目(工程)都创建一个ServletContext对象
获取ServletContext对象:
1.通过request对象:getServletContext()
2.通过HttpServlet获取:getServletContext()
功能:
获取MIME类型(文件下载):
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 例: text/html image/jpeg
获取String getMimeType(String file):
通过file名获取对应的MIME类型。
域对象:共享数据
ServletContext对象范围:共享所有用户所有请求的数据
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
getRealPath(String Path):获取文件真实(服务器)路径
会话:一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方断开为止。
功能:共享数据
方式:
客户端会话技术: Cookie
服务器端会话技术: Session
概念:客户端会话技术,将数据保存到客户端浏览器
基本使用步骤:
1.创建Cookie对象,绑定数据:
new Cookie(String name,String value)
2.发送Cookie对象:
response.addCookie(Cookie cookie)
3.获取Cookie,获取数据:
request.getCookies():返回Cookie数组
基于响应头set-cookie和请求头cookie传输实现
一次可不可以发送多个cookie?
可以
可以创建多个Cookie对象,使用response调用多次addCookie
cookie在浏览器中保存多长时间?
setMaxAgr(int seconds):
正数:将Cookie数据写到硬盘,持久化存储。
负数:默认值,跟随浏览器关闭而死亡
0:删除Cookie信息
cookie能否存储中文?
需要将中文数据转码 ---> 一般采用URL编码
但是特殊符号数据还是需要采用URL编码
cookie共享问题?
如果要多个项目共享,则将path设置"/"即可
如果设置一级域名相同,那么多个服务器之间cookie可以共享
例: setDomain(".bai.com")
那么 tieba.baidu.com 和news.baidu.com中cookie可以共享
特点:
作用:
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
基本使用步骤:
request.getSession()
HttpSession对象:
Object getAttribute(String name):获取
void setAttribute(String name,Object value):设置
void removeAttribute(String name):删除
原理:Session的实现是依赖于Cookie的。
Cookie中会有一个 JSESSIONID = XXXXX;
客户端关闭后,服务器不关闭,两次获取Session是否为同一个?
客户端不关闭,服务器关闭,两次获取Session是否为同一个?
不是同一个,但是要确保数据不丢失
在服务器正常关闭之前,将session对象序列化到硬盘上
在服务器启动后,将session文件反序列化到内存中的session对象即可。
注意:在Tomcat中钝化和活化均已实现,而在IDEA工具中只实现了钝化,在服务器重新开启时Work目录会被删除然后重新创建所以无法实现活化操作。
Session什么时候被销毁?
也可以通过tomcat中的web.xml配置文件中修改
Session与Cookie的区别?
概念:当访问服务器的资源时,过滤器可以将其请求拦截下来,完成一些特殊的功能
作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…
基本快速使用步骤:
web.xml配置
注解配置
过滤器执行流程:
过滤器声明周期方法:
过滤器配置详解:
拦截路径配置:
拦截方式配置:资源被访问的方式
1. .注解配置:
设置dispatcherTypes属性:
2. web.xml配置:
设置
拦截顺序:
如果有两个过滤器:过滤器1和过滤器2
1执行---> 2执行 ---> 资源执行 ---> 2执行 ---> 1执行
过滤器先后顺序:
按照类名的字符串比较规则比较,值小的先执行
如 AFilter 和 Bfilter A先执行
谁定义在上面,谁先执行
概念:web的三大组件之一
事件监听机制:
ServletContextListener:监听ServletContext对象的创建和销毁
方法:
步骤:
web.xml中:
指定初始化参数:
注解:
@WebListener 即可