javaweb-总览

423 阅读19分钟

一、 通信模型

B/S通信模型:

B:Browser --> 浏览器

  1. 安装在客户端的软件
  2. 可向任意服务器发送请求,索要资源文件
  3. 可将服务器返回的【二进制数据】解析为【文字、图片、视频、...】

S: Server --> software 服务器软件

  1. 常说的服务器是软件,不是硬件
  2. 服务器软件专门安装在服务端计算机上
  3. 可接收任意浏览器发送的请求
  4. 自动地在服务端计算机上定位被访问的资源文件
  5. 自动地将定位的资源文件内容以二进制形式发送回发起请求浏览器上
  6. 因为服务端要应对大量客户端请求,因此需要处理高并发的问题

二、共享资源文件

1. 定义

通过网络传输的任意文件

2. http服务器对于共享资源文件的分类

  1. 静态资源文件
  2. 动态资源文件

3.静态资源文件

  1. 文件内容固定

    如文档,图片,视频

  2. 只能在 浏览器 编译执行

    如命令(.html / .css / .js)

  3. 浏览器向http服务器请求静态资源文件的流程

    浏览器通过url(包括协议包,服务器ip,端口,目录,文件名称如 http://localhost:8080/myWeb/car.jpg)发送http请求包(包括请求行,请求头(包含请求参数信息、请求方式信息),空白行,请求体信息)给服务器,服务器通过解析,去调对应文件夹下的静态资源(webapps层级之下的目录,如webapps/myWeb/car.jpg),编码为响应包,推回给浏览器,浏览器根据响应包信息进行解析,将信息显示在浏览器

4. 动态资源文件

  1. 只能在 服务端 编译执行

    如命令(.class)

5. 服务器调用静态文件和动态文件的区别

1). 调用静态文件时

Http服务器 直接 通过【输出流】将静态文件中内容以【二进制形式】推送给发起请求的浏览器

2). 调用动态文件时

Http服务器 需要创建当前class文件的实例对象 ,通过实例对象调用对应方法处理用户请求,通过【输出流】将运行结果以【二进制形式】推送给发起请求的浏览器

3). 第一版互联网通信流程图

三、浏览器与服务器通信的载体

1. 网络协议包

  1. 在网络中传递信息都是以【二进制】形式存在

  2. 接收方【浏览器/服务器】在接收信息后,首先将【二进制数据】进行编译【文字,图片,视频,命令】

  3. 传递信息数据量比较巨大,导致接收方很难在一组连续二进制数据中得到对应数据

     比如,浏览器发送一个请求:http://192.168.0.1:8080/index.html
     二进制形式可能就是:010000110011110101010001010001001
     
     
    
  4. 网络协议包是一组有规律二进制数据,在这组数据存在了固定空间,每一个空间专门存放特定信息,方便接收方编译数据 【0000(ip) 0110(port) 1100(resource)】

2. 常见网络协议

  1. FTP网络协议包
  2. Http网络协议包

3. Http网络协议包

在基于B/S结构下互联网通信过程中,所有在网络中传递信息都是保存在Http网络协议包

分类:

  1. Http请求协议包

     在浏览器准备发送请求时,创建了一个HTTP请求协议包,将请求信息以二进制形式保存在对应各个控件,由浏览器负责将HTTP请求协议包推送到指定服务端计算机
    
  2. Http响应协议包

     Http服务器在定位到被访问的资源文件之后,负责创建一个Http响应协议包
     Http服务器将定位文件内容或者文件命令以二进制形式写入到Http响应协议包中的各个空间,并将其推送回发起请求的浏览器上
    

