HTTP
- web浏览器与web服务器之间的一问一答的交互过程,必须遵循一定的规则,就是HTTP协议。HTTP是hypertext transfer protocol(超文本传输协议)的简写,他是TCP/IP协议之上的一个应用层协议,用于定义web浏览器和web服务器之间交换数据的过程以及数据本身的格式。
- HTTP协议到底约束了什么
1)约束了浏览器以何种格式向服务端发送数据
2)约束了服务器应该以何种格式来接收客户端发送的数据
3)约束了服务器应该以何种格式来反馈数据给浏览器
4)约束了浏览器应该以何种格式来接收服务器反馈的数据。 - HTTP1.0规范
每次请求都要新建连接,响应结束后断开连接,连接不会复用效率较低。
HTTP1.1规范
在一次请求结束后会保持连接一段时间,下次再次请求时可以复用连接,提高了效率。 - 请求信息
1)请求行(位于第一行)
2)请求头
3)请求实体:从第一个空行开始,后面的都是正文(可以没有)。只有POST请求才有请求实体。 - 响应信息
1)状态行(位于第一行)
200 表示成功处理完成请求
302 表示请求重定向
304 表示通知浏览器使用缓存中的资源
307 表示通知浏览器使用缓存中的资源
404 找不到资源
500 服务器端错误
2)响应头
3)响应正文:从第一个空行开始,后面的都是正文。
GET请求和POST请求
- GET的请求数据在浏览器的地址栏(不安全),而POST不会。POST比GET更安全
- GET的请求信息存放于请求行中,而POST的请求信息存放于请求实体中。
- GET方式请求的数据不能超过2k,而POST没有上限(比如文件上传是,必须使用POST方式)
- GET可以缓存,而POST没有缓存。
注意:查询的时候使用GET,其他时候使用POST。(表单全部使用POST提交)
WEB服务器
- Servlet容器
能够运行Servlet/JSP(动态资源开发技术)的环境就叫做Servlet容器。 - web容器
能够运行web应用的环境叫做web容器。 - web服务器
1)web容器/Servlet容器具体来说就是web服务器。
2)常见的web服务器有:Tomcat、WebSphere、WebLogic等。 - 虚拟主机
tomcat中可以配置管理多个网站,外界在访问这些网站时,并不知道这些网站是运行在同一个tomcat中的,感觉起来就像他们各自运行在各自的虚拟出来的主机中一样,所以将一个网站交给tomcat去管理的过程称为为tomcat配置一台虚拟主机。 - web应用
web资源按照一定的规则整合起来组成能够被web访问的应用程序就叫做web应用
Servlet
- Servlet是sun公司提供的一门用于开发动态web资源的技术。按照这套规范写出来的Servlet可以放置到web应用中在Servlet容器中运行。
- 开发一个Servlet只需要两个步骤:
1)写一个类实现javax.servlet接口。
2)在web.xml中为servlet配置对外访问路径。
- Servlet的生命周期
1)Servlet第一次被访问时,创建对象,创建出来后会立即执行init()方法进行初始化的操作。
2)从此以后该对象一直驻留在内存中,为后续的对本Servlet的请求进行服务,调用service()方法。
3)直到服务器关闭或web应用被移出容器时,随着web应用的销毁Servlet对象也会被销毁,但在销毁之前会调用destroy()方法执行一些善后的工作。 - Servlet的请求流程
1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址。
2)浏览器根据ip地址和端口号访问服务器,组织http请求信息发送给服务器。
3)服务器收到请求后首先根据Host请求头判断当前访问的是哪台虚拟主机。
4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应用。
5)服务器根据http请求头中的请求URL判断当前访问的是web应用中的哪个web资源。
6)检查web应用的web.xml文件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet处理。 - Servlet线程安全问题
1)造成的根本原因:Servlet是单例的,Servlet中的非static的成员变量只有一份,多个客户端好比是多个线程,都访问的是同一个空间。
2)解决方案:
① 让当前的Servlet实现javax.servlet.SingleThreadModel接口。包装只有一个线程放Servlet,如果有多个线程就排队。如此的话,性能超低(已过时)
② 在Servlet中,不要使用成员变量,使用局部变量。每一个用户,每一个请求都会调用service方法,而局部变量在service方法中,每一次都是新的空间。
Cookie
- 解决的问题:HTTP的无状态连接,使得在一次会话中,多个请求之间无法共享数据,无法跟踪用户的会话信息。
- Cookie是客户端技术。程序吧每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。、
- Cookie的操作
4. Cookie的缺陷
Session
- Session是服务器端的技术。利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于sessin为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务。
- Session的操作
- Session的细节
转发和重定向
- 请求转发的特点
1)浏览器地址栏不发生改变
2)请求转发只发送一个请求
3)共享同一个请求中的数据
4)最终响应给浏览器的由转发后的Servlet来决定
5)请求转发不能跨域访问,只能跳转到当前应用中的资源
6)请求转发可以访问WEB/INF目录下的资源 - URL重定向的特点
1)浏览器的地址栏发生改变
2)URL重定向发送了两次请求
3)不共享请求中的数据
4)最终响应给浏览器的由Servlet2来决定(把目标地址拷贝到浏览器地址栏,敲回车)
5)URL重定向能跨域访问,可以访问其他应用中的资源
6)URL重定向不能访问WEB/INF目录下的资源 - 如何选择
1)必须使用请求转发(forword)
① 如果需要共享请求中的数据
② 如果需要访问WEB/INF中的资源
2)如果需要跨域访问,避免表单的重复提交,只能使用URL重定向。 - forward和redirect的区別
① forward浏览器的地址栏不变;redirect地址栏发生改变
② forward发送一个请求;redirect发送两次请求
③ forward共享请求中的数据;redirect不共享
④ forward不能跨域访问;redirect可以跨域访问
⑤ forward可以访问WEB/INF目录下的资源;redirect不可以
JSP
-
Servlet是JavaWeb提供的动态资源开发技术,是以java的程序的形式进行开发,在java中书写HTML标签是一件十分头疼的事情,所以人们开发出了JSP,看起来像是HTML一样,但可以在其中写java代码,本质上是动态web资源,Jsp会在第一次访问时被容器翻译为Servlet。
-
JSP的三大指令
1)page:表示jsp页面相关的配置信息
2)include:引入其他页面的内容
3)taglib:用来引入标签库 -
JSP九大内置对象
- JSP四大作用域
- JSP四大作用域
EL表达式
- 目的:从作用域中获取指定属性名的共享数据。
- 语法:${msg}
- EL从作用域中查询指定属性名的共享数据,是按顺序查找的:page、request、session、application
过滤器
-
过滤器可以对所有的请求或者响应做拦截操作
-
过滤器在开发中的运用
1)可以对请求中的字符做编码
2)登录验证过滤器
3)敏感字过滤
4)做MVC框架中的前端控制器(处理所有请求共同的操作,再分发) -
Filter开发步骤
-
Filter的dispatcher:表示对哪些动作进行过滤
-
FilterChain(过滤器链):多个过滤器按照一定的顺序,排列起来。
注意:配置多个过滤器的时候,过滤器的先后顺序由web.xml中配置的的先后顺序来决定。 -
请求编码过滤器:CharacterEncodingFilter
-
Filter和Servlet的区别
① servlet流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在业务处理之前进行控制.
② filter流程是线性的,url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
filter主要用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等 -
Filter和Servlet的执行顺序
Filter的调用顺序:
1. 按照web.xml中的映射配置顺序,按照配置条件从后向前调用
2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容(filter-mapping的name先调用doFilter方法,但是每个dofilter方法的内部存在chain.dofilter,会调用下一个filter-mapping,一直到不存在下一个filter后在返回,执行chain.dofilter()后面的代码)(相当于递归调用)
3. 调用Servlet中的service()方法
4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反Servlet的调用顺序:
按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题.
监听器(Listener)
- 主要用于监听作用域对象的创建,监听作用域对象属性的添加/删除/替换;
1)监听作用域对象的创建和销毁
ServletRequestListener:监听请求对象的创建和销毁
HttpSessionListener:监听会话对象(session)的创建和销毁
ServletContextListener:监听应用的创建和销毁
2)监听作用域对象的属性的添加/删除/替换
ServletRequestAttributeListener:监听request作用域中属性的添加/删除/替换
HttpSessionAttributeListener:监听session作用域中属性的添加/删除/替换 - Web中的监听器组件,没有初始化参数,如果要解决监听器中的硬编码,只能使用全局的初始化参数。