骨灰级SSM 和spring boot大全(二)

本文详细介绍了SpringBoot如何整合PageHelper实现分页查询,利用Druid作为数据库连接池,以及SpringBoot与JSP、FreeMarker、Thymeleaf三种模板引擎的集成和基础语法。同时,涵盖了SpringBoot的开发者工具、项目打包部署、异常处理和单元测试等内容。
摘要由CSDN通过智能技术生成

08_SpringBoot_整合PageHelper(掌握)

PageHelper插件

我们在正常的查询业务之中,只需要加上一行代码就可以实现分页的数据的封装处理

实现原理

PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。内部流程是ThreadLocal中设置了分页参数(pageIndex,pageSize),之后在查询执行的时候,获取当线程中的分页参数,执行查询的时候通过拦截器在sql语句中添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数

使用方法

1.调用PageHelper方法:PageHelper.startPage(pageNum, pageSize)

2. MyBatis 查询方法

注意:只要你可以保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。

MyBatis整合PageHelper插件,自行阅读即可

mybatis中pageHelper的配置使用_铛铛响的博客-CSDN博客

添加PageHelper启动器依赖

1.	<dependency>
2.	    <groupId>com.github.pagehelper</groupId>
3.	    <artifactId>pagehelper-spring-boot-starter</artifactId>
4.	    <version>1.2.12</version>
5.	</dependency>

EmpController

1.	package com.msb.controller;
2.	
3.	import com.msb.pojo.Emp;
4.	import com.msb.service.EmpService;
5.	import org.springframework.beans.factory.annotation.Autowired;
6.	import org.springframework.stereotype.Controller;
7.	import org.springframework.web.bind.annotation.PathVariable;
8.	import org.springframework.web.bind.annotation.RequestMapping;
9.	import org.springframework.web.bind.annotation.ResponseBody;
10.	
11.	import java.util.List;
12.	
13.	/**
14.	 * @Author: Ma HaiYang
15.	 * @Description: MircoMessage:Mark_7001
16.	 */
17.	@Controller
18.	@RequestMapping("/emp")
19.	public class EmpController {
20.	
21.	    @Autowired
22.	    private EmpService empService;
23.	
24.	    @RequestMapping("/findByPage/{pageNum}/{pageSize}")
25.	    @ResponseBody
26.	    public List<Emp> findByPage(@PathVariable("pageNum") Integer pageNum,@PathVariable("pageSize") Integer pageSize){
27.	        return empService.findByPage(pageNum,pageSize);
28.	    }
29.	}
30.	

Service层代码编写

1.	package com.msb.service.impl;
2.	
3.	import com.github.pagehelper.Page;
4.	import com.github.pagehelper.PageHelper;
5.	import com.github.pagehelper.PageInfo;
6.	import com.msb.mapper.EmpMapper;
7.	import com.msb.pojo.Emp;
8.	import com.msb.service.EmpService;
9.	import org.springframework.beans.factory.annotation.Autowired;
10.	import org.springframework.stereotype.Service;
11.	
12.	import java.util.List;
13.	
14.	/**
15.	 * @Author: Ma HaiYang
16.	 * @Description: MircoMessage:Mark_7001
17.	 */
18.	@Service
19.	public class EmpServiceImpl implements EmpService {
20.	    @Autowired
21.	    private EmpMapper empMapper;
22.	    @Override
23.	    public List<Emp> findByPage(Integer pageNum, Integer pageSize) {
24.	        Page<Emp> page = PageHelper.startPage(pageNum, pageSize);
25.	        List<Emp> list =empMapper.findAll();
26.	
27.	        // 方式1
28.	        System.out.println("当前页:"+page.getPageNum());
29.	        System.out.println("总页数"+page.getPages());
30.	        System.out.println("页大小:"+page.getPageSize());
31.	        System.out.println("总记录数:"+page.getTotal());
32.	        System.out.println("当前页数据"+page.getResult());
33.	
34.	        // 方式2
35.	        PageInfo<Emp> pi =new PageInfo<>(list);
36.	        System.out.println("当前页"+pi.getPageNum());
37.	        System.out.println("总页数"+pi.getPages());
38.	        System.out.println("页大小"+pi.getSize());
39.	        System.out.println("总记录数"+pi.getTotal());
40.	        System.out.println("当前页数据"+pi.getList());
41.	
42.	        return list;
43.	    }
44.	}

PageInfo对象和Page对象的区别

Page和PageInfo_程序员^晓洋的博客-CSDN博客_page和pageinfo

09_SpringBoot_整合Druid((掌握)

Druid是由阿里巴巴推出的数据库连接池。它结合了C3P0、DBCP、PROXOOL等数据库连接池的优点。之所以从众多数据库连接池中脱颖而出,还有一个重要的原因就是它包含控制台,很方便的帮助我们实现对于sql执行的监控。

添加依赖

<dependency>
2.	            <groupId>com.alibaba</groupId>
3.	            <artifactId>druid-spring-boot-starter</artifactId>
4.	            <version>1.1.10</version>
5.	        </dependency>

修改配置文件application.yml

1.	spring:
2.	  datasource:
3.	    # 使用阿里的Druid连接池
4.	    type: com.alibaba.druid.pool.DruidDataSource
5.	    driver-class-name: com.mysql.cj.jdbc.Driver
6.	    # 填写你数据库的url、登录名、密码和数据库名
7.	    url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
8.	    username: root
9.	    password: root
10.	  druid:
11.	    # 连接池的配置信息
12.	    # 初始化大小,最小,最大
13.	    initial-size: 5
14.	    min-idle: 5
15.	    maxActive: 20
16.	    # 配置获取连接等待超时的时间
17.	    maxWait: 60000
18.	    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
19.	    timeBetweenEvictionRunsMillis: 60000
20.	    # 配置一个连接在池中最小生存的时间,单位是毫秒
21.	    minEvictableIdleTimeMillis: 300000
22.	    validationQuery: SELECT 1
23.	    testWhileIdle: true
24.	    testOnBorrow: false
25.	    testOnReturn: false
26.	    # 打开PSCache,并且指定每个连接上PSCache的大小
27.	    poolPreparedStatements: true
28.	    maxPoolPreparedStatementPerConnectionSize: 20
29.	    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
30.	    filters: stat,wall,slf4j
31.	    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
32.	    connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
33.	    # 配置DruidStatFilter
34.	    web-stat-filter:
35.	      enabled: true
36.	      url-pattern: "/*"
37.	      exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
38.	    # 配置DruidStatViewServlet
39.	    stat-view-servlet:
40.	      url-pattern: "/druid/*"
41.	      # IP白名单(没有配置或者为空,则允许所有访问)
42.	      allow: 127.0.0.1,192.168.8.109
43.	      # IP黑名单 (存在共同时,deny优先于allow)
44.	      deny: 192.168.1.188
45.	      #  禁用HTML页面上的“Reset All”功能
46.	      reset-enable: false
47.	      # 登录名
48.	      login-username: admin
49.	      # 登录密码
50.	      login-password: 123456

代码测试

 访问监控页面

10_SpringBoot_整合JSP(了解)

添加依赖

<!--JSP依赖-->
2.	        <dependency>
3.	            <groupId>org.apache.tomcat.embed</groupId>
4.	            <artifactId>tomcat-embed-jasper</artifactId>
5.	            <scope>provided</scope>
6.	        </dependency>

添加webapps目录并设置目录

 

设置工作目录,如果在IDEA中项目结构为聚合工程。那么在运行jsp是需要指定路径。如果项目结构为独立项目则不需要。  

 在 yml配置文件中配置视图解析器参数

 在控制类中声明单元方法请求转发jsp资源

1.	package com.msb.controller;
2.	
3.	import org.springframework.stereotype.Controller;
4.	import org.springframework.web.bind.annotation.PathVariable;
5.	import org.springframework.web.bind.annotation.RequestMapping;
6.	
7.	/**
8.	 * @Author: Ma HaiYang
9.	 * @Description: MircoMessage:Mark_7001
10.	 */
11.	@Controller
12.	public class PageController {
13.	    @RequestMapping("/{uri}")
14.	    public String getPage(@PathVariable("uri") String uri){
15.	        return uri;
16.	    }
17.	}

11_SpringBoot_整合FreeMarker(熟悉)

1FreeMarker的简介

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

    FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。

常用的java模板引擎还有哪些?

Jsp、Freemarker、Thymeleaf 、Velocity 等。

模板+数据模型=输出

freemarker并不关心数据的来源,只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)

freemarker作为springmvc一种视图格式,默认情况下SpringMVC支持freemarker视图格式。 需要创建Spring Boot+Freemarker工程用于测试模板。

2FreeMarker初次使用

导入依赖

 <!--freeMaker依赖-->
2.	        <dependency>
3.	            <groupId>org.springframework.boot</groupId>
4.	            <artifactId>spring-boot-starter-freemarker</artifactId>
5.	        </dependency>

创建controller

 @RequestMapping("/freemarker")
2.	    @Controller
3.	    public class FreemarkerController {
4.	        @RequestMapping("/show")
5.	        public String freemarker(Map<String, Object> map){
6.	            map.put("name","msb");
7.	           //返回模板文件名称
8.	            return "show";
9.	        }
10.	    }

通过查阅配置信息发现,默认前缀为 &apos;&apos; ,后缀为.ftlh,默认路径为templates

templates目录下创建模板文件

 

1.	<!DOCTYPE html>
2.	<html lang="en">
3.	<head>
4.	    <meta charset="UTF-8">
5.	    <title>Title</title>
6.	</head>
7.	<body>
8.	this is showftlh
9.	<br/>
10.	${name}
11.	<img src="img/a.jpg"></img>
12.	</body>
13.	</html>

3FreeMarker常用指令

A遍历List集合

1、注释,即<#‐‐和‐‐>,介于其之间的内容会被freemarker忽略

2、插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}

3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。

4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。

1.	@Controller
2.	public class FreemarkerController {
3.	    @Autowired
4.	    private EmpService empService;
5.	
6.	    @RequestMapping("/showEmp")
7.	    public ModelAndView testList(){
8.	        ModelAndView mv =new ModelAndView();
9.	        List<Emp> list =empService.findAll();
10.	        mv.addObject("empList", list);
11.	        mv.setViewName("showEmp");
12.	        return mv;
13.	    }
14.	}
15.	

页面代码

1.	<!DOCTYPE html>
2.	<html lang="en">
3.	<head>
4.	    <meta charset="UTF-8">
5.	    <title>Title</title>
6.	    <style type="text/css">
7.	        #empTable{
8.	            width: 80%;
9.	            border: 1px solid blue;
10.	            margin: 0px auto;
11.	        }
12.	        #empTable th,td{
13.	            border: 1px solid green;
14.	            text-align: center;
15.	        }
16.	
17.	    </style>
18.	</head>
19.	<body>
20.	
21.	<table id="empTable" cellpadding="0px" cellspacing="0px">
22.	    <tr>
23.	        <th>索引</th>
24.	        <th>工号</th>
25.	        <th>姓名</th>
26.	        <th>岗位</th>
27.	        <th>薪资</th>
28.	        <th>部门号</th>
29.	    </tr>
30.	    <#list empList as emp>
31.	        <tr>
32.	            <td>${emp_index}</td>
33.	            <td>${emp.empno}</td>
34.	            <td>${emp.ename}</td>
35.	            <td>${emp.job}</td>
36.	            <td>${emp.sal}</td>
37.	            <td>${emp.deptno}</td>
38.	        </tr>
39.	    </#list>
40.	
41.	
42.	</table>
43.	
44.	</body>
45.	</html>

说明: _index:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始 

B遍历Map数据

遍历输出指定内容

controller

1.	@Controller
2.	public class FreemarkerController {
3.	    @Autowired
4.	    private EmpService empService;
5.	
6.	    @RequestMapping("/showEmpMap")
7.	    public ModelAndView testMap(){
8.	        ModelAndView mv =new ModelAndView();
9.	        List<Emp> list =empService.findAll();
10.	        Map<String,Emp> empMap =new HashMap<>();
11.	        for (Emp emp : list) {
12.	            empMap.put(emp.getEmpno().toString(), emp);
13.	        }
14.	
15.	        mv.addObject("empMap", empMap);
16.	        mv.setViewName("showEmpMap");
17.	        return mv;
18.	    }

页面

1.	<!DOCTYPE html>
2.	<html lang="en">
3.	<head>
4.	    <meta charset="UTF-8">
5.	    <title>Title</title>
6.	    <style type="text/css">
7.	        #empTable{
8.	            width: 80%;
9.	            border: 1px solid blue;
10.	            margin: 0px auto;
11.	        }
12.	        #empTable th,td{
13.	            border: 1px solid green;
14.	            text-align: center;
15.	        }
16.	
17.	    </style>
18.	</head>
19.	<body>
20.	
21.	输出7521员工信息:<br/>
22.	工号:${empMap['7521'].empno}<br/>
23.	姓名:${empMap['7521'].ename}<br/>
24.	岗位:${empMap['7521'].job}<br/>
25.	薪资:${empMap['7521'].sal}<br/>
26.	部门号:${empMap['7521'].deptno}<br/>
27.	<br/>
28.	遍历EmpMap
29.	
30.	<table id="empTable" cellpadding="0px" cellspacing="0px">
31.	    <tr>
32.	        <th>索引</th>
33.	        <th>工号</th>
34.	        <th>姓名</th>
35.	        <th>岗位</th>
36.	        <th>薪资</th>
37.	        <th>部门号</th>
38.	    </tr>
39.	    <#list empMap?keys as k>
40.	        <tr>
41.	            <td>${k_index}</td>
42.	            <td>${k}</td>
43.	            <td>${empMap[k].ename}</td>
44.	            <td>${empMap[k].job}</td>
45.	            <td>${empMap[k].sal}</td>
46.	            <td>${empMap[k].deptno}</td>
47.	        </tr>
48.	    </#list>
49.	
50.	
51.	</table>
52.	
53.	</body>
54.	</html>

FreeMarker在遍历map集合是,key必须是String

C  if指令

if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否 则跳过内容不再输出。

if中支持的运算符

    a算数运算符 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %

    b逻辑运算符有如下几个: 逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误

    c比较运算符有如下几个:

        ① =或者==:判断两个值是否相等.

        ② !=:判断两个值是否不等.

        ③ > 或者gt:判断左边值是否大于右边值

        ④ >=或者gte:判断左边值是否大于等于右边值

        ⑤ <或者lt:判断左边值是否小于右边值

        ⑥ <=或者lte:判断左边值是否小于等于右边值

注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>

如何判断空值

1、判断某变量是否存在使用 “??” 用法为:variable??,如果该变量存在,返回true,否则返回false 例:为防止stus为空报错可以加上判断如下

2、缺失变量默认值使用 “!” 使用!要以指定一个默认值,当变量为空时显示默认值。例: ${name!&apos;&apos;}表示如果name为空显示空字符串。如果是嵌套对象则建议使用()括起来。

<#if empList??>
2.	        <#list empList as emp>
3.	            <tr <#if emp_index%2 ==0 > style="background-color: gray" </#if>>
4.	                <td>${emp_index}</td>
5.	                <td>${emp.empno}</td>
6.	                <td <#if emp.ename == 'KING'> style="color: aqua" </#if>>${emp.ename}</td>
7.	                <td>${emp.job}</td>
8.	                <td>${emp.mgr!'无'}</td>
9.	                <td <#if emp.sal gte 2000.0> style="color: red" </#if>>${emp.sal}</td>
10.	                <td>${emp.comm!'0'}</td>
11.	                <td>${emp.deptno}</td>
12.	            </tr>
13.	        </#list>
14.	    </#if>

4 内置函数

内建函数语法格式: 变量+?+函数名称

1、内建函数获取某个集合的大小

${集合名?size}

2、内建函数日期格式化

显示年月日:         ${today?date}

显示时分秒:      ${today?time}

显示日期+时间:${today?datetime}

自定义格式化:   ${today?string("yyyy年MM月")}

3、内建函数将json字符串转成对象

1.	<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
2.	<#assign data=text?eval />
3.	开户行:${data.bank} 账号:${data.account}

其中用到了 assign标签,assign的作用是定义一个变量。

页面

1.	员工人数:${empList?size}
2.	<table id="empTable" cellpadding="0px" cellspacing="0px">
3.	    <tr>
4.	        <th>索引</th>
5.	        <th>工号</th>
6.	        <th>姓名</th>
7.	        <th>岗位</th>
8.	        <th>上级</th>
9.	        <th>入职日期a</th>
10.	        <th>入职日期b</th>
11.	        <th>入职日期c</th>
12.	        <th>入职日期d</th>
13.	        <th>薪资</th>
14.	        <th>补助</th>
15.	        <th>部门号</th>
16.	    </tr>
17.	    <#if empList??>
18.	        <#list empList as emp>
19.	            <tr <#if emp_index%2 ==0 > style="background-color: gray" </#if>>
20.	                <td>${emp_index}</td>
21.	                <td>${emp.empno}</td>
22.	                <td <#if emp.ename == 'KING'> style="color: aqua" </#if>>${emp.ename}</td>
23.	                <td>${emp.job}</td>
24.	                <td>${emp.mgr!'无'}</td>
25.	                <td>${emp.hiredate?date}</td>
26.	                <td>${emp.hiredate?time}</td>
27.	                <td>${emp.hiredate?datetime}</td>
28.	                <td>${emp.hiredate?string("yyyy年MM月dd日")}</td>
29.	                <td <#if emp.sal gte 2000.0> style="color: red" </#if>>${emp.sal}</td>
30.	                <td>${emp.comm!'0'}</td>
31.	                <td>${emp.deptno}</td>
32.	            </tr>
33.	        </#list>
34.	    </#if>
35.	
36.	</table>

更多内置函数FreeMarker内置函数的用法_WO木子的博客-CSDN博客_freemarker lower_case 

12_SpringBoot_整合Thymeleaf(掌握)

Thymeleaf的主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。Thymeleaf能够处理HTML,XML,JavaScript,CSS甚至纯文本。

    长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thy

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值