SpringBoot 项目(三)集成基础组件

作者:陆金龙    发表时间:2019-07-18 16:23   

关键词:集成mybatis  集成FreeMarker  集成Thymeleaf  热部署  SilentExitException  

3.1 klcms-provider集成MyBatis

MyBatis使用原则

结合使用注解和xml,不复杂用注解,复杂的用xml。

尽量不要引入额外的增强框架,以免增加代码复杂度。

3.1.1 pom.xml中添加依赖

pom.xml中添加lombok、mysql、mybatis等依赖

<dependencies>

    <!--lombok 简化实体类的定义 简化logger对象的创建 -->

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

    </dependency>

   <!-- 数据库访问相关 -->

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

    </dependency>

    <dependency>

        <groupId>com.alibaba</groupId>

        <artifactId>druid</artifactId>

    </dependency>

    <dependency>

        <groupId>org.mybatis.spring.boot</groupId>

        <artifactId>mybatis-spring-boot-starter</artifactId>

    </dependency>

</dependencies>

3.1.2 配置application.yml

配置mybatis和数据库连接

mybatis:

  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径

  type-aliases-package: com.klfront.klcms.entity     # 所有Entity别名类所在包

  mapper-locations:

  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

    

spring:

   datasource:

    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型

    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包

    url: jdbc:mysql://95.169.17.226:3306/klcms              # 数据库名称

    username: king

    password: King@0415

    dbcp2:

      min-idle: 5                                           # 数据库连接池的最小维持连接数

      initial-size: 5                                       # 初始化连接数

      max-total: 5                                          # 最大连接数

      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

 

为mysql数据库的连接字符串设置编码方式,防止中文乱码。将以上红色部分改为:

jdbc:mysql://95.169.17.226:3306/klcms?useUnicode=true&characterEncoding=utf8

报错处理:com.alibaba.druid.pool.DruidDataSource : create connection error

(1)报错信息为数据库驱动问题
去看了一下pom文件的mysql的相关依赖

标明为低版本 5.1.48

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.48</version>

</dependency>

2使用java1.8,如果使用了centos默认的openJDK也会出现数据库连接失败问题。

3.1.3 使用Mybatis访问数据库

1)在resources\mybatis\mapper下添加DeptMapper.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.klfront.klcms.dao.DeptDao">

    <select id="findById" resultType="Dept" parameterType="Long">

        select deptno,dname,db_source from dept where deptno=#{deptno};

    </select>

    <select id="findAll" resultType="Dept">

        select deptno,dname,db_source from dept;

    </select>

    <insert id="addDept" parameterType="Dept">

        INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());

    </insert>

</mapper>

2)添加接口文件:com\klfront\klcms\dao\DeptDao.java

@Mapper

public interface DeptDao{

    public boolean addDept(Dept dept);

    public Dept findById(Long id);

    public List<Dept> findAll();

}

3)服务实现类使用DeptDao访问数据库

@Autowired

private DeptDao dao;

@Override

public boolean add(Dept dept){

    return dao.addDept(dept);

}

4)控制器调用服务向数据库添加记录

    注意:参数需要添加@RequestBody注解,否则不能将json数据转为Dept对象

@ResponseBody

@RequestMapping(value = "/dept/add", method = { RequestMethod.POST })

public Boolean addDept(@RequestBody Dept dept) {

Boolean res = service.add(dept);

     return res;

}

3.2 klcms-provider引入单元测试

<!-- 配置单元测试插件 -->

<dependency>

  <groupId>junit</groupId>

  <artifactId>junit</artifactId>

</dependency>

 

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter-test</artifactId>

   <scope>test</scope>

</dependency>

3.3 klcms-web集成日志插件:slf4j+logback

springboot默认使用的就是slf4j+logback方案。已导入了日志相关jar包:slf4j-api.jar、logback-classic.jar、logback-core.jar.

只需根据需求,修改日志相关的配置项即可。如下图是修改日志级别和日志文件路径:

运行后,确实在d盘生成了日志文件 klcms.log

3.4 klcms-web集成FreeMarker

3.4.1 引入freemarker模板依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-freemarker</artifactId>

    <version>1.5.9.RELEASE</version>

</dependency>

3.4.2 配置application.properties

注意将application.properties文件的编码设置为utf-8,否则注释显示乱码

#freemarker 静态资源配置

#设定ftl文件路径

spring.freemarker.template-loader-path=classpath:/templates

#关闭缓存,上线生产环境需要改为true

spring.freemarker.cache=false

spring.freemarker.charset=utf-8

spring.freemarker.check-template-location=true

spring.freemarker.content-type=text/html

spring.freemarker.expose-request-attributes=true

spring.freemarker.expose-session-attributes=true

spring.freemarker.request-context-attribute=request

spring.freemarker.suffix=.ftl

3.4.3 配置maven打包时,包含静态文件

<finalName>klcms</finalName>

<!-- 配置静态资源文件打包 -->

<resources>

    <resource>

        <directory>src/main/resources</directory>

        <filtering>true</filtering>

    </resource>

</resources>

<plugins>

    <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-resources-plugin</artifactId>

        <configuration>

            <delimiters>

                 <!--模板引擎界定符-->

                <delimit>$</delimit>

            </delimiters>

        </configuration>

     </plugin>

</plugins>

3.4.4 创建和使用模板文件

在resources目录下建个目录叫templates,在这个目录下新建一个以.ftl结尾的文件,并且将html代码复制进去,在controller层返回这个视图。模板中绑定数据时,使用delimit指定的界定符。

Controller类不能用@RestController注解,应使用@Controller注解,否则模板引擎不生效。

@RestController

public class DemoController {

    @RequestMapping(value = "/index", method = RequestMethod.GET)

    public String index(ModelMap map) {

    map.put("name", "freemarker");

    map.put("age", "30");

    return "index";

  }
}

上述代码,访问http://localhost:8080/index,直接返回字符串index,没有使用到视图模板。

将注解@RestController改成@Controller,成功。

@Controller

public class DemoController {

    @RequestMapping(value = "/index", method = RequestMethod.GET)

    public String index(ModelMap map) {

    map.put("name", "freemarker");

    map.put("age", "30");

    return "index";

  }
}

3.4.5 Freemarker常见语法问题

<#if>标签中大于号,小于号写法
(1)用符号代替

  > 用 gt;

  >= 用 gte;

  < 用 lt;

  < 用= lte;
(2)加括号 <#if(x>y)>

3.4.6FreeMarker使用母版页

母版页代码(resources/templates/shared/layout.ftl)

<#macro layout><html>

<head>

    <title>标题</title></head>

<body><div id="content">

    <#nested /></div></body>

</html></#macro>

子页面代码(resources/templates/index.ftl)

<#include "/shared/layout.ftl">

<@layout>

    <div>这是子页面内容</div>

</@layout>

3.5 klcms-web集成Thymeleaf

thymeleaf与freemarker可以共存,不过freemarker优先级高,freemarker模板没有匹配上才尝试匹配thymeleaf模板。

3.5.1 添加maven依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>

</dependency>

3.5.2 配置properties

springboot已经有默认配置了,这里只配置关闭缓存。

spring.thymeleaf.cache=false 

3.5.3 编写视图文件

在templates下添加thymeleaf.html 文件,添加命名空间xmlns:th="http://www.thymeleaf.org"然后按thymeleaf的语法规则编写代码。

<!DOCTYPE html>

<html lang="en" xmlns:th="http://www.thymeleaf.org">

    <head>

        <meta charset="UTF-8">

        <title>Title</title>

    </head>

    <body>

        <h1>thymeleaf演示</h1>

        <!--th:text 将div里面的文本内容设置为 -->

        <div id="div01" class="myDiv" th:id="${hello}" th:class="${hello}" th:text="${hello}">这是显示欢迎信息</div>

        <hr/>

        <div th:text="${hello}"></div>

        <div th:utext="${hello}"></div>

        <hr/>

        <!-- th:each每次遍历都会生成当前这个标签: 3个h4 -->

        <h4 th:text="${user}"  th:each="user:${users}"></h4>

        <hr/>

        <h4>

        <span th:each="user:${users}"> [[${user}]] </span>

        </h4>

    </body>

</html>

3.5.4 编写控制器和方法,绑定数据,返回视图

hello和users赋值,并返回视图名thymeleaf

/**

* 模板引擎演示

* 返回视图名,则不用添加@ResponseBody注解

* @param map

* @return

*/

@RequestMapping("/thymeleaf")

public String thymeleaf(Map<String, Object> map) {

    map.put("hello", "<h1>你好 hello</h1>");

    map.put("users", Arrays.asList("zhangsan", "lisi", "wangwu"));

    return "thymeleaf";

}

3.6 klcms-web集成热部署插件

<!-- 热部署 修改后立即生效-->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>springloaded</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-devtools</artifactId>

</dependency>