本文用来简单记录JavaComparatorComparable接口特点与使用。

首先,分别查看官方对这两个接口的描述定义:

一、Comparator接口

This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

A comparison function, which imposes a total ordering on some collection of objects.

可以看出官方对该接口的描述是,它是一种比较函数,用于对一些集合中的对象进行总的排序。即:对集合中的元素进行排序。通过其源码可以看出,除了compare(T o1,T o2)方法,其他方法都给了默认实现。

1
int compare(T o1, T o2);

所以要想使用该接口,就得实现该接口的此方法。那么,该接口的作用是什么呢?

在之前的文章Servlet执行原理浅谈中对Servlet的整个原理做了大概介绍。我们知道客户端发送的请求是交给Servlet中的service方法进行处理。而在实际使用时,并没有直接重写service方法,而是继承了HttpServlet,重写了doGetdoPost等方法,而这期间又发生了什么呢。

首先,我们观察Servlet这个接口:

1
2
3
4
5
6
7
8
9
10
11
public interface Servlet {
void init(ServletConfig var1) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();

void destroy();
}

Servlet是一个接口,其中包含5个方法,我们大多真正使用的是service方法,其他的几个方法并不常用。因此,就出现了以下两个实现类:

image-20201129170130519

在介绍Servlet之前,简单对web方面的知识做个小结。

一、Web知识小结

1.1 软件架构

这里的软件架构,指服务器软件工作的两种方式:

  1. C/S:客户端/服务器端
  2. B/S:浏览器/服务器端

1.2 网络通信三要素

  1. IP:电子设备(计算机)在网络中的唯一标识。作用:用于定位到具体的电子设备,这里指具体的一台计算机。
  2. port(端口):应用程序在计算机中的唯一标识,其范围在0~65536。作用:用于定位计算机中的具体应用程序(每个应用程序都在监听着具体的端口号)。
  3. 传输协议:规定了数据传输的规则(该如何发送数据,又该如何接受数据,最后该对接受到的数据如何解析)。
    1. 基础协议
      • tcp:安全协议,三次握手,速度稍慢。
      • udp:不安全协议,速度较快。

使用通用Mapper的目的是为了替我们生成常用增删改查操作的SQL语句,并能够简化对于Mybatis的操作。

一、快速入门

1.1 数据库表的创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE `tabple_emp` (
`emp_id` INT NOT NULL AUTO_INCREMENT,
`emp_name` VARCHAR ( 500 ) NULL,
`emp_salary` DOUBLE ( 15, 5 ) NULL,
`emp_age` INT NULL,
PRIMARY KEY ( `emp_id` )
);
INSERT INTO `tabple_emp` ( `emp_name`, `emp_salary`, `emp_age` )
VALUES
( 'tom', '1254.37', '27' );
INSERT INTO `tabple_emp` ( `emp_name`, `emp_salary`, `emp_age` )
VALUES
( 'jerry', '6635.42', '38' );
INSERT INTO `tabple_emp` ( `emp_name`, `emp_salary`, `emp_age` )
VALUES
( 'bob', '5560.11', '40' );
INSERT INTO `tabple_emp` ( `emp_name`, `emp_salary`, `emp_age` )
VALUES
( 'kate', '2209.11', '22' );
INSERT INTO `tabple_emp` ( `emp_name`, `emp_salary`, `emp_age` )
VALUES
( 'justin', '4203.15', '30' );

初学SpringSpringMVC以及Mybatis时,将其整合时步骤繁多,新手容易不理解,面对繁多的XML配置,往往也不易跑通代码,这里用于记录一次整合的配置。

整合的目的:通过SpringIoCAOP对组件进行管理。即:通过IoC解决组件间的动态依赖注入;通过AOP来对事务进行控制,即通过Spring来整合SpringMVCMybatis

想法:对Mybatis的整合是,在Service层调用dao层的接口时,使其自动装配。

首先:一张数据库表对应一个实体类,一个实体类对应一张Mapper.xml配置文件。在resources文件夹下创建一个mapper文件夹,用于存放实体类的Mapper文件。这里创建EmployeeMapper.xml配置文件。

一、介绍与定义

本章用于记录自定义Springboot-starter的学习过程。

在我们自定义starter之前,我们首先观察一下SpringBoot自身的starter的形式都是什么样的。我们以spring-boot-starter-web为例。

Spring-boot-starter-web

通过spring-boot-starter-web,可以看出当前引入的依赖是空的JAR文件。它的作用是仅提供辅助依赖管理,这些依赖可用于自动装配或者其他类库。继续点入,可以看见其引入了spring-boot-starter,再进一步点入,又能看见其引入了spring-boot-autoconfigure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 在spring-boot-starter-web中引入了以下依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
<!-- 在spring-boot-starter中引入了以下依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

一、字节流与字符流

  • 输入流:用于读取数据 – 将数据写入内存进行展示,即将数据从其他设备读取到内存中的流。
  • 输出流:用于数据保存 – 将数据写入磁盘,可持久化存储,即将数据从内存中写出到其他设备上的流。

在字节流(以字节为单位)中,输出数据使用OutStream类完成,输入使用的是InputStream类完成。(所有字节流的父类)

在字符流(以字符为单位)中,输出数据使用Writer类完成,输入使用Reader完成。(所有字符流的父类)

其中,字节流主要操作byte类型数据,以byte数组为准。

如果想对文件进行读写,首先需要创建一个文件对象,如下:

1
2
3
4
5
6
7
public class FileDemo01 {
public static void main(String[] args) {
String pathname = "a.txt";
File file = new File(pathname);
System.out.println(file); // a.txt
}
}

从上面代码段可以看出,File接收的参数是文件路径,返回的是File对象。但是,直接打印File时,返回的是pathname,即为传入的参数。所以,在File类中,重写了toString方法。后面当我们拿到File对象后,就可以进行后续对当前文件的一系列操作了。

0 、概述

服务器端分成三层架构。

三层架构

一、环境搭建

1.1 Maven环境的创建

  1. 导入坐标依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <!-- 版本锁定 -->
    <spring.version>5.0.2.RELEASE</spring.version>
    <!-- 配置依赖 -->
    <dependencies>
    <!-- spring IOC -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <!-- spring web -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
  2. 配置核心的控制器(类似servlet类 – dispatcherServlet)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd" >

    <web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    </web-app>

<url-pattern>/</url-pattern>时,默认就是拦截所有路径连静态资源也不能访问。但是Controller中配置@RequestMapping的路径是不会被拦截的,配置了@RequestMapping就相当于在web.xml中注<servlet>