JavaWeb基础

B/S 和 C/S 的区别

  1. B/S( Browser / Server):即浏览器/服务器,访问的网站资源存放在服务器,无论服务器存放什么,客户端只需要安装一个浏览器,通过这个浏览器访问服务器的资源,B/S架构也有客户端,用户使用浏览器访问,浏览器和用户就是客户端。
    • 优点:只需要编写服务器端程序,软件升级方便,只需要更新服务器端。
    • 缺点:安全性较差,图形界面功能比较弱
  2. C/S(Client/Server):即客户端/服务器, 控制台程序(命令行程序),桌面程序(Winows程序),例如QQ,视频播放器,迅雷下载;
    • 优点:安全性比较 好,图形界面功能更强大

Web资源

  • 静态资源:html ,css, 图片, js脚本代码,浏览器能够独立执行
  • 动态资源:浏览器无法识别执行,需要服务器将动态资源转化成静态资源,最后由浏览器执行

静态资源与动态资源的区别?
  客户端请求的页面如果是静态网页,那么服务器会直接把静态网页的内容响应给客户端;如果客户端请求的是动态网页,服务器要先把动态网页转换成静态网页,然后再把转换后的静态网页响应给客户端。

HTTP协议

协议:双方通信的格式,协议的甲乙双方就是客户端(浏览器)和服务器。

  • 请求协议:request
  • 响应协议:response

  HTTP协议:即超文本传输协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。其实我们要学习的就是这两个格式!客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。

http是应用层协议,TCP/UDP是传输层协议

  • 特点:支持客户端/服务器模式,简单快速,灵活,无连接,无状态
  • 版本:http1.0 ,http1.1,http2.0
  • http1.1引入了长连接,也是应用最广泛的
  • http请求报文:
    • 请求行:请求方式 空格 URL 协议版本号
    • 请求头信息:host到cookie
    • 空行:
    • 请求正文:

请求响应的步骤:

  1. 客户端连接到WEB服务器(默认端口号为80),建立TCP套接字连接
  2. 发送HTTP请求
  3. 服务器接收HTTP请求并返回HTTP响应
  4. 释放连接TCP连接

在浏览器地址栏输入URL,按下回车后发生了什么?

  1. 域名DNS解析:根据URL逐层查询DNS服务器缓存,解析URL中域名所对应的IP地址
  2. TCP连接:三次握手
  3. 发送HTTP请求
  4. 服务器处理响应并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 连接结束:四次挥手
请求协议

请求(request)协议的格式:

  1. 请求首行;
  2. 请求头信息;
  3. 空行;
  4. 请求体(请求正文):

浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!

get请求:get请求没有请求体

  • 直接请求页面
  • 页面中点击超链接
  • 表单的默认提交

post请求:POST请求有请求体

  • 表单提交,设置method=”post”
响应协议
  1. 响应内容:响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示。

  2. 响应协议格式:

    1. 响应首行;
    2. 响应头信息;
    3. 空行;
    4. 响应体:
  3. 响应码:

    • 响应头对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功了,302表示重定向,这说明浏览器需要再发一个新的请求。
    • 常见的响应码:
      • 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
      • 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
      • 500:请求资源找到了,但服务器内部出现了错误;
      • 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务 器会发送一个响应头Location,它指定了新请求的URL地址;
      • 其他响应头:自动刷新响应头,浏览器会在3秒之后请求http://www.baidu.com

Servlet

什么是Servlet

  ServletJavaWeb的三大组件(Servlet,Listener,Filter)之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  1. 接收请求数据;
  2. 处理请求;
  3. 完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。

实现Servlet有三种方式:

  1. 实现javax.servlet.Servlet接口;
  2. 继承javax.servlet.GenericServlet类;抽象类,实现了Servlet接口
  3. 继承javax.servlet.http.HttpServlet类;GenericServlet类的子类
Servlet接口

Servlet的生命周期: 初始化、服务,以及销毁。与Servlet的生命周期相关的方法有:

  • void init(ServletConfig config)
  • void service(ServletRequest request, ServletResponse response)
  • void destroy()
    JavaWeb基础_第1张图片
  1. Servlet的创建:
      服务器会在Servlet第一次被访问时创建Servlet,或者是在服务器启动时创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。
      让服务器在启动时就创建Servlet,在元素中配置元素可以让服务器在启动时就创建该Servlet,其中元素的值必须是大于等于0的整数,它的使用是服务器启动时创建Servlet的顺序。
      一个Servlet类型,服务器只创建一个实例对象;在Servlet被创建后,服务器会马上调用Servletvoid init(ServletConfig config)方法。我们可以把一些对Servlet的初始化工作放到init()方法中!

  2. Servlet服务:
      当服务器每次接收到请求时,都会去调用Servletservice()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

  3. Servlet的销毁:
      Servlet是不会轻易销毁的,通常都是在服务器关闭时Servlet才会销毁!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servletdestroy()方法,我们可以把对某些资源的释放等代码放到destroy()方法中。