4. Http请求协议包内部空间结构【重要】

  1. 自上而下,分为4个空间

  2. 空间划分:

     请求行:[ 			url:请求地址(http://192.168.0.1:8080/index.html) 			method:请求方式(POST/GET) 		]
             
     请求头:[ 			请求参数信息【GET方式】 		 		]
             
     空白行: [ 			没有任何内容,分隔 		]
     
     
     请求体: [ 			请求参数信息【POST方式】 		]
             
             
             
    
  3. 图解

5. Http响应协议包内部空间结构【重要】

  1. 自上而下,分为4个空间

  2. 空间划分:

     状态行:[ 			Http状态码:200OK 404NotFound 		]
             
     响应头:[ 			content-type:指定浏览器采用对应编译器             			  对响应体二进制数据进行解析 		 		]
             
     空白行: [ 			没有任何内容,分隔 		]
     
     
     响应体: [ 			可能被访问静态资源文件内容/文件命令             可能被访问动态文件运行结果             ******都以二进制形式******** 		]
             
             
             
    
  3. 图解

四、开发人员在互联网通信流程中的任务

1. 控制浏览器的行为

1). 控制浏览器请求行为【三要素】

  1. 控制浏览器发送的请求地址

    A.Html浏览器页面请求地址

    a. <a href="网址">显示超链接信息</a>

    b.

    ``

  2. 控制浏览器发送的请求方式

    A. Html浏览器页面请求方式

    a. 请求方式:决定浏览器在发送请求时的行为特征

    b. 可选请求方式

    共7种,只考虑2种:

    【post】

     1. 可以携带任意数量的【请求参数数量】(可能是病毒文件)
     2. 必须在浏览器的地址栏上【隐藏】请求参数信息
     3. 必须将请求参数信息保存在Http请求协议包中【请求体】
     4. 接收到服务器返回的资源文件内容后,禁止保存内容,防止实时信息失真
     
     
     ========================================
     使用get请求方式的情形
     
     1. 表单标签可以指定method方法为post请求方式
     
     
    

    【get】

     1. 携带的【请求参数数量】不能超过4K
     2. 必须在浏览器的地址栏上将【请求参数信息】展示出来
     3. 必须将【请求参数信息】保存在Http请求协议包中【请求头】 
     4. 接收到服务器返回的资源文件内容后,必须将资源文件内容保存在浏览器的缓存,防止重复请求
    
     ===============================
     
     使用get请求方式的情形
    
     1. 执行超链接标签命令时,要求浏览器必须采用get方式发送请求
     2. 表单标签存在一个method属性,通过这个属性可以要求浏览器采用对应请求方式发送请求,默认以get方式发送请求
    

    c. 两种请求方式使用场景【面试】

     1. 考虑到post请求方式,用户可以将【病毒文件内容】发送到服务器上进行攻击。因此绝大多数门户级网站拒接post请求。日常开发过程绝大多数请求都是get
     2. 在某些特殊场景下必须使用post
         1). 文件上传,必须使用post(针对病毒问题,可用相关命令检测后缀名为exe的文件)
         2). 发起登录验证请求,必须使用post
         3). 索要服务器中实时变化数据时(股票价格,车票数量),必须使用post
    
  3. 控制浏览器发送的请求参数

    A. Html浏览器页面发送请求参数

    a. 请求参数作用

     1. 当用户通过浏览器访问服务端计算机动态资源文件时,动态资源文件的class类需要参数进行运算,这些参数由用户通过浏览器以请求参数方式提供
    

    b. 请求参数格式

     1. 浏览器发送请求时 
         请求地址?请求参数名1 = 值1 & 请求参数名2 = 值2
         
    

    c. 发送请求时携带的请求参数来源

     1. 通过超链接标签命令指定请求参数
     
         <a href="http://www.baidu.com?userName = nike&password=123"></a>
         写死了 当除nike之外的人访问,还需要重写该语句
    
     2. 通过表单标签命令指定请求参数
         1). 一组声明在form标签内部的标签命令
         2). 提示用户填写对应的【请求参数内容】
         3). 所有的表单域标签都拥有两个属性【name,value】
         name属性声明【请求参数名】,value属性声明【请求参数内容】
         
             <form action="http://www.baidu.com">
                 <input type ="text" name ="userName" value ="mike"/>
                 <input type="submit"/>
             </form>
             
             当用户单击submit按钮时,发送请求信息http://www.baidu.com?userName = mike
             
             当用户在html页面中将mike改为nike时,请求信息变为http://www.baidu.com?userName=nike
     
     3. 表单域标签分类
         
         1). <input/>
             <html>
                 <form action="http://www.baidu.com">
                     用户姓名:<input type = "text" name="userName"/><br/>
                     密码:<input type ="password" name ="password"/><br/>   
                     <!--radio单选框根据name划分为一组-->
                     性别:<input type ="radio" name ="sex" value ="man"/><input type ="radio" name ="sex" value="woman"/><br/>
                     <input type ="submit"/>
                 </form>
         2). <select></select>
             下拉列表标签
         3). <textarea></textarea>、
             多行文本框
             
             
     4. HTML标签属性分类
     
         1). 基本属性
         
             id、name、...
             
         2). 样式属性
         
             <div></div>
             
         3). 工作状态属性
         
             checked、disabled、readOnly、selected
             
         4). 监听属性
         
             监听用户与Html标签(浏览器)之间进行通信的通道,当监听属性监听到用户对标签进行指定操作时,监听属性将会通知浏览器调用对应JavaScript方法处理当前请求
             
             onClicked,onmouseover
    

    d. 表单域标签作为请求参数的条件

     1. 必须声明在<form/> 2. 必须声明name属性
     3. 对于radio和checkbox,必须在被选中的条件下
     4. 不能被disabled修饰,readOnly虽然信息同样不能被修改,但可以作为参数传输
    

