从零开始学习springboot,记录点
入行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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Asyncpublic 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_o8888888o88" . "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
16. springboot 整合 RabbitMQ
当然,这只是记录我学习springboot的过程,很多技术点我都写的十分简单,十分片面,不过对于springboot的入门是十分有帮助的!有空继续完善
从零开始学习springboot,记录点相关推荐
- 从零开始学习springboot之springboot搭建
博主刚开始实习不久,还是小白一枚,被公司的各种新奇技术搞得眼花缭乱了好久,主要是用springboot和dubbo构建起来的项目.看完之后才知道springboot真的是java开发者的福音啊 话不多 ...
- 从零开始学习springBoot(Contextpath+修改默认idk)
1.配置Contextpath 修改application.properties文件:添加server.context-path=/spring-boot 之后需要访问http://127.0 ...
- Elasticseach 从零开始学习记录(四) - 整合springboot2.x
1. 我的springboot版本为2.2.6.RELEASE, 本文推荐elasticsearch-rest-high-level-client在 springboot里集成el ...
- Elasticseach 从零开始学习记录(三) - 分布式部署
1. 先关闭elasticseach,登录root账户,修改之前解压的es文件夹名为master,好区分,并重新给改名后的文件夹赋esuser权限. mv elasticsearch-7.14.1 e ...
- Elasticseach 从零开始学习记录(二) - Head插件
安装Head插件的原因: 可以提供友好的web界面,还可以实现基本信息的查看,rest请求的模拟,以及数据的基本检索. 1. 检查服务器是否已经安装node.js 如未安装,自行百度安装node 2. ...
- Elasticseach 从零开始学习记录(一) - 单实例环境搭建
声明: 本文章是本人第一次学习ES,把过程和过程中遇到问题,以及百度后解决方案记录下来,如有问题,希望高手指出,谢谢. 环境:服务器为linux centos7 64位, jdk8 , ES7.14. ...
- 学习SpringBoot笔记以及错误记录
学习SpringBoot笔记以及错误记录 <1>. 启动类(SpringBootApplication)放错位置 错误场景:MainApplication类不应放在默认的src.main. ...
- 学习 spring-boot (一)
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. s ...
- access 导入 txt sql语句_从零开始学习 MySQL 系列索引、视图、导入和导出
阅读本文大概需要 8 分钟 前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识.作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会 ...
最新文章
- 中科院计算所沈华伟:GNN发展简史,诟病才是成长动力
- C#访问远程主机资源的方法
- Windows 11 大更新!可安装超千款 Android 应用
- 薛定谔的猫——.NET 4.1 中的新基类,开源Preview中
- weblogic搭建
- 让一个文字在背景图片水平居中的方法
- leetcode 剑指 Offer 05. 替换空格
- python如何复制oracle数据_Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法...
- Weave Scope 容器地图 - 每天5分钟玩转 Docker 容器技术(80)
- HyperLedger/Fabric JAVA-SDK with 1.1
- 深度学习模型参数初始化的方法
- 总有被遗忘或者没有及时跟进的工作
- 窘境与出路:AI时代的女性科技光芒
- 怎样选择(FC-SAN)光纤通道(存储)交换机
- 将Clound compare以及一些mathLab 等源码,集成到我们vs上来并编译
- COBOL中的基本语法(转)
- 汉字转全拼,简拼组件
- 剖析Solidity合约创建EVM bytecode
- ipv6地址概述——了解ipv6与ipv4不同
- 五分之一金融机构将从2018年开始探索加密货币交易