测试生命周期方法:
  在首次访问HelloServlet时,init()方法会被执行,而且也会执行service()方法。再次访问时,只会执行service()方法,不再执行init()方法。在关闭Tomcat时会调用destroy()方法。

Servlet接口相关类型:

  • ServletConfiginit()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的元素。
  • ServletRequestservice() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
  • ServletResponseservice()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;

Servlet不是线程安全的,但效率高

线程不安全的三个条件

  1. 多线程环境
  2. 共享数据
  3. 多条语句同时操作共享数据

如何避免线程不安全:

  • 不定义成员变量
  • 只读成员变量
  • 定义无状态的成员变量(对象没有属性) —— Servlet一般就这么用
HttpServlet

  HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet

  HttpServlet覆盖了service()方法,源代码如下:
JavaWeb基础_第2张图片JavaWeb基础_第3张图片
doGet()和doPost():
  在HttpServletservice(HttpServletRequest req, HttpServletResponse resp)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()doPost()方法即可。

  由于现在都是使用SpringBoot进行项目开发,很少会去自定义Servlet,这里就不再赘述关于ServletConfigRequestResponse、域对象以及编码等相关细节。

JSP

什么是JSP

  JSP(Java Server Pages)JavaWeb服务器端的动态资源。它与html页面的作用是相同的,显示数据和获取数据。
  JSP = html + ·Java·脚本(Java代码) + JSP标签(指令,JSP标签库,EL表达式,JSTL) , Web2.0 :jsp页面中使用标签替换Java代码

JSP语法

JSP脚本就是Java代码片段,它分为三种:

  1. <%...%>:Java语句;方法中能写的代码,它都能写
  2. <%=…%>:Java表达式;resp.getWriter().Write(“”)write能输出什么,它就能写什么,就是做输出
  3. <%!...%>:Java定义类成员;类中能写的代码,他都能写(定义成员变量和方法),极少使用

会话跟踪

  1. 什么是会话
    • 用户拨打10086,从服务台接通后会话开始;
    • 用户发出话费查询请求,服务台响应。这是该会话中的一个请求;
    • 用户发出套餐变更请求,服务台响应。这是该会话中的又一个请求;
    • 用户挂断电话,会话结束。
  2. 会话的特性
    • 一个会话中可能包含多个请求;
    • 一个会话中发出请求的用户是唯一的;
  3. JavaWeb会话
    • 从用户打开本站第一个页面开始,会话也开始了;
    • 用户会发出0~n个请求;
    • 用户关闭浏览器会话结束了。
  4. 什么是会话跟踪技术
    • HTTP是无状态协议,也就是没有记忆力的协议,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。这说明需要使用额外的手段来跟踪会话!
    • 在一个会话中共享数据即会话跟踪技术
Cookie
  1. 什么是Cookie
    • CookieHTTP协议的规范之一,它是服务器和客户端之间传输的小数据。
    • 首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来。
    • 当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的Cookie,发送给服务器。
    • Cookie就是服务器保存在客户端的数据!
    • Cookie就是一个键值对!!!
  2. Cookie规范
    • Cookie通过请求头和响应头在服务器与客户端之间传输;
    • Cookie大小限制在4KB之内;
    • 一台服务器在一个客户端最多保存20Cookie
    • 一个浏览器最多可以保存300Cookie
    • 虽然Cookie规范是如此,但在今天,浏览器厂商的竞争异常激烈,所以多少会超出Cookie规则的限制。但也不会超出过多!
Session
  1. 什么是session
      在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

  2. session的原理
      session是依赖Cookie实现的。session是服务器端对象,当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,并创建一个Cookie,在Cookie中保存了sessionid,发送给客户端。这样客户端就有了自己sessionid了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId
      当用户第二次访问服务器时,会在请求中把保存了sessionIdCookie发送给服务器,服务器通过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

SessionCookie的主要区别:
  1. 存储位置不同:session存储在服务器端,cookie存储在浏览器端
  2. 安全性不同:cookie安全性更低,由于数据存储在浏览器,可以被伪造和修改
  3. 容量和个数限制: Cookie大小限制在4KB之内;一台服务器在一个客户端最多保存20Cookie;一个浏览器最多可以保存300Cookie

你可能感兴趣的:(Java,java,web)