模块五阶段一 后台系统搭建

内容输出来源:拉钩教育Java就业训练营

1 前后端分离开发

1.1 前后端分离架构介绍

前后端分离已成为互联网项目开发的业界标准使用方式,将前端和后端的开发进行解耦。并且前后端分离会为以后的大型分布式架构、微服务架构、多端化服务(各种客户端,比如浏览器、车载终端、安卓、IOS等)打下坚实的基础。

前后端分离的核心思想就是前端HTML页面通过AJAX调用后端的API接口,并通过JSON数据进行交互。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ao3jouHH-1614066890994)(后台系统搭建.assets/04.jpg)]

1.2 接口文档

​ 在我们的项目中使用的是前后端分离开发方式,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直进行接口文档的维护。

接口文档的必要性
  1. 项目开发过程中前后端工程师有一个统一的文件进行沟通交流,并行开发
  2. 项目维护中或者项目人员更迭,方便后期人员查看、维护
接口文档的规范

一个接口的描述至少包括下面几项:

  • 名称: findCourseList

  • 描述: 根据条件查询课程信息

  • URL: http://localhost:8080/lagou_edu_home/course/

  • 请求方式: GET

  • 请求参数

    methodName:"findCourseList";
    
  • 响应结果

    {
        "status": "0",
        "msg": "success"
    }
    

1.3 前后端分离的优势

  1. 前后端分离的模式下,如果发现Bug,可以快速定位是谁的问题,不会出现互相踢皮球的现象
  2. 前后端分离可以减少后端服务器的并发/负载压力。除了接口以外的其他所有HTTP请求全部转移到前端Nginx上,接口的请求则转发调用Tomcat.
  3. 前后端分离的模式下,即使后端服务器暂时超时或宕机了,前端页面也会正常访问,只不过数据刷不出来而已。
  4. 前后端分离会更加合理的分配团队的工作量,减轻后端团队的工作量,提高了性能和可扩展性。

2 技术选型

2.1 前端技术选型

前端技术 说明
Vue.js 是一套用于构建用户界面的渐进式JavaScript框架
Element UI库 element-ui 是饿了么前端出品的基于 Vue.js的 后台组件库, 方便程序员进行页面快速布局和构建
node.js 简单的说 Node.js 就是运行在服务端的 JavaScript 运行环境 .
axios 对ajax的封装, 简单来说就是ajax技术实现了局部数据的刷新,axios实现了对ajax的封装,

2.2 后端技术选型

后端技术 说明
Web层 a) Servlet:前端控制器 b) Filter:过滤器 c) BeanUtils:数据封装
Service层 a) 业务处理
dao层 a) Mysql:数据库 b) Druid:数据库连接池 c) DBUtils: 操作数据库

3 Maven项目管理工具

3.1 Maven的作用

  • 依赖管理
    • 依赖指的就是是 我们项目中需要使用的第三方Jar包, 一个大一点的工程往往需要几十上百个Jar包,按照我们之前的方式,每使用一种Jar,就需要导入到工程中,还要解决各种Jar冲突的问题.
    • Maven可以对Jar包进行统一的管理,包括快速引入Jar包,以及对使用的 Jar包进行统一的版本控制
  • 一键构建项目
    • 之前我们创建项目,需要确定项目的目录结构,比如src 存放Java源码, resources存放配置文件,还要配置环境比如JDK的版本等等,如果有多个项目 那么就需要每次自己搞一套配置,十分麻烦
    • Maven为我们提供了一个标准化的Java项目结构,我们可以通过Maven快速创建一个标准的Java项目.

3.2 创建Maven项目

创建号工程后,目录分别为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jG27PrWj-1614066890996)(后台系统搭建.assets/27.jpg)]

src/main/java 		 —— 存放项目的.java 文件 
src/main/resources 	 —— 存放项目资源文件,如数据库的配置文件 
src/test/java 		—— 存放所有单元测试.java 文件,如 JUnit 测试类 
target 			    —— 项目输出位置,编译后的class 文件会输出到此目录 
pom.xml              ——maven 项目核心配置文件 

3.3 Maven的常用命令

  1. 一个maven项目生命周期

​ 使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些 过程规范为一个生命周期,如下所示是生命周期的各各阶段:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUNTKTum-1614066890997)(后台系统搭建.assets/38.jpg)]

maven 通过执行一些简单命令即可实现上边生命周期的各个过程

命令 说明
mvn compile 完成编译操作 , 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
mvn clean 执行完毕后,会将target目录删除.
mvn test 执行完毕后,会在target目录中生成三个文件夹: surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
mvn package 完成打包操作, 执行完毕后,会在target目录中生成一个文件,该文件可能是 jar、war
mvn install 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作 , 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用

3.4 依赖范围介绍

  1. A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
依赖范围 说明
compile 编译范围,指 A在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在 编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
provided provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依 赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。
runtime runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
test test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以test范围依赖不会被打包。
system system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR 文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。
  1. 项目中添加的坐标 ,并指定依赖范围
	<dependencies>
        <dependency>
            <!-- 项目名称 -->
            <groupId>javax.servlet</groupId>
            <!-- 模块名称 -->
            <artifactId>servlet-api</artifactId>
            <!-- 版本信息 -->
            <version>3.1.0</version>
        <!-- 依赖范围, 指定依赖范围是编译与测试时有效,运行时无效,运行时使用tomcat中的依赖,避免冲突 -->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>

            <!-- 在测试时有效 -->
            <scope>test</scope>
        </dependency>
    </dependencies>

4 JSON

JSON的特点:

  • JSON 是一种轻量级的数据交换格式。
  • JSON采用完全独立于语言的文本格式,就是说不同的编程语言JSON数据是一致的。
  • JSON易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

4.1 XML与JSON的区别

  • XML : 可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。

  • JSON: (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

  • 相同点:

    • 它们都可以作为一种数据交换格式。
  • 二者区别:

    • XML是重量级的,JSON是轻量级的,XML在传输过程中比较占带宽,JSON占带宽少,易于压缩。

    • XML和json都用在项目交互下,XML多用于做配置文件,JSON用于数据交互

    • JSON独立于编程语言存在,任何编程语言都可以去解析json

4.2 JSON语法格式

JSON数据:

{
	"id": 110,
	"name": "李会长",
	"age": 24
}

语法注意:

  1. 外面由{}括起来

  2. 数据以"键:值"对的形式出现(其中键多以字符串形式出现,值可取字符串,数值,甚至其他json对象)

  3. 每两个"键:值"对以逗号分隔(最后一个"键:值"对省略逗号

    1. 参数值如果是string类型,就必须加引号,如果是数字类型,引号可加可不加

遵守上面4点,便可以形成一个json对象。

4.3 JSON数据的转换

4.3.1 FastJson介绍
  • Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
  • FastJson特点如下:
    • 能够支持将java bean序列化成JSON字符串,也能够将JSON字符串反序列化成Java bean。
    • 顾名思义,FastJson操作JSON的速度是非常快的。
    • 无其他包的依赖, 使用比较方便。
4.3.2 FastJson的使用

在Maven项目中使用FastJson库,需要提前在Maven的配置文件中添加此FastJson包的依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.3</version>
</dependency>

<dependency>
    <groupId>com.colobu</groupId>
    <artifactId>fastjson-jaxrs-json-provider</artifactId>
    <version>0.3.1</version>
</dependency>
4.3.3 将 Java 对象转换为 JSON 格式
  1. 定义一个名为 Person 的 JavaBean类
@Data
public class Person {
    
    private String username;

    private int age;

    private String birthday;

 	get/set
}
  1. 可以使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象:
public class TestFastJSON {

    //Java对象转JSON
    @Test
    public void javaBeanToJSON(){

        //创建Person对象
        Person p = new Person("码云",15, DateUtils.getDateFormart());

        //使用JSON对象的 toString方法将对象转换为JOSN数据
        String s = JSON.toJSONString(p);

        System.out.println(s); //{"age":15,"birthday":"2020-07-03 19:54:33","username":"码云"}
    }


    //List集合转Json
    @Test
    public void ListToJSON(){

        //创建Person对象
        Person p1 = new Person("码云",15, DateUtils.getDateFormart());
        Person p2 = new Person("虎子",13, DateUtils.getDateFormart());
        Person p3 = new Person("小斌",18, DateUtils.getDateFormart());

        List<Person> list = new ArrayList<>();

        Collections.addAll(list,p1,p2,p3);

        //使用JSON对象的 toString方法将对象转换为JOSN数据
        String s = JSON.toJSONString(list);

        System.out.println(s);
        //[{"age":15,"birthday":"2020-07-03 19:59:05","username":"码云"},{"age":13,"birthday":"2020-07-03 19:59:05","username":"虎子"},{"age":18,"birthday":"2020-07-03 19:59:05","username":"小斌"}]
    }
}
  1. Fastjson中的 @JSONField 注解
  • 通过 @JSONField 我们可以自定义字段的名称进行输出,并控制字段的排序,还可以进行序列化标记。
    • 指定name属性, 字段的名称
    • 使用 ordinal属性, 指定字段的顺序
    • 使用 serialize属性, 指定字段不序列化
@Data
public class Person {
	
    //自定义输出的名称, 并且进行输出排序
    @JSONField(name="USERNAME",ordinal = 1)
    private String username;

    @JSONField(name="AGE",ordinal = 2)
    private int age;

    //排除不需要序列化的字段
    @JSONField(serialize = false)
    private String birthday;

    public Person() {
    }

    public Person(String username, int age, String birthday) {
        this.username = username;
        this.age = age;
        this.birthday = birthday;
    }
}
4.3.4 JSON 字符串转换为 Java 对象
  • JSON.parseObject()
    • 可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。
    • 注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常
  • JSON.parseArray()
    • 可以使用 JSON.parseArray() 将 JSON 字符串转换为 集合对象。
 //JSON转Java对象
    @Test
    public void JSONToJavaBean(){

        String json = "{\"age\":15,\"birthday\":\"2020-07-03 19:54:33\",\"username\":\"码云\"}";
        Person person = JSON.parseObject(json, Person.class);
        System.out.println(person);

        //创建Person对象
        String json2 ="[{\"age\":15,\"birthday\":\"2020-07-03 19:59:05\",\"username\":\"码云\"},{\"age\":13,\"birthday\":\"2020-07-03 19:59:05\",\"username\":\"虎子\"},{\"age\":18,\"birthday\":\"2020-07-03 19:59:05\",\"username\":\"小斌\"}]";
        List<Person> list  = JSON.parseArray(json2,Person.class);
        System.out.println(list);

    }
  String json2 ="[{\"age\":15,\"birthday\":\"2020-07-03 19:59:05\",\"username\":\"码云\"},{\"age\":13,\"birthday\":\"2020-07-03 19:59:05\",\"username\":\"虎子\"},{\"age\":18,\"birthday\":\"2020-07-03 19:59:05\",\"username\":\"小斌\"}]";
    List<Person> list  = JSON.parseArray(json2,Person.class);
    System.out.println(list);

}

上一篇:克隆模式


下一篇:“算命大师”脚本