B/S( Browser / Server)
:即浏览器/服务器,访问的网站资源存放在服务器,无论服务器存放什么,客户端只需要安装一个浏览器,通过这个浏览器访问服务器的资源,B/S架构也有客户端,用户使用浏览器访问,浏览器和用户就是客户端。
C/S(Client/Server)
:即客户端/服务器, 控制台程序(命令行程序),桌面程序(Winows程序),例如QQ,视频播放器,迅雷下载;
静态资源与动态资源的区别?
客户端请求的页面如果是静态网页,那么服务器会直接把静态网页的内容响应给客户端;如果客户端请求的是动态网页,服务器要先把动态网页转换成静态网页,然后再把转换后的静态网页响应给客户端。
协议:双方通信的格式,协议的甲乙双方就是客户端(浏览器)和服务器。
HTTP协议:即超文本传输协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。其实我们要学习的就是这两个格式!客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。
http是应用层协议,TCP/UDP是传输层协议
请求响应的步骤:
在浏览器地址栏输入URL,按下回车后发生了什么?
请求(request)协议的格式:
浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!
get请求:get请求没有请求体
post请求:POST请求有请求体
响应内容:响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示。
响应协议格式:
响应码:
Servlet
是JavaWeb
的三大组件(Servlet
,Listener
,Filter
)之一,它属于动态资源。Servlet
的作用是处理请求,服务器会把接收到的请求交给Servlet
来处理,在Servlet
中通常需要:
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
实现Servlet
有三种方式:
javax.servlet.Servle
t接口;javax.servlet.GenericServlet
类;抽象类,实现了Servlet
接口javax.servlet.http.HttpServlet
类;GenericServlet
类的子类Servlet的生命周期: 初始化、服务,以及销毁。与Servlet的生命周期相关的方法有:
void init(ServletConfig config)
;void service(ServletRequest request, ServletResponse response)
;void destroy()
;Servlet
的创建:
服务器会在Servlet
第一次被访问时创建Servlet
,或者是在服务器启动时创建Servlet
。如果服务器启动时就创建Servlet
,那么还需要在web.xml
文件中配置。也就是说默认情况下,Servlet
是在第一次被访问时由服务器创建的。
让服务器在启动时就创建Servlet
,在元素中配置元素可以让服务器在启动时就创建该Servlet
,其中
元素的值必须是大于等于0的整数,它的使用是服务器启动时创建Servlet
的顺序。
一个Servlet
类型,服务器只创建一个实例对象;在Servlet
被创建后,服务器会马上调用Servlet
的void init(ServletConfig config)
方法。我们可以把一些对Servlet
的初始化工作放到init()
方法中!
Servlet
服务:
当服务器每次接收到请求时,都会去调用Servlet
的service()
方法来处理请求。服务器接收到一次请求,就会调用service()
方法一次,所以service()
方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()
方法中!
Servlet
的销毁:
Servlet
是不会轻易销毁的,通常都是在服务器关闭时Servlet
才会销毁!在服务器被关闭时,服务器会去销毁Servlet
,在销毁Servlet
之前服务器会先去调用Servlet
的destroy()
方法,我们可以把对某些资源的释放等代码放到destroy()
方法中。
测试生命周期方法:
在首次访问HelloServlet
时,init()
方法会被执行,而且也会执行service()
方法。再次访问时,只会执行service()
方法,不再执行init()
方法。在关闭Tomcat
时会调用destroy()
方法。
Servlet
接口相关类型:
ServletConfig
:init()
方法的参数,它表示Servlet
配置对象,它对应Servlet
的配置信息,那对应web.xml
文件中的
元素。ServletRequest
:service()
方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;ServletResponse
:service()
方法的参数,它表示响应对象,在service()
方法中完成对客户端的响应需要使用这个对象;Servlet不是线程安全的,但效率高
线程不安全的三个条件
如何避免线程不安全:
Servlet
一般就这么用 HttpServlet
类是GenericServlet
的子类,它提供了对HTTP
请求的特殊支持,所以通常我们都会通过继承HttpServlet
来完成自定义的Servlet
。
HttpServlet
覆盖了service()
方法,源代码如下:
doGet()和doPost():
在HttpServlet
的service(HttpServletRequest req, HttpServletResponse resp)
方法会去判断当前请求是GET
还是POST
,如果是GET
请求,那么会去调用本类的doGet()
方法,如果是POST
请求会去调用doPost()
方法,这说明我们在子类中去覆盖doGet()
或doPost()
方法即可。
由于现在都是使用SpringBoot进行项目开发,很少会去自定义Servlet
,这里就不再赘述关于ServletConfig
、Request
、Response
、域对象以及编码等相关细节。
JSP(Java Server Pages)
是JavaWeb
服务器端的动态资源。它与html
页面的作用是相同的,显示数据和获取数据。
JSP
= html
+ ·Java·脚本(Java
代码) + JSP
标签(指令,JSP
标签库,EL
表达式,JSTL
) , Web2.0 :jsp页面中使用标签替换Java代码
JSP脚本就是Java代码片段,它分为三种:
<%...%>
:Java语句;方法中能写的代码,它都能写<%=…%>
:Java表达式;resp.getWriter().Write(“”)
;write
能输出什么,它就能写什么,就是做输出<%!...%>
:Java定义类成员;类中能写的代码,他都能写(定义成员变量和方法),极少使用Cookie
Cookie
是HTTP
协议的规范之一,它是服务器和客户端之间传输的小数据。Cookie
传输给客户端,客户端会将Cookie
保存起来。Cookie
,发送给服务器。Cookie
就是服务器保存在客户端的数据!Cookie
就是一个键值对!!!Cookie
规范
Cookie
通过请求头和响应头在服务器与客户端之间传输;Cookie
大小限制在4KB
之内;20
个Cookie
;300
个Cookie
;Cookie
规范是如此,但在今天,浏览器厂商的竞争异常激烈,所以多少会超出Cookie
规则的限制。但也不会超出过多!什么是session
在WEB
开发中,服务器可以为每个用户浏览器创建一个会话对象(session
对象),注意:一个浏览器独占一个session
对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session
中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session
中取出该用户的数据,为用户服务。
session
的原理
session
是依赖Cookie
实现的。session
是服务器端对象,当用户第一次使用session
时(表示第一次请求服务器),服务器会创建session
,并创建一个Cookie
,在Cookie
中保存了session
的id
,发送给客户端。这样客户端就有了自己session
的id
了。但这个Cookie
只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie
就会丢失,也就丢失了sessionId
。
当用户第二次访问服务器时,会在请求中把保存了sessionId
的Cookie
发送给服务器,服务器通过sessionId
查找session
对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session
对象。这样也就可以让多个请求共享同一个session
了。
当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId
,那么服务器会创建一个session
,再把sessionId
通过Cookie
保存到浏览器中,也是一个新的会话开始了。原来的session
会因为长时间无法访问而失效。
当用户打开某个服务器页面长时间没动作时,这样session
会超时失效,当用户再有活动时,服务器通过用户提供的sessionId
已经找不到session
对象了,那么服务器还是会创建一个新的session
对象,再把新的sessionId
保存到客户端。这也是一个新的会话开始了。
session
与浏览器 session
对象是保存在服务器端的,而sessionId
是通过Cookie
保存在客户端的。
因为Cookie
不能在多个浏览器中共享,所以session
也不能在多个浏览器中共享。也就是说,使用IE
登录后,再使用FireFox
访问服务器还是没有登录的状态。而且同时打开多个相同浏览器的窗口,是在使用同一session
。如果你使用的是老浏览器,例如IE6
,那么就会每个窗口一个session
。
Session
和Cookie
的主要区别:session
存储在服务器端,cookie
存储在浏览器端cookie
安全性更低,由于数据存储在浏览器,可以被伪造和修改Cookie
大小限制在4KB
之内;一台服务器在一个客户端最多保存20
个Cookie
;一个浏览器最多可以保存300
个Cookie
;