2). 控制浏览器接收结果行为

  1. 控制浏览器采取对应【编译器】将数据二进制数据解析为【文字,图片,视频,命令(.html /.css / .js)】

  2. 控制浏览器将解析内容或命令进行执行与展示

    (全局刷新展示/局部刷新展示--> AJAX)

  3. 控制用户浏览器之间的交流

    (js -->升级 jQuery)

    一、javaScript

    1. 弱类型编程语言风格

    认为对象行为不应该收到其修饰类型约束,可以根据实际需要来决定对象可以调用的属性和方法

    JavaScript采用【弱类型编程语言风格】对【面向对象思想】来进行实现的编程语言

    //开发容易,维护难,不了解其他人开发时的属性和方法
    var stu = new Object();
    stu.car = "porscher"
    stu.play = function(){return "play day by day"}
    stu.paly();
    

2. 开发动态资源文件来解决用户请求

1). 服务器

本质是一种软件,不是计算机

不同服务器负责调用不同文件类型

在商业开发中,往往需要JAVA类与 不同服务器 进行沟通来解决当前业务,由于Java需要与13种不同服务器进行沟通,因此sun公司根据13种服务器特征制定了13套接口,这13套接口统称为JAVAEE规范,不同接口实现类由不同服务器厂商提供。服务器厂商将接口实现类以jar包形式提供

1、Http服务器

1). Http服务器,其行为与Http协议相关

2). Http服务器可以接收来自于浏览器发送的Http请求协议包,并自动对Http协议包内容进行解析

3). 解析后,自动定位被访问的文件,并将定位的文件内容写入到Http响应协议包中

4). 最后,负责将Http响应协议包推送回发起请求的浏览器上

动态资源文件必须是一个Servlet接口的实现类,Tomcat服务器内部提供ServletAPI的jar包

Servlet生命周期:1. 创建servlet对象;2. 调用init()方法初始化;3. 调用service()方法响应请求;4. 长时间没被调用或者服务器关闭,调用destroy()方法销毁

状态码:响应状态写到响应包中,给到浏览器

范围100-599,分为5个大类

100:通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续索要资源文件

200:通知浏览器本次返回的资源文件是完整独立的资源文件

302:通知浏览器本次返回的不是资源文件的内容,而是资源文件的地址,需要浏览器通过地址重新发送请求索要资源

不正常的状态码:

404:通知浏览器,由于在服务端无法定位到请求的资源文件

405:通知浏览器,服务端中已经定位到被访问的资源文件(servlet),但这个servlet对于浏览器的请求方式无法处理

500:通知浏览器,已经定位资源文件(servlet),但servlet由于处理异常 ,响应失败

重定向:

服务器端返回302状态码,将新的地址写入location行中,浏览器从location中拿到地址继续访问资源

请求转发:

服务器通过当前请求对象代替浏览器向tomcat发送新的请求以调用新的servlet

Cookie

Cookie来自于Servlet规范中一个工具类

如果两个Servlet来自于同一个网站,并且为同一个浏览器提供服务,借助cookie对象进行数据共享

Session来自于Servlet规范中一个工具类

如果两个Servlet来自于同一个网站,并且为同一个浏览器提供服务,借助session对象进行数据共享

习惯于 将session接口修饰对象称为会话作用域对象

session和cookie区别

  1. 存储位置不同:cookie存放在客户端浏览器/硬盘中

