发表于: 2020-08-11 22:34:35

1 2280


今天完成的事情

1. 了解数据库数据类型及其存储机制

2. 了解 Servlet 的演化


收获

1. 数据库数据类型与存储机制


存储机制:

创建数据表的时候我们就使用数据类型来限定每个字段所占用的地址空间,超出地址空间的处理方式有两种,截断不存或者使用额外的信息来标注是否在另外的地方存储了一些数据。


整形的存储(int、tinyint···)

由于整形数据的值是直接通过 bit 信息来读取的,所以整形可以存储的数据是按照位(byte)来计算的。

一个 int 类型的字段占用 4 byte,共计 32 bit,可以存储连续的 2^32 个整形数字。

在 MySQL 数据库中我们存储整形的时候可以使用一个参数 M,这是一个正整数例如 int(4)、tinyint(2)。这个参数并不影响整形字段存储的数据量,通常是用来配合 zerofill 在数字前面补充 0 的个数以此来控制数字的显示宽度。

这里需要注意的事情是,如果在一个字段上开启了 zerofill,那么这个字段就自动变成了无符号类型。无法存储负数。


字符类型的存储方式(char、varchar、text)

char 类型的是定长字符串,严格的限定了空间长度,但是它限制的是字符数量而不是字节数(某个版本以前的是限制的字节数),超出的部分直接截断不会存储。

在 char 类型存储的时候如果字符串的长度不及存储的长度,那么会使用空格补齐。在取出的时候会自动删除尾随的空格,即使我们在存储的时候是特意在尾部留了空格,数据库取出的时候也会去掉。对于数据库来说 "abc" 与 "abc     " 并没有区别。

varchar 类型是变长字符串类型,它存储了额外的字节的 bit 位来标记某个字节是否存储了数据。每存储一个字节(byte)的数据就要使用一个比特位来记录。因此一个额外的标记字节就可以标记 256 字节(byte)的数据,两个额外的记录字节可以标记 65536 字节的数据。MySQL 限制了 varchar 最多只能用两个字节来标记数据,所以对于单字节的字符,最多可以存储 65536 个字符的数据。对于多字节的字符,比如 UTF-8 每个字符占用三个字节,varchar 最多可以存储 65536/3=21845 个 UTF-8 字符数据。

由于使用了标记位来标记存储的字符数据,就不会和 char 一样截取尾部的空格。

varchar(10) 与 char(10) 一样,只能够存储 10 个字符,多余的截取不存。


ENUM 数据类型

在该类型中插入的数据只能是插入预先定义的 value 或者 null。插入其他的值或者空('')都会被截断为空数据。存储的时候会忽略大小写(转换为定义的时候的状态),而且会阶段尾部的空格。

ENUM 使用 index 来存储数据,所以理论上一个字节可以存储 256 条 value,实际上 null 也会占用空间。MySQL 限制最多只能够存储 65536 个 value。

需要注意的是,尽量不要使用 ENUM 来存储数值类型,因为无论是排序、检索还是其他操作都是根据 index 值来判定的。这会导致一些误解,和我们所需要的效果会有偏差。


SET 数据类型

SET 与 ENUM 类似,可以在数据库中存入定义的 SET 中任意值的组合。如 set('a', 'b', 'c', 'd') 字段中可以存入 'a, b' 或者 'a, b, c' 等数据。

值之间使用逗号做区分,所以数据本身不可以有空格。如果存入的内容不在 set 中则会存储为空值,重复的内容会被忽略。

SET 数据类型占用的存储空间与 SET 成员数量 M  有关,计算方式为 (M + 7)/8 取整。

MySQL 限制最多只能有 64 个成员。

使用以下语句来检索 set 字段数据。

find_in_set(set_value,set_column_name)



2. Servlet 的演化


Servlet 的诞生

上世纪 90 年代,互联网与浏览器飞速发展,基于浏览器的 B/S 模式火爆发展起来,最初能够访问到的都是静态资源 html、css 等。


CGI(Common Gateway Interface) 的出现使得人们可以很方便的制作出动态网站。

CGI 程序使用 C、Shell 等语言编写,不可移植。CGI 程序对每个请求产生新的进程去处理,执行顺序如下:

=>WEB 服务器接收到一个请求

=>WEB 服务器把请求转交给 CGI 程序处理

=> CGI 程序把处理结果返回给 WEB 服务器

=> WEB 服务器把结果送给用户


此时 Java 也发展出了两种方案满足动态网站的需求。

  • applet

这是一个纯浏览器解决方案,也就是在浏览器中运行 Java 插件直接翻译运行服务器返回的 Java 代码。这种方案需要用户下载安装插件,但是存在诸多限制。

  • Servlet

这种方案由服务端来执行 Java 代码,最后直接返回 html 页面。Servlet 也就是 Server 端的 applet。


Servlet 工作原理与 CGI 类似:

=>WEB 服务器接收到一个请求

=>WEB 服务器把请求转交给 WEB 服务器关联的 Servelt 容器

=>Servlet 容器找到对应的 Servlet 并且执行这个 Servlet

=>Servlet 容器把处理结果返回给 WEB 服务器

=>WEB 服务器把结果送给用户


Servlet 编程非常的繁琐,代码中也有非常多的冗余,需要写非常多的打印语句。


所以 SUN 借鉴了 ASP 提出了 JSP(Servlet 1.1),但是这种开发方式也非常繁琐,前端开发人员在 JSP 中看到了很多的后端代码。后端开发也需要在 JSP 中看到大量的前端代码。


Servlet1.2 开始倡导 MVC 思想:

JSP(V):把后端代码封装在标签里,使用大量的标签,JSP 只用来写前端代码。

Servlet(C):Servlet 完成 Controller 功能再加上部分逻辑代码。

Model(M):Servlet 把数据发送给 Model,最终数据被显示在 JSP 上。


Servlet 演化史

  • Servlet 接口

在最基本的 Servlet 类中,需要实现 Servlet 接口定义的 init()、service()、getServletConfig() 和 getServletinfo() 方法,其中逻辑方法写在 Service 中,service 方法中最常用的方法就是 PrintWriter 进行内容输出。


  • GenericServlet 抽象类

只需要重写 Service 方法


  • HttpServlet 抽象类

覆盖了 GenericServlet 类,把 ServletRequest 与 ServletResponse 对象分别分装为 HttpServletRequest 和 HttpServletResponse 对象。HttpServlet 同时实现了 Service 方法,在请求进来的时候 WEB 容器首先调用 HttpServlet 的 service 方法,并根据请求的类型调用 doGet 或者 doPost 方法,所以这和时候我们只需要 doGet() 或者 doPost() 方法。


  • JSP 加入

由于 Servlet 的编写需要在类中编写大量的 HTML 代码,使得 Java 代码与 HTML 糅杂在一起,JSP 应运而生。JSP 本质也是 Servlet,但是不需要编写者去编译而是一个 .jsp 扩展名的文本文件。简单的 JSP 页面在第一次被请求之后被翻译为 [JSP 名]_jsp 的 Servlet。


  • Spring 出现并且加入了 WEB 模块 - Spring MVC

原本需要使用 Servlet 完成复杂的功能的时候要编写很多个 Servlet 类并且在 web.xml 进行注册,对于复杂的 WEB 引用来说会非常复杂。

Spring 提供了 Spring MVC 框架让应用程序的不同方面分离(输入逻辑、业务逻辑和 UI 逻辑),同时提供了松散的耦合。

Spring MVC 框架是围绕着 DispatcherServlet 设计的,它可以处理所有的请求和响应。


DispatcherServlet 处理 HTTP 请求的流程:

a,接受 HTTP 请求,DispatcherServlet 会查询 HandlerMapping 以调用响应的 Controller

b,Controller 接受请求并且根据请求的类型调用响应的方法,服务方法进行响应的业务处理,得到带视图名称的模型数据返回给 DispatcherServlet

c,DispatcherServlet 根据返回的视图名称从 ViewResolver 获取对应的视图

d,DispatcherServlet 将模型数据传递到最终的视图,把视图返回给浏览器



明天的计划

1. 深入 Spring MVC




返回列表 返回列表
评论

    分享到