前后端分离之Springboot

2023-11-15

springboot后台搭建

本次搭建使用多模块的方式,建立一个父项目netseal,父项目下建立webserver、common、appserver等项目。

  • 父项目——netseal,maven项目即可
    • 子项目——webserver,springboot项目
    • 子项目——common,springboot项目

idea进行项目的创建可参考使用idea搭建springboot项目

1. 创建父项目

1.1 创建netseal

在这里插入图片描述
填写group和artifact。
在这里插入图片描述

2. 创建子项目

2.1 创建webserver

填写group和artifact。
在这里插入图片描述
初始化选择spring web即可。模块分离后,web端只需要spring web,数据库相关的由其他模块引入。
在这里插入图片描述

2.2 创建common

在这里插入图片描述
初始化选择spring web、jdbc、mysql等。此次项目是模块化的测试,故继续沿用jdbc,暂未整合mybatis。
在这里插入图片描述

3.正式编码

3.1 修改pom文件

3.1.1 netseal的pom.xml

  • 重点1:打包方式为pom
  • 重点2:引入子模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>cn.com.infosec</groupId>
	<artifactId>netseal</artifactId>
	<version>1.0-SNAPSHOT</version>
	<!--重点1:打包方式为pom-->
	<packaging>pom</packaging>

	<!--重点2:引入子模块-->
	<modules>
		<module>webserver</module>
		<module>common</module>
	</modules>
	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

</project>

3.1.2 webserver的pom.xml

  • 重点1:填写父项目的基本信息,relativePath值为…/pom.xml
  • 重点2:打包方式为jar
  • 重点3:依赖common
  • 重点4:打包配置
  • 重点5:关掉单元测试

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<!--重点1:填写父项目的基本信息-->
	<parent>
		<groupId>cn.com.infosec</groupId>
		<artifactId>netseal</artifactId>
		<version>1.0-SNAPSHOT</version>
		<!--子级Maven的pom文件中,relativePath标签使用的默认值:“<relativePath/>”,但编译环境(IDEA和命令行)不认这种写法
		应使用<relativePath>../pom.xml</relativePath>
		-->
		<relativePath>../pom.xml</relativePath>
	</parent>
	<groupId>cn.com.infosec.netseal</groupId>
	<artifactId>webserver</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>webserver</name>
	<!--重点2:打包方式为jar-->
	<packaging>jar</packaging>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<!--内部引用-->
		<!--重点3:依赖common-->
		<dependency>
			<groupId>cn.com.infosec.netseal</groupId>
			<artifactId>common</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

		<!--外部引用-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!--重点4:打包,使用maven的插件进行打包时:可指定主类的类路径、并把依赖的包打进jar-->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!--指定主类-->
					<mainClass>cn.com.infosec.netseal.webserver.WebserverApplication</mainClass>
				</configuration>
				<executions>
					<execution>
						<goals>
							<!--可以把依赖的包都打包到生成的Jar包中-->
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!--重点5:关掉单元测试,否则项目无法正常启动-->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.18.1</version>
				<configuration>
					<skipTests>true</skipTests>    <!--默认关掉单元测试 -->
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

如果打war包,可以参考https://www.cnblogs.com/lichangyunnianxue/p/9729395.html

3.1.3 common的pom.xml

  • 重点1:填写父项目的基本信息
  • 重点2:打包方式为jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<!--重点1:填写父项目的基本信息-->
	<parent>
		<groupId>cn.com.infosec</groupId>
		<artifactId>netseal</artifactId>
		<version>1.0-SNAPSHOT</version>
		<relativePath>../pom.xml</relativePath>
	</parent>
	<groupId>cn.com.infosec.netseal</groupId>
	<artifactId>common</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>common</name>
	<!--重点2:打包方式为jar-->
	<packaging>jar</packaging>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

</project>

3.2 填充子项目

webserver和common进行建包、添加文件等操作。
webserver:包含controller、service等;
common:包含entity、dao等;

3.2.1 数据源配置

common的application.yml
指定serverTimezone=UTC,不指定可能会报错

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/netseal_4_data?&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
    username: root
    password: root

3.2.2 引入本地jar

不可避免的,在公司开发项目,会使用到公司自己的jar,所以此时就不能从仓库中获取。
方法:在项目下建立lib资源目录,存放自己的jar。
pom.xml
添加完依赖,可以在项目上选择Maven——Reimport。

<!--本地jar-->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>configuration2</artifactId>
	<version>2.1</version>
	<scope>system</scope>
	<systemPath>${project.basedir}/lib/commons-configuration2-2.1.jar</systemPath>
</dependency>

3.3 全局统一异常处理

Springboot对于异常的处理也做了不错的支持,它提供了一个 @ControllerAdvice(@RestControllerAdvice)注解以及 @ExceptionHandler注解,前者是用来开启全局的异常捕获,后者则是说明捕获哪些异常,对那些异常进行处理。

/**
 * 全局异常处理器
 *
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
	private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

	@ExceptionHandler(WebDataException.class)
	public Object WebDataException(WebDataException e) {
		String message = e.getMessage();
		return R.error(message);// R是响应类,在此处统一响应错误状态码及信息
	}

	@ExceptionHandler(Exception.class)
	public R handleException(Exception e) {
		log.error(e.getMessage(), e);
		return R.error(e.getMessage());
	}
}

3.4 文件上传

对于文件,我们可以采用两种方式:

  1. base64:前台获取文件的base64,后台解码就能得到文件;
  2. MultipartResolver:大文件使用传统方式上传;

3.4.1 base64

3.4.2 MultipartResolver

通常情况下,我们使用上传时,是需要将表单信息和文件一起提交给后台的。

前端

通常前端和后台的交互采用json格式。
使用new FormData()封装文件和其他信息,提交的时候大概是自动由json格式转为了文件上传表单的形式。

参考文章:springboot+vue文件上传

后端

后台的方法收到的数据就不是json,就不能再用@RequestBody注解来接收参数了。
springboot关于MultipartResolver有个坑,内置的MultipartResolver有点问题,我们可以用下述方式解决;

  1. 显性注册MultipartResolver
package cn.com.infosec.netseal.webserver.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

@Configuration
public class UploadConfig {
	//显示声明CommonsMultipartResolver为mutipartResolver
	@Bean(name = "multipartResolver")
	public MultipartResolver multipartResolver() {
		CommonsMultipartResolver resolver = new CommonsMultipartResolver();
		resolver.setDefaultEncoding("UTF-8");
		//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
		resolver.setResolveLazily(true);
		resolver.setMaxInMemorySize(40960);
		//上传文件大小 5M 5*1024*1024
		resolver.setMaxUploadSize(5 * 1024 * 1024);
		return resolver;
	}

}
  1. 启动类排除内置MultipartResolver
    如果不排除内置MultipartResolver,显性注册的MultipartResolver会无效。
@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
public class WebServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(WebServerApplication.class, args);
	}
}

4. Q&A

4.1 Test failures

Q:
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project webserver: There are test failures.

  • A:
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.18.1</version>
	<configuration>
		<skipTests>true</skipTests>    <!--默认关掉单元测试 -->
	</configuration>
</plugin>

4.2 启动项目无法注入common的dao

Q:
启动webserver的WebserverApplication方法,会发现common的dao无法被自动注入,报错如下:

Field sysUserDao in cn.com.infosec.netseal.webserver.service.sysUser.SysUserServiceImpl required a bean of type 'cn.com.infosec.netseal.common.dao.sysUser.SysUserDaoImpl' that could not be found.
  • A:
    解决办法:
    在WebserverApplication上使用@ComponentScan(“cn.com.infosec.netseal”)
package cn.com.infosec.netseal.webserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("cn.com.infosec.netseal")
public class WebserverApplication {

	public static void main(String[] args) {
		SpringApplication.run(WebserverApplication.class, args);
	}

}

5. 打包及运行

因为主类在webserver,所以打包写在了webserver下的pom.xml,但是操作是点击父项目的package!!!成功会看到控制台输出build success,jar包生成在了webserver下的target目录。
webserver启动:
在这里插入图片描述

父项目打包:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将webserver-0.0.1-SNAPSHOT.jar复制到其他磁盘下,打开命令窗口,进入该路径,执行
java -jar xxx.jar即可运行。

java -jar xxx.jar

示例:
在这里插入图片描述

跨域问题

package cn.com.infosec.netseal.webserver.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Filter配置
 *
 * @author lhx
 */
@Configuration
public class FilterConfig implements WebMvcConfigurer {

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**") // 所有接口
				.allowCredentials(true) // 是否发送 Cookie
				.allowedOriginPatterns("*") // 支持域
				.allowedMethods("GET", "POST", "PUT", "DELETE") // 支持方法
				.allowedHeaders("*")
				.exposedHeaders("*");
	}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前后端分离之Springboot 的相关文章

随机推荐

  • esp8266连接mqtt时client.publish出现的小问题

    client publish发送变化数据的问题 温湿度为例 先是获取数据 加入我们获取的湿度为humidity 温度为temp 下一步就是我们的发送环节啦 client publish 主题 内容 我们字节将内容替换是会报错的 我们需要对数
  • qemu-guest-agent windows下的监控开发

    windows下的qemu guest agent 简称qga 的名字叫做qemu guest agent win32 目前最新版的版本号是qemu guest agent win32 0 12 1 2 2 355 el6 4 9 x86
  • 【踩坑】三种方式解决 Homebrew failing to install - fatal: not in a git directory

    问题描述 解决方法一 添加安全目录 没有测试 git config global add safe directory opt homebrew Library Taps homebrew homebrew git config globa
  • 动手写docker中遇到的问题合集

    fork exec usr bin sh operation not permitted exit status 1 我的环境 win10 wsl2 ubuntu20 04 解决方案 设置wsl默认用户为root sudo nano etc
  • java实现赫夫曼树以及赫夫曼编码和解码(用byte[])

    首先对于赫夫曼编码有个大概的理解 赫夫曼编码 Huffman Coding 又称霍夫曼编码 是一种编码方式 可变字长编码 VLC 的一种 Huffman于1952年提出一种编码方法 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字
  • ubuntu搭载网络文件系统与linux开发板共享资源

    搭建NFS 如果ubuntu是运行在虚拟机上的 首先需要修改ubuntu与windows的网络连接模式 将其修为桥接模式与windows连接网络 ubuntu以及开发板安装net toos sudo apt install net tool
  • 常用设计模式-命令模式

    命令模式 讲一个请求封装成一个对象 可以让不同的请求对客户进行参数化 对请求排队或者记录请求日志 以及支持可撤销的操作 别名为事务模式或者动作模式 这样两者之间通过命令对象进行沟通 这样方便将命令对象进行储存 传递 调用 增加与管理 命令模
  • QFile创建文件以及递归文件删除文件

    QFile创建文件 1 t dir mkpath t firstFilePath 创建文件夹 2 t File open QIODevice WriteOnly QIODevice Truncate 创建文本 3 若文件不存在会创建一个 Q
  • mybatis-plus入坑指南

    简介 MyBatis Plus 简称 MP 是一个 MyBatis 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 特性 无侵入 只做增强不做改变 引入它不会对现有工程产生影响 如丝般顺滑 损耗小 启动即
  • python用matplotlib画折线图

    折线图 import matplotlib pyplot as plt y1 10 13 5 40 30 60 70 12 55 25 x1 range 0 10 x2 range 0 10 y2 5 8 0 30 20 40 50 10
  • java设计模式--[创建模式]--抽象工厂[abstract factory]

    抽象工廠 提供一個接口 用於創建相關或依賴對象的家族 而不需要指定具體類 二 設計某些系統是坷以南非要為用戶提供一系列相關的的對象 但系統不希望用戶真接使用new 運算符實例化這些對象 而由系統來控制這些對象的創建 否則用戶不僅要清楚地知道
  • 推荐系统架构

    推荐系统架构 实际推荐系统通常采用多种推荐算法 并根据用户的实时行为反馈调整用户的特征向量 特征的加权系数 进而融合各个推荐算法的推荐结果 在此基础上过滤不要的推荐项 最后结合用户使用场景调整推荐结果排名 给出最终推荐结果 基于不同特征的推
  • STM32F030 USART2配置函数 波特率不对导致无法进入中断

    今天调试STM32F030 USART2 收发不了数据 仿真的时候进入不了中断 但是配置也是正确的 搞了很久 原因是先初始化的串口再初始化Flash数据 导致读入的波特率是0 进而无法正常使用USART2 浪费了大量的时间 血的教训呀 vo
  • 【保姆级教学】搭建win10系统 IIS Web 服务器(上)

    先确认计算机上是否已安装 IIS 1 进入Windows10的控制面板 点击 系统和安全 2 找到 管理工具 并点击 3 查看是否有Internet Information Services IIS 管理器 如图 我的计算机已经安装好了 注
  • Python——Numpy高级索引

    Python Numpy高级索引 整数数组索引 或 与索引数组组合 布尔索引 比较运算符 取补运算符号 np iscomplex 过滤非复数元素 花式索引 传入顺序 倒序索引数组 使用 np ix 传入多个索引数组 https editor
  • MySQL——MySQL的介绍、安装、卸载与使用

    1 介绍 MySQL数据库隶属于MySQL AB公司 总部位于瑞典 后被oracle公司收购 优点 成本低 开放源码 可免费使用 性能高 执行很快 简单 容易安装和使用 DBMS分为两类 基于共享文件系统的DBMS Access 基于客户机
  • torch.max函数比较最大值

    新建两个tensor列表 利用torch max 进行两个列表的比较 import torch a torch tensor 1 2 3 4 5 print a a b torch tensor 10 1 7 9 3 print b b x
  • 认识HTTP请求

    要分析HTTP请求和响应必然少不了抓包工具 关于抓包工具的设置和下载推荐看抓包工具Fiddler的下载与设置 通过抓包得到的一个HTTP请求 HTTP请求的格式 结构分析 一 请求行 1 post是方法 可以表示一条HTTP请求要进行的操作
  • elementui的el-input校验正则表达式

    el input 只能输入正整数 包括0 在 Input 值改变时触发 handleEdit e let value e replace d g 只能输入数字 value value replace 0 d 1 第一位0开头 0后面为数字
  • 前后端分离之Springboot

    这里写目录标题 springboot后台搭建 1 创建父项目 1 1 创建netseal 2 创建子项目 2 1 创建webserver 2 2 创建common 3 正式编码 3 1 修改pom文件 3 1 1 netseal的pom x