session存放在服务器计算机内存中

  1. 数据类型不同:cookie存储共享数据类型只能是string

session对象可以存储任意类型共享数据

  1. 数据数量不同:一个cookie只能存储一个共享数据;session使用map集合存储共享数据,可以存储任意数量共享数据

  2. 参照物:cookie相当于客户在服务端的会员卡

session相当于客户在服务端的私人保险柜

监听器和过滤器接口都在tomcat服务器jar包中,但监听器接口需要开发人员亲自实现,用于监控作用域对象生命周期变化时刻以及作用域对象共享数据变化时刻

作用域对象:

  1. 在servlet规范中,认为可以在服务端内存中可以在某些条件下为两个servlet之间提供数据共享方案的对象,被称为作用域对象

  2. servlet规范下的作用域对象:

servletcontext:全局作用域对象

httpsession:会话作用域对象

httpservletrequest:请求作用域对象

  1. Spring框架

    1. IoC : 控制反转

    底层实现:反射

    1. 图解

    1. Aop : 面向切面编程

    底层实现: 动态代理

  2. SpringMVC

1). 意义

SpringMVC是基于spring的一个框架,实际上就是spring的一个模块,专门用于做web开发。理解为servlet的一个升级。

web 开发底层是servlet,框架是在servlet基础上加入了一些功能,使得做web开发更方便。Spring是容器,ioc能够通过使用,@Component等管理对象,springMVC能够创建对象,放入到容器中(SpringMVC容器),springMVC容器中的放的是使用@Controller声明的控制器对象

我们要做的是 使用@Controller创建控制器对象,把对象放入到springMVC容器中,把创建的对象作为控制器使用,这个控制器对象能接收用户的请求,显示处理结果,就当作是一个servlet使用。

使用@Controller注解创建的是一个普通类的对象,不是Servlet。springmvc赋予了控制器对象一些额外的功能。


web开发底层是servlet,springmvc中有一个对象是servlet:DispatherServlet(中央调度器)

DispatherServlet:负责接收用户的所有请求,用户把请求给了DispatherServlet,之后DispatherServlet把请求转发给我们的Controller对象,最后是Controller对象处理请求。

2). springmvc图解

![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d339049eab4b4bfdbea5649eb4dde2b5~tplv-k3u1fbpfcp-zoom-1.image)

3). 执行过程源代码分析

a) tomcat启动,创建容器的过程 

	通过load-on-start标签指定的1,创建DispatcherServlet对象(继承HttpServlet),是一个Servlet,在被创建时,执行init()方法,这个方法中
//创建容器,读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);

上面创建容器的作用:创建@Controller注解所在的类的对象,创建MyController对象,这个对象放入到springmvc的容器中,容器是map。类似map.put("myController",MyController对象);

b)请求的处理过程

	A. 执行servlet的service()
protected void service(HttpServletRequest request,HttpServiceResponse response)
//service调用doService方法
protected void doService(HttpServlet request,HttpServletResponse response)
  //接下来执行核心方法doDispatch()方法
this.doDispatch(request,response){
	调用MyController的.doSome()方法
};
  1. springmvc的含义

DispatcherServlet是前端控制器,自定义MyController是后端控制器,同属于C,数据处理结果为M,显示界面为V

  1. 导图

  1. 异常处理: springmvc框架采用的是统一,全局的异常处理 把controller中的所有异常处理都集中到一个地方,采用的是aop的思想,把业务逻辑和异常处理代码分开,解耦合 使用两个注解
  1. @ExceptionHandler
  2. @ControllerAdvice
  1. 拦截器:
  1. 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口

  2. 拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤请求参数,设置编码字符集等工作。拦截器是拦截用户的请求,做请求做判断处理的。

  3. 拦截器是全局的,可以对多个controller做拦截 一个项目中可以有0个或多个拦截器,他们一起拦截用户的请求。拦截器常用在:用户登录处理,权限检查,记录日志

  4. 拦截器的使用步骤: a.定义类实现Handlerinterceptor接口 b.在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在

  5. 拦截器的执行时间: a. 在请求处理之前,即controller类中的方法执行之前先被拦截 b. 在控制器方法执行之后也会执行拦截器 c. 在请求处理完成后也会执行拦截器

  1. springmvc内部调用流程图

2). 数据库服务器

  1. 数据库服务器(mySql):

    1). 一种专门对表文件进行调用和管理的软件

  2. 数据库:

    1). 本质就是 存放 表文件 的文件夹

  3. 表文件:

    1). 以 ".frm" 结尾的文件

    2). 存放于服务端计算机硬盘上

    3). 以 数据行 形式进行存储

  4. JDBC

    JAVA通过JDBC与数据库进行沟通

    1. JAVAEE中的一种规范

    2. 指定java类与关系型数据库服务器【mysql,oracle,sqlserver】之间的沟通规则

    3. JDBC接口规范在java.sql包中

    4. JDBC实现类由不同服务器厂商以jar包形式提供

  5. DAO封装

    1. 介绍

      1). DataBase Access Object 数据库访问对象

      2). 作用:数据库访问对象在开发时提供 针对某张表 的操作细节【增删改查】

      3). 优点:通过DAO可以避免反复的SQL命令书写;可以避免反复的JDBC开发步骤书写

      4). DAO类:提供数据库访问对象的类

    2. DAO类开发规则:

      1). 一个DAO类封装的是一张表操作细节(对一张表的增删改查)

      2). DAO类命名规则:表名+Dao 比如封装emp表-->EmpDao

      3). DAO类所在包命名规则:com.huoshan.dao

  6. 实体类(entity类)封装

    1. 一个实体类用于描述一张表结构

    2. 实体类的类名应该与关联的表名保持一致,但可以忽略大小写

    3. 实体类的属性应该与关联的表文件字段保持一致

    4. 实体类的一个实例对象用于在内存中存储对应的表文件中的一个数据行

    5. 包名可:com.huoshan.entity/com.huoshan.domain

  7. MyBatis框架

    1. 本质:增强版JDBC

    2. 组成

      1).sql mapper : sql映射

       可以把数据库的表中的一行数据 映射为 一个java对象。
       
       一行数据可以看作是一个java对象,实体类的一个实例,操作这个对象就相当于操作 表中的数据
      

      2). Data Access Objects(DAOs) : 数据访问

       对数据库进行增删改查
      
       
      
    3. 提供的功能

      1). 提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象

      2). 提供了执行sql语句的能力

      3). 提供了循环sql,将sql结果ResultSet转为java对象,List集合的能力

      4). 提供了关闭资源的能力

    4. 开发人员只需提供sql语句

      开发人员提供sql语句 --> Mybatis处理sql --> 开发人员得到处理结果java对象或集合

    5. 图解

      1. 基础使用步骤

      2. 动态代理使用步骤

      3. $ 与 # 的区别

      4. myBatis返回结果

      5. 动态sql

      6. 主配置文件

      7. 分页

3. 图解

图中所有带颜色模块

4. 第二版网络通信流程图

5. 第三版网络通信流程图

五、架构

1. 三层架构

  1. 界面层

    和用户打交道,接收用户的请求参数显示处理结果(jsp , html , servlet)

  2. 业务逻辑层

    接收了界面层传递的数据计算逻辑调用数据库获取数据

  3. 数据访问层

    访问数据库,执行对数据的增删改查

2. 三层架构对应的包

  1. 界面层:controller包(servlet)
  2. 业务逻辑层:service包(XXXService类)
  3. 数据访问层:dao包(XXXDao类),此外还有domain(或entity)包

3. 三层中类的交互

用户使用界面层--> 业务逻辑层 --> 数据访问层(持久层) --> 数据库(mysql)

4. 三层对应的处理架构

界面层 --- servlet --- SpringMVC框架 

业务逻辑层 --- service --- Spring框架

数据访问层 --- dao --- MyBatis框架

5. 框架

  1. 本质 本质是一个软件,半成品模板软件,定义好一些可复用的基础功能,需要加入自己的功能

  2. 特点

    框架一般针对某一方面,比如MyBatis针对数据库操作,不能做其他的

  3. 常用框架

    spring就是用来管理javabean(java对象)的容器框架

    springmvc就是servlet针对动态资源文件使用的servlet包的容器框架 -----实现依据Servlet规范封装(1. 指定动态资源文件开发步骤;2. 指定Http服务器调用动态资源文件的规则;3. 指定Http服务器管理动态资源文件实例对象规则)

    mybatis就是使用数据库相关的对象容器框架 ------ 实现基础为JDBC规范