2021-08-08

1、SpringBoot介绍

将之前常用的spring,springmvc,data-jpa等常用框架封装到一起,帮助你隐藏这些框架的整合细节,实现敏捷开发

1.1、特点

  1. 不需要模板化的配置 ,将会带来全新的轻便体验;
  2. SpringBoot整合第三方框架时,只需 导入相应的starter依赖包就自动整合了;
  3. SpringBoot默认只有 一个.properties或yml结尾的配置文件 ,且不推荐使用xml文件,后期采用.java文件(用到@Configuration注解的类))去编写配置信息;
  4. SpringBoot工程在部署时,采用的是jar包的方式,内部自动依赖Tomcat容器,提供了多环境的配置 ;
  5. 且后期要学习的微服务框架SpringCloud需要建立在SpringBoot基础上;

1.2、工程的目录结构

  • src
    • main
      • java
        • 包名
          • 启动类 (启动类.java,将Controller和其他包放在此包的子包或者同级包下)
          • 其他包
  • resources
    • static(放静态资源,如图片,视频)
    • templates(存放页面模板jsp,thymeleaf等)
    • application.properties(唯一的配置文件)

1.3、三种启动方式

  1. 运行启动类main方法
  2. 采用maven命令:mvn spring-boot:run
  3. 采用jar包方式运行:将项目打包成jar文件,通过 java -jar jar文件名

1.4、常用注解

1.4.1 @Configuration和@Bean(编写配置类)

  • 之前Spring在xml文件中编写大量bean标签,SpringBoot不推荐使用xml
  • @Configuration相当于beans标签
  • @Bean相当于bean标签

1.4.2 @SpringBootApplication(一个组合注解)

  • @SpringBootConfiguration:就是@Configuration注解
  • @EnableAutoConfiguration:实现自动装配
  • @ComponentScan:帮助扫描注解的

1.4.3 @value和ConfigurationProperties(引入外部配置文件信息)

  • @value:是获取.properties或yml内容,如@value($(“key”))
  • @ConfigurationProperties:是在yml中有大量自定义配置,且有统一前缀,和@Component(组件注解)一起写在实体类中,注:@ConfigurationProperties(prefix=“前缀”),前缀是必填的

1.4.4 @MapperScan(basepackage=“”),@Service,@Controller和@transaction

  • @Mapper是dao层的注解,但dao太多,就用@MapperScan(basepackage=“mapper包”),此注解用在启动类中
  • @Service:声明是一个Service
  • @Controller:声明是一个Controller
  • @transaction:开启事务注解,开启后具有回滚和提交,但值都是SpringBoot默认的

1.4.5 @RequestMapping,@PostMapping,@GetMapping和@PathVariable(Rest风格的Controller常用注解)

  • @RequestMapping,@PostMapping,@GetMapping:均是编写接口路径,@RequestMapping在Post和Get请求都能用
  • @PathVariable:实现rest风格必备注解,如@RequestMapping(value=“/student/{id}”)在方法参数中得加上@PathVariable(“id”)注解

1.5、多环境配置

  1. SpringBoot只有一个配置文件,推荐使用.yml。
  2. .yml文件优点:根据换行和缩进帮助管理配置文件位置,相比更轻量级
  3. yml文件缺点:严格遵循换行和缩进,填写value,且一定要在:后面跟空格
  4. 多环境配置:在application.yml中添加一个配置项
  • spring:

    • profiles:
      • active:环境名

    在resource目录下,即可创建多个application-环境名.yml文件
    且在部署工程时,通过java -jar jar文件 – spring.profiles.active=环境名

2、SpringBoot整合各类框架

2.1、整合Mybatis框架

  1. 导入依赖(3个)
//导入mysql驱动
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
//导入Mybatis整合SpringBoot的起步依赖
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
//导入druid连接池依赖
<dependency>
	<groupId>aliyun.druid</groupId>
	<artifactId>druid</artifactId>
</dependency>
  1. 编写Mapper接口和映射文件
//编写mapper接口
@Mapper
public interface StudentMapper(){
	Student selectAll();
	int deleteById(Integer id);
}

  1. 编写配置文件(.yml为例)
//设置连接数据库配置
spring:
	datasource:
		driver-class-name: com.mysql.cj.jdbc.Driver
		url: jdbc:mysql://localhost:3306/student
		username: root
		password: 123
//设置mybatis配置,扫描映射文件和别名扫描包以及驼峰映射
mybatis:
	mapper-locations: classpath:mapper/*.xml
	type-aliases-package: com.hq.Entity
	configuration: map-underscore-to-camel-case:true

2.2、整合JSP,分页助手

  1. 导入依赖
//导入SpringBoot对jsp的解析依赖,还有jstl等
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
------------------------------------------------------------------
//导入分页助手依赖,在Service就能直接用了PageHelper和PageInfo
<dependency>
	<groupId>PageHelper</groupId>
	<artifactId>PageHelper-spring-boot-starter</artifactId>
</dependency>
  1. 创建Webapp以及WEB-INF存放jsp页面
  • 像tomcat创建web页面一样
  1. 在yml文件指定view的前后缀
//配置视图解析器
spring: 
	mvc:
		view:
			prefix: /
			suffix: .jsp
  1. 还必须在pom手动指定规定路径META-INF/resource
//SpringBoot推荐使用Thymeleaf,如果要使用其他模板引擎,则要指定编译路径
<resources>
	<resource>
		<directory>src/main/webapp</directory>
		<targetPath>META-INF/resources</targerPath>
		<includes>
			<include>*.*</include>
		</includes>
	</resource>

</resources>

2.3、整合redis框架

  1. 导入依赖
//SpringBoot集成redis起步依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

  1. 在yml文件中配置相关信息
//配置连接redis相关配置
spring:
	redis:
		host: 192.168.001
		port: 6379
		password: 123
  1. 在Service用RedisTemplate
@Service
public class StudentServiceImpl implements StudentService{
	@Autowired
	private RedisTemplate<object,object> redisTemplate;
	//编写redis的put方法
	@Override
	public void put(String key,String value){
		redisTemplate.opsForValue().set(key,value);
	}
	//编写redis的get方法
	@Override
	public String get(String key){
		String count=(String)redisTemplate.opsForValue().get(key);
		return count;
	}

}

2.4、整合Thymeleaf模板引擎

带你走进比走进jsp还爽的模板引擎,简单又便于SpringBoot开发,还自动集成。冲冲冲

2.4.1、初识Thymeleaf模板引擎

什么是Thymeleaf?

  • 官网解释是:Thymeleaf是适用于独立Web和独立环境的现代服务器端java模板引擎
  • 模板引擎是:为了使用户界面和业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档。
  • Thymeleaf相对于jsp,FreeMaker等模板引擎的优点:SpringBoot官方是默认支持Thymeleaf的,并且Thymeleaf是覆盖式,更适合动静分离,选用html作为模板页,不会破坏html结构。

2.4.2、MVC与Thymeleaf关系

我们使用的Thymeleaf模板引擎在整个web项目中起到视图展示(View)

  • MVC全名叫做Model View Controller,是模型,视图,控制器缩写。
  • Model(模型):表示应用程序核心,用来存储数据提供视图层渲染的。
  • View(视图):显示数据,而SpringBoot默认就是用Thymeleaf作为视图的。
  • Controller(控制器):处理输入请求,将模型和视图分离。

2.4.3 、如何简单使用Thymeleaf

简单开始使用Thymeleaf三步走:

  • One:先导入依赖:Spring-boot-starter-thymeleaf
  • Two:配置文件中,关闭缓存、修改前后缀(默认配好,但别忘记)。spring.thymeleaf.cache=false(关闭缓存)、spring.thymeleaf.prefix=classpath:|templates|、spring.thymeleaf.suffix=.html。
  • Three:在html标签中导入头文件。<html xmlns:th=“http://www.thymeleaf.org”.>

完成上面三步即可开始编写Themeleaf的表达式了


2.4.4、Thymeleaf所有表达式和知识点

  • 标准变量表达式(${}):
// 通用值
<span th:text="${user.id}">
  • 选择变量表达式(*{}):
// 绑定一个对象值
<div th:object="${user}">
	<span th:text="*{id}"></span>
</div>
  • 路径表达式(@{}):
// 无参
<a th:href="@{/user/detail}"></a>
//有参(字符串拼接)
<a th:href="@{'/test?username='+${id}"></a>
//有参(format格式化)
<a th:href="@{/test(id=${id},username=${username})}"></a>
//rest风格用字符串
<a th:href="@{'/test/'+${id}}"></a>
  • 循环遍历(th:each):
// list,map,数组
<div th:each="user,userStat:${userList}">
	<span th:text="${user.id}"></span>
	<span th:text="${userStat.index}"></span>
</div>
//user:当前循环的对象变量名称
//userStat:对象变量状态信息(不填写也默认有)
//userList:当前循环集合
  • 条件判断(th:if):
// list,map,数组
//满足则执行
<div th:if="${sex eq 1}"></div>
<div th:if="${sex eq 0}"></div>
//switch,case也一样
  • 内联表达式(th:inline):
//将数据和页面放一起
//内联文本
<div th:inline="text">
	数据:[[${data}]]
</div>
//内联脚本
<script th:inline="javascipt">
	function show(){
		alert([[${data}]])
	}
</script>
  • 字符串拼接(|要拼接的内容|):
//优雅完成字符串拼接
<span th:text="|共${total}条${page}页,当前${now}页|"
  • 基本表达式(${#…}):
//3种从session获值
<span th:text="${#Session.getAttribute('data')}"></span>
<span th:text="${#HttpSession.getAttribute('data')}"></span>
<span th:text="${Session.data}"></span>

  • 功能表达式(${#}):
//时间格式化,字符串处理
<div th:text="${#dates.format(time,'yyyy-MM-dd')}"></div>
<div th:text="${#Strings.substring(data,0,10)}"></div>
<div th:text="${#Lists.一些集合方法}"></div>

2.5、整合RabbitMq组件框架(2021.9.1号前待更)

2.6、整合ElasticSearch组件框架(2021.9.1号前待更)

3、SpringBoot实现集成SpringMvc常用功能

3.1、集成实现拦截器

  1. 写实现类,实现HandlerInterceptor接口,重写里面方法
//设置拦截规则
public class UserInterceptor implements HandlerInterceptor{
	@Override
	public boolean preHandle(){
		//编写业务拦截规则
		System.out.printIn("进入拦截器");
		User user=(User) request.getSession().getAttribute("user");
		if(user==null){
			response.sendRedirect("login.html");
			return false;
		}
		return true;
	}

}

  1. 定义一个类为拦截器的配置类实现WebMvcConfigurer接口
  2. 且重写addInterceptors方法设置拦截路径
//设置拦截路径
@Configuraton
public class InterceptorConfig implements WebMvcConfigurer{
	@Override
	public void addInterceptors(InterceptorRegistry registry){
		String[] addPathPatterns={};
		String[] excludePathPatterns={};
		//添加拦截器的拦截路径和除外路径
		registry.addInterceptor(new UserInterceptor())
		.addPathPatterns(addPathPatterns)
		.excludePathPatterns(excludePathPatterns)
	}

}

3.2、集成实现过滤器和设置字符编码

3.2.1、过滤器

  1. 写实现类实现Filter接口,加@WebFilter编写过滤路径
//过滤器
@WebFilter(urlPatterns="/myfilter")
public class MyFilter implements Filter{
	@Override
	public void doFilter(){
	System.Out.PrintIn("进入过滤器");
	filterChain.doFilter(request,response);
	}
	
  1. 再启动类上加@ServletComponentScan注解扫描过滤器
//启动类
@SpringBootApplication
@ServletComponentScan(basePackages="com.hq.springboot.filter")
public class Applicaton{
	public static void main(String[] args){SpringAppliction.run}
}

3.2.2、设置字符编码

  • 直接在yml文件中将1、编码开启 2、强制开启,3、格式为utf-8
//设置字符编码配置,SpringBoot就自动集成了
spring:
	http:
		encoding:
			enabled: true
			force: true
			charset: utf-8

3.3、集成实现文件上传和下载

  1. 在配置类中用拦截器配置图片映射
//配置的图片映射
@Configuration
public class WebMVcConfig extends WebMvcConfigurerAdapter {
    private static final String imgPath = "file:" + Constant.UPLOAD_PATH + Constant.IMG_FILE_NAME +  "/";
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将所有访问img/virtual/**的请求映射到文件上传的路径下 C:\Users\hq/upload/img(图片的保存路径)
        registry.addResourceHandler("/img/virtual/**").addResourceLocations(imgPath);
        super.addResourceHandlers(registry);
    }
}
  1. 自定义常量
//常量
public class Constant {
    //文件上传/图片 根目录 
    public static final String UPLOAD_PATH = System.getProperty("user.home") + "/upload/";
    //图片目录
    public static final String IMG_FILE_NAME = "img";
    //图片相对路径
    public static final String VIRTUAL_IMG_PATH = "img/virtual";
}
  1. 编写文件上传工具
public class FileUtil {
    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
    
     // 图片存储 完整路径({user.home}/img/coldStone/XXX.jpg)
     //@param file
     // @return 返回相对路径
     
    public static String saveImg(MultipartFile file) {
        //获取文件上传的根目录 C:\Users\hq/upload/img
        String  path = Constant.UPLOAD_PATH + Constant.IMG_FILE_NAME;
        //拿到文件的后缀名和UUID进行拼接形成新的文件名
        //4ca64e85b1544c96b4a6154bb521476f.jpg
        String saveName = CommonUtil.getUuid() + "." + getFileSuffix(file.getOriginalFilename());

        logger.info(" --- 图片保存路径:{}, 图片保存名称:{} --- ", path, saveName);

        // 保存
        try {
            // 保存文件图片
            File targetFile = new File(path);
            if (!targetFile.exists()) {
                targetFile.mkdirs();
            }
            file.transferTo(new File(path + "/" + saveName));
        } catch (Exception e) {
            e.printStackTrace();
            logger.debug("--- 图片保存异常:{} ---" + e.getMessage());
            return null;
        }
        String filePath =  Constant.VIRTUAL_IMG_PATH;;
        //返回相对路径  img/virtual/4ca64e85b1544c96b4a6154bb521476f.jpg
        return filePath + "/" + saveName;
    }
    //返回截取的文件后缀
    //@param path
    //@return

    private static String getFileSuffix(String path) {
        return getFileSuffix(path, "2");
    }
     //获取文件名称或后缀(最后一个"."之后内容)
     //@param path
     //@param type 1名称 2后缀
     //@return
    private static String getFileSuffix(String path, String type){
        if(StringUtils.isNotEmpty(path) && path.indexOf(".") > 0) {
            // 名称
            String name = path.substring(0, path.lastIndexOf("."));
            // 后缀
            String suffix = path.substring(path.lastIndexOf(".") + 1);
            return StringUtils.equals("1", type) ? name : suffix;
        } else {
            return null;
        }
    }
}
  1. 在Controller层上实现测试
@RestController
@RequestMapping("/Userupload")
public class ImgUploadController {

    @PostMapping(value = "/img/upload")
    public String uploadImg(@RequestParam("image") MultipartFile img){
        //图片上传调用工具类
        try{
            //保存图片
            String path =  FileUtil.saveImg(img);
            return path;
        }catch (Exception e){
            return "上传图片失败";
        }
    }
}

3.4、集成logback日志(2021.9.1号前待更)

4、采用垂直架构在linux的部署与生产(2021.9.1号前待更)

4.1、Docker部署(2021.9.1号前待更)

4.2、使用nginx(2021.9.1号前待更)

4.3、打包在服务器上运行(2021.9.1号前待更)

链接: link.

// An highlighted block
var foo = 'bar';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值