入行java也有大半年了,最近有时间,开始慢慢自己学习springboot,也算为将来打下基础
这里是记录springboot用到的基础技术点,可能不全,欢迎指正!
1.首先肯定是直接先创建一个最简单的springboot项目,我是用的idea开发的,其他ide应该也差不多
springboot2.0以上必须要用jdk1.8以上,不然会出很多奇怪的错误!
Next,这里Group和Artifact跟普通maven项目一样填写就行了。主要是Packaging选项,如果选择了jar,将使用springboot内置tomcat,如果选择了war其实变化不大,会多出一个文件和tomcat的maven依赖
区别:
jar包:直接通过内置tomcat运行,不需要额外安装tomcat。如需修改内置tomcat的配置,只需要在spring boot的配置文件中配置。内置tomcat没有自己的日志输出,全靠jar包应用输出日志。但是比较方便,快速,比较简单。
war包:传统的应用交付方式,需要安装tomcat,然后放到waeapps目录下运行war包,可以灵活选择tomcat版本,可以直接修改tomcat的配置,有自己的tomcat日志输出,可以灵活配置安全策略。相对打成jar包来说没那么快速方便。
接着选择web组件,这个基本必须选!然后其他的组件你可以根据需求选择,还可以选择Mysql和Mybatis(注意:如果选择了这两个,生成的springboot项目你没有配置好数据源的话,启动是会报错的,也可以选择他们生成项目后,去pom.xml文件暂时注释掉Mysql和Mybatis两个依赖)
再Next,Finish,就创建成功啦!
直接运行下面的方法,就可以启动项目了(虽然项目什么都没有,连个index页面都没有)
看到这个,并且没有报错,就是启动成功了
当然,这只是最简单的第一步,后面慢慢一点一点学习
2.刚生成的springboot项目的resources目录下有static和templates文件夹
(1)static:默认是放静态资源的
我们将图片1.jpg放到static文件夹里面,启动项目,在浏览器输入localhost:8080/1.jpg (不用加项目名),可以访问到图片
(2)templates:放视图模板,就是springBoot的动态页面,springboot已经不推荐使用jsp了,springboot可以集成freemarker或者thymeleaf,他们都可以完全替代jsp,这里两个都介绍。
1) 集成freemarker ,很多公司都使用freemarker模板引擎,具体的好处请自行百度
在pom.xml加入依赖freemarker
<!--freearker依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在 templates 文件夹新建文件 ftlIndex.ftl
这是一个freemarker的模板文件,要是freemarker的基础语法不懂的同学建议去看下
第一个ftl项目
姓名:${name}
年龄:${age}
性别:
<#if sex="1">
男生
<#elseif sex="2">
女生
<#else>
其他
</#if>
然后新建一个controller,因为整合了freemarker,这里返回值直接访问templates目录下的ftlIndex.ftl,springboot的配置文件默认已经帮我们配置好了前后缀,当然我们也可以去application.properties修改,不建议修改。
可以在方法传入map参数,会传到前端显示,还可以像传统的做法一样,传入一个model或者modelAndView,效果一样
package com.liqiye.springbootdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
/**
* @author liqiye
* @description 返回freemarker .ftl文件
* @date 2019/4/5
*/
@Controller
public class FtlController {
/**
* 访问在templates目录里面的ftl文件,这里自动在返回值后面加上.ftl后缀
* @param map 可以在方法的参数上面加上map,替换模板文件里面的值。注意:必须加在方法的参数
* @return
*/
@RequestMapping("/ftlIndex")
public String tets(Map<String,Object> map){
map.put("name","李启业");
map.put("age","23");
map.put("sex","0");
return "ftlIndex";
}
}
效果图:
2)集成thymeleaf,这是springboot官方推荐我们使用的模板引擎
引入maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后在application.properties配置文件里加上 thymeleaf的配置参数
#thymeleaf 模板解析器属性
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
# 默认的前后缀,不写默认就是这个
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
#开发时关闭缓存,不然没法看到实时页面
spring.thymeleaf.cache=false
在 templates 文件夹新建文件 thymeleafView.html
(其实thymeleaf就是一个html页面嵌入特定的语法标签,然后作用跟jsp基本一样,这里测试了下常用简单的thymeleaf语法,详细语法建议百度下)
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<html xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>测试thymeleaf</title>
</head>
<body>
<div th:object="${user}">
<p>姓名:<span th:text="*{name}">xx</span></p> <!--可以用*{}来省略前文引用的对象-->
<p>年龄:<span th:text="${user.age}">xx</span></p>
<p>性别:<span th:text="${user.sex}">xx</span></p>
</div>
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<tr th:each="us:${list}">
<td th:text="${us.name}"></td>
<td th:text="${us.age}"></td>
</tr>
</table>
<div>
<p th:if="${testif}">th:if标签测试: true显示</p>
<p th:unless="${testif}">th:unless标签测试: false显示</p>
</div>
<div th:switch="${testswitch}">
<div th:case="'1'">
<p>执行th:switch标签的值为 1 的case的代码块</p>
</div>
<div th:case="'2'">
<p>执行th:switch标签的值为 2 的case的代码块</p>
</div>
<div th:case="'3'">
<p>执行th:switch标签的值为 3 的case的代码块</p>
</div>
</div>
<div>
<a href="http://www.baidu.com" th:href="@{testthhref}">超连接</a> <!--注意如果在@{/}里加了/ ,它是相对路径,前面会加上当前访问路径-->
</div>
</body>
</html>
controller
package com.liqiye.springbootdemo.controller;
import com.liqiye.springbootdemo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
/**
* @author liqiye
* @description 测试thymeleaf模板的controller
* @date 2019/5/6
*/
@Controller
public class ThymeleafController {
@GetMapping("/thymeleaf")
public ModelAndView thymeleaf(){
ModelAndView modelAndView = new ModelAndView();
User user = new User();
user.setName("李启业");
user.setAge(23);
user.setSex("男");
User user1 = new User("小红", 1);
User user2 = new User("小黄", 2);
User user3 = new User("小绿", 3);
ArrayList<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
modelAndView.addObject("user",user);
modelAndView.addObject("list",list);
modelAndView.addObject("testif",true);
modelAndView.addObject("testswitch","2");
modelAndView.setViewName("thymeleafView");
return modelAndView;
}
@ResponseBody
@GetMapping("/testthhref")
public String test_thhref(){
return "测试 th:href";
}
}
测试 浏览器输入: http://localhost:8080/thymeleaf 页面可以像jsp一样动态填充数据
3.开启springboot的热部署
(1)用devtools的热部署
引入maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
引入maven依赖后其实热部署就已经可以了,默认是开启的,不过如果你想指定热部署哪些目录,又有某些目录不想热部署,可以在application.properties配置文件里加上以下配置(当然,不加以下配置全部文件都会热部署)
#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
#spring.devtools.restart.exclude: WEB-INF/**
注意:还有一点,我用的idea开发,要想springboot的热部署起作用,要先开启idea的自动热加载
1)setting -> Compile -> Build project automatically --> 选中
2)按组合键 Shift+Ctrl+Alt+/,选择Registry,进去勾选上compiler.automake.allow.when.app.running
接下来,自己去在controller里修改代码,然后Ctrl+S下,发现在控制台又打印了springboot的标志和一大串东西,证明热部署成功。(其实我觉得这个devtools热部署超级辣鸡,但是学习下也没损失)
(2)用jrebel热部署(强烈建议)
这个插件是收费的,破解教程这里就不放了,自己百度吧,很简单的
装好jrebel插件,创建好springboot项目后,在idea界面的左下方,点击下图位置,选中你项目勾上
这时候还没行喔,在idea界面右上方,配置开启热部署,点击Edit Configurations...
下图红色框都要选中Update classes and resources
当然不要忘了,jrebel也要先开启idea的自动热加载:
1)setting -> Compile -> Build project automatically --> 选中
2)按组合键 Shift+Ctrl+Alt+/,选择Registry,进去勾选上compiler.automake.allow.when.app.running
还有最后一步,启动springboot项目不要再去那个启动app那里运行那个方法了,用原来的启动类启动是不会启用jrebel插件热部署的,在下图位置,先选中启动类,然后点击那个虫子按钮,debug启动就可以了!
还有上面两种热部署最好不要同时用,只用一种就好了。
4.springboot项目启动的vm参数设置(设置合理可以提高性能)
因为我用的idea开发,我就直接在idea那里设置了,十分方便
参数,我这里是设置初始化1G,最大1G,可以根据实际情况自行修改
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
怎么查看设置的vm内存是否成功?
去到本地安装jdk的bin目录,里面有个文件jconsole.exe,它可以查看本地运行的虚拟机占用内存等情况
先启动你的springboot项目(用修改了参数的方式启动),然后双击这个图标!选择你刚启动的项目,直接点连接,不用账号密码,点击不安全的链接
这时候就可以看到(第一个),最大内存,与初始化内存就是1个G,设置成功!
5.springboot整合jsp
springboot官方不推荐使用jsp进行前端开发,所以默认不集成的,但是之前做项目都是用的jsp,这里肯定要集成下
注意:要集成jsp,springboot项目只能是war包形式
(1)引入maven
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
(2)创建目录 webapp、WEB-INF(这个应该不用说了吧)
(3)在webapp-WEB-INF 下 来个最简单的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>Title</title>
</head>
<body>
springboot整合jsp
</body>
</html>
(4)controller
package com.liqiye.springbootdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author liqiye
* @description jsp整合controller,项目必须是war包
* @date 2019/4/5
*/
@Controller
public class JspController {
@RequestMapping("/jsp")
public String jspIndex(){
return "index";
}
}
(5)配置前后缀(类似springmvc)
在application.properties配置文件里面加上
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
(6)测试
注意:访问路径不需要加上项目名
注意:如果你在整合jsp的同时,也整合了其他模板引擎(freemarker或者thymeleaf),即在pom.xml文件引入了整合的模板引擎包,并且在springboot配置文件指定了该引擎读取的前后缀,这时,jsp整合是不生效的!会被覆盖,读取的是你指定的模板引擎的位置,此时freemarker和thymeleaf都可以正常使用,但是jsp不生效。所以jsp跟模板引擎不要一起整合。
6.集成lombok(ide安装lombok我就不放了)
相信lombok的好处不用我再说了,特别是用springboot开发,当然是要将快速开发进行到底!
(1)引入maven
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
(2)log4j的配置文件 log4j.properties
直接放到resources目录下
# LOG4J配置
log4j.rootCategory=INFO, stdout, file
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# root日志输出到文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=/data/logs/springboot-log4j-all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# 按不同package进行输出
# com.micai包下的日志配置
log4j.category.com.micai=DEBUG, didifile
# com.micai下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=/data/logs/springboot-log4j-my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
# ERROR级别输出到特定的日志文件中
log4j.logger.error=errorfile
# error日志输出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=/data/logs/springboot-log4j-error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
(3)测试。
新建一个实体类user
这里简单使用了下 @Data 和 @Slf4j ,运行了下main方法,控制台打印出user的信息,成功。
(注意:lombok提供的@Slf4j注解,只能调用log对象打印日志,名字固定在源码了,当然你也可以修改源码)
package com.liqiye.springbootdemo.entity;
import com.liqiye.springbootdemo.utils.SetName;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* @author liqiye
* @description
* @date 2019/4/6
*/
@Data
@Slf4j
public class User {
public Integer id;
public String name;
public Integer age;
public static void main(String[] args) {
User user = new User();
user.setName("张三");
user.setAge(23);
log.info(user.toString());
}
}
(4)当然如果你不想安装lombok,这里也提供整合log4j的方法
直接引入maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
上面的 log4j.properties 配置文件不要忘了!
private final Logger log = LoggerFactory.getLogger(this.getClass());
7.集成 PageHelper 分页插件
引入maven
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
下面集成mybatis一起测试
8.集成mybatis
(1)引入mybatis和mysql的连接驱动
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
(2)在application.properties 配置文件里面加上数据源
#datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123
(3)创建数据库springboot(名字跟上面对上就行)
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
(4)创建实体类 User
package com.liqiye.springbootdemo.entity;
import lombok.Data;
/**
* @author liqiye
* @description
* @date 2019/4/6
*/
@Data
public class User {
public Integer id;
public String name;
public Integer age;
}
(5)创建 Usermapper 接口 ,这里直接用注解注入sql语句,不加xml那个文件了
注意:你可以在每一个mapper接口上面加上@Mapper注解(作用是被springboot扫描解析成mapper),也可以在springboot的启动类上面加上注解 @MapperScan(basePackages = {"com.liqiye.springbootdemo.mapper"}),实现,指定包扫描,用其中一种即可。
package com.liqiye.springbootdemo.mapper;
import com.liqiye.springbootdemo.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
// @Mapper
public interface UserMapper {
@Select("select * from user")
List<User> findList();
@Select("select * from user where name = #{name}")
User findByName(@Param("name")String name);
@Insert("insert into user(name,age) values(#{name},#{age})")
int insert(@Param("name")String name,@Param("age")Integer age);
}
(6)创建UserService
package com.liqiye.springbootdemo.service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liqiye.springbootdemo.entity.User;
import com.liqiye.springbootdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author liqiye
* @description
* @date 2019/4/6
*/
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public int insert(String name,Integer age){
int i = userMapper.insert(name, age);
return i;
}
// 分页查询
public PageInfo<User> findList(int page, int pageSize){
PageHelper.startPage(page,pageSize);
List<User> list = userMapper.findList();
PageInfo<User> pageInfo = new PageInfo<User>(list);
return pageInfo;
}
}
(7)创建 Usercontroller
package com.liqiye.springbootdemo.controller;
import com.github.pagehelper.PageInfo;
import com.liqiye.springbootdemo.entity.User;
import com.liqiye.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author liqiye
* @description 测试整合springboot和mybatis
* @date 2019/4/6
*/
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/insertuser")
public String insertuser(String name,Integer age){
int i = userService.insert(name, age);
return "操作:"+i;
}
@RequestMapping("/findList")
public PageInfo<User> findList(int page, int pageSize){
return userService.findList(page,pageSize);
}
}
(8)测试
返回1,并且到数据库查看新增了一条数据,插入成功!
---------------------------------------------------------------------------------------------
给数据库多插几条数据,然后测试分页
页面成功显示分页的json数据!
(9)上面是实现了启动类扫包的方式注入,那是sql语句用注解的方式写在mapper上面,若我们用传统的方式mapper和接口分开写,然后在resources目录下建mapper目录,里面放封装sql语句的xml文件,这样的方式是没办法读取封装sql的xml文件的,这时,我们只需要在application.properties文件加上下面的代码,就可以访问到了
路径是你存放封装sql语句的xml文件,这样两种方式的mapper就都能用了(注解方式和xml方式)
#加载Mybatis封装sql语句的xml文件
mybatis.mapper-locations = classpath:mapper/*Mapper.xml
或者说如果你的接口,和封装sql语句的xml文件在同一目录下,就不用加上面的配置文件,因为springboot默认读接口时就是同一个目录读取xml文件,但是如果你用的idea开发,idea默认不会编译java目录下的xml文件,需要手动开启,则需要在pom.xml文件加上
<build>
<!-- idea默认在java目录下不编译xml文件,这里开启编译java目录下的xml文件 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
(10)在控制台开启打印sql语句
默认执行完sql语句后,不会在控制台打印出sql语句,这样很不方便我们开发,在application.properties配置文件加上
#开启打印执行的sql语句,logging.level.后面跟接口所在的包名
logging.level.com.liqiye.springbootdemo.mapper=debug
9.开启事务(就是在对数据库操作时,如果出现异常,对数据库的新增改都将回滚)
引入spring的事务支持
<!-- 本地事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
使用十分简单,只需要在要使用事务的方法,或者类上面,加上 @Transactional 注解 即可!
直接在上面的 UserController 的新增方法上面修改,使它内部报错:
// 事务起遇到异常 前面的增删改都将回滚的作用,不加@Transactional注解,即使报错,对数据库的操作也不会回滚,会造成数据异常
@RequestMapping("/insertuser")
@Transactional // 开启事务,采用的是AOP的环绕通知,可以作用在类、接口、public方法上
public String insertuser(String name,Integer age){
int i = userService.insert(name, age);
int j = 1/0;
return "操作:"+i;
}
访问url地址
然后报错,去到数据库查看,发现数据并没有插入成功,事务起作用了!
10.开启异步 (所谓异步,就是A方法调用B方法,然后A和B方法会同时运行,A方法不会因为B方法还没返回而阻塞)
首先在springboot 的启动类上面加上 @EnableAsync 注解 开启异步
然后在要开启异步的方法上面加上 @Async 注解
package com.liqiye.springbootdemo.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* @author liqiye
* @description 测试Async异步
* @date 2019/4/6
*/
@Service
@Slf4j
public class TestAsyncService {
@Async
public String menthod(){
log.info("2");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("3");
return "返回";
}
}
调用上面的service 的controller代码:
// 测试异步
@ResponseBody
@RequestMapping("/test2")
public String test2(){
log.info("1");
String s = testAsyncService.menthod();
log.info("4");
return "result:"+s;
}
测试:
在浏览器输入url : http://localhost:8080/test2
控制台打印:
浏览器显示:
因为开启了异步,controller的方法和service的方法同时运行,controller的方法不会因为service的方法在休眠而暂停,所以日志打印顺序为1、4、2、3 ;而controller的方法运行到结束时,service的方法还没返回,没有返回值,所以显示null。
11.Banner
springboot项目启动的时候是不是总能看到下面这个图标
1)这个可以去掉不显示的,在application.properies 配置文件里加上 spring.main.banner-mode=off 即可
#关掉springboot启动图标
spring.main.banner-mode=off
2)也可以替换掉这个图标(不要同时去掉 与 替换 ,这样就是没有显示)
在resources目录下新建文件 banner.txt (springboot启动默认就是读取这个文件名,不能随意命名,不然没法读取)
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
该txt文件,除了名字和目录不能改外,里面的内容逆向怎么改都行,这里放几个根据文字生成图标的网站
http://patorjk.com/software/taag
http://www.network-science.de/ascii/
https://www.degraeve.com/img2txt.php
12.springboot默认的错误页面显示
如果你请求了一个不存在的url,或者服务器里代码运行时发生了异常,默认是出现下面两个不友好的页面404和5xx
我们项目一般肯定会有一个全局的异常捕获的显示页面,给用户友好的显示出错
而springboot里我们可以十分简单的实现不同错误,显示不同的页面,不需要写什么拦截器什么的
1)在resources目录下新建一个public 目录,在public 目录里新建一个error目录(目录名字不能错)
2)在resources/public/error 里新建文件 404.html ,文件名不能随便(当然你们应该做一个很帅的页面放进去)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>出错</title>
</head>
<body>
404错误
</body>
</html>
这样如果发生了404错误,显示的就是这个html页面
还可以新建 5xx.html 这样的名字,他会自动匹配发生 5xx 的所有错误,然后都是显示这个html页面
3)测试:我们发起一个不存在的请求 http://localhost:8080/bucunzaideurl
显示如下:
4)还可以使用freemarker的模板页面显示,不过文件放置的位置不一样,应该在resources目录下的templates目录下的error目录里,新建类似404.ftl、 5xx.ftl 的模板文件
13. springboot整合redis 加上 封装StringRedisTemplate 的redis工具类的运用
14. Springboot 整合 hibernate 和 jpa
15. springboot2.0 整合 activiti 6.0
当然,这只是记录我学习springboot的过程,很多技术点我都写的十分简单,十分片面,不过对于springboot的入门是十分有帮助的!有空继续完善