微服务迁移记(五):WEB层搭建(3)-FreeMarker集成
一、redis搭建
二、WEB层主要依赖包
三、FeignClient通用接口
以上三项,参考《微服务迁移记(五):WEB层搭建(1)》
四、SpringSecurity集成
参考:《微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成》
五、FreeMarker集成
1. 必要导包
<!--整合freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2. 配置文件
freemarker:
allow-request-override: true
cache: false
check-template-location: true
charset: UTF-8
content-type: text/html; charset=utf-8
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false
suffix: .ftl #模板文件的扩展名是.ftl(注意不是html)
template-loader-path: classpath:/templates #将模板文件放在resources/templates目录下
3. 后台角色分页列表示例
分页样式集成bootstrap样式。bootstrap前台框架,参考《https://v3.bootcss.com/》。最终样式如下:


1) 自定义分页控制类
这是一个实体类,我在构造函数中做了总页数计算,所以实例化时需要构造函数传参,Dao层可以直接返回这个实体类供前台调用。
package com.zyproject.common; import lombok.Data; import javax.servlet.http.HttpServletRequest;
import java.util.List; /**
* @program: zyproject
* @description: 分页通用实体类
* @author: zhouyu(zhouyu629 # qq.com)
* @create: 2020-02-16
**/
@Data
public class MyPager<T> {
private int page; //当前页码,从1开始
private int pagesize; //分页大小
private int totalpages; //总页数
private int totalrecords; //总记录数
private List<T> list;
//构造函数中计算总页数
public MyPager(int page,int pagesize,int totalrecords,List<T> list){
this.page = page;
this.pagesize = pagesize;
this.totalrecords = totalrecords;
this.list = list;
//计算总页数
this.totalpages = totalrecords/pagesize;
if(totalrecords%pagesize!=0){
this.totalpages = this.totalpages + 1;
};
}
}
2) Dao层获取数据源
通过Feign远程调用,通过Controller塞到前台页面调用,参考前面章节,略。
/**
* 分页获取角色列表
* @param page:当前页码,从1开始
* @param pagesize:分页大小
* @return
*/
public MyPager getRoleByPage(int page,int pagesize){
//totalrecords
String countSql = "SELECT count(1) FROM tb_role WHERE del_flag=0";
int totalRecords = jdbcTemplate.queryForObject(countSql,Integer.class);
String sql = "SELECT * FROM tb_role WHERE del_flag=0 ORDER BY taxis ASC limit ?,?";
List<RoleEntity> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper(RoleEntity.class),(page-1)*pagesize,pagesize);
return new MyPager(page,pagesize,totalRecords,list);
}
3)freemarker自定义分页宏
这个分页计算,写的不好,应该先算出startpage,endpage,hasprepage,hasmorepage,showfirstpage,showlastpage,然后一段代码展示即可,可以减少代码冗余。有时间再优化下。
<#macro fpage page pagesize totalpages totalrecords url>
<li><span>共条${totalrecords}记录 第${page}页/共${totalpages}页</span></li>
<#--如果当前不是第一页,则展示前5页-->
<#if page gt 1>
<li><span><a href="${url}&page=1">首页</a></span></li>
<#--至于是前x页?-->
<#if page gt 5>
<#assign prepage = page-5 >
<#else>
<#assign prepage=1>
</#if>
<#--是否显示...-->
<#if prepage gt 1>
<li><span><a href="${url}&page=${page-6}">...</a></span></li>
</#if>
<#list prepage ..page-1 as p>
<li><span><a href="${url}&page=${p}">${p}</a></span></li>
</#list>
<#--当前页-->
<li class="active"><span><a href="${url}&page=${page}">${page}</a></span></li>
<#--后10-page页-->
<#if page lt totalpages>
<#if totalpages lte 10>
<#list page+1..totalpages as p>
<li><span><a href="${url}&page=${p}">${p}</a></span></li>
</#list>
<#else>
<#--如果后面的页数超过5页-->
<#if totalpages-page gt 5>
<#list page+1..page+5 as p>
<li><span><a href="${url}&page=${p}">${p}</a></span></li>
</#list>
<li><span><a href="${url}&page=${page+6}">...</a></span></li>
<#else>
<#list page+1..totalpages as p>
<li><span><a href="${url}&page=${p}">${p}</a></span></li>
</#list>
</#if>
</#if>
<#--显示尾页-->
<li><span><a href="${url}&page=${totalpages}">尾页</a></span></li>
</#if>
<#else>
<#--如果总页数大于10页,只显示前十页,后面用...代替-->
<#if totalpages gt 10>
<#list 1..10 as p>
<li <#if p==1>class="active"</#if>><span><a href="${url}&page=${p}">${p}</a></span></li>
</#list>
<li><span><a href="${url}&page=${page+10}">...</a></span></li>
<#else>
<#list 1..totalpages as p>
<li <#if p==1>class="active"</#if>><span><a href="${url}&page=${p}">${p}</a></span></li>
</#list>
</#if>
<#--是否显示尾页-->
<#if totalpages gt 1>
<li><span><a href="${url}&page=${totalpages}">尾页</a></span></li>
</#if>
</#if>
</#macro>
4) HTML 页面调用
pager:是从controller传过来的MyPager对象
<ul class="row pagination">
<#import "../public/page.ftl" as fpage />
<@fpage.fpage page=pager.page pagesize=pager.pagesize totalpages=pager.totalpages totalrecords=pager.totalrecords url="/manage/role/index?tree_id=${tree.tree_id?c}" />
</ul>
六、权限管理
待续
微服务迁移记(五):WEB层搭建(3)-FreeMarker集成的更多相关文章
- 微服务迁移记(五):WEB层搭建(5)-集成ueditor编辑器,伪分布式图片上传
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(4)-简单的权限管理
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 接下来,集成SpringSecruity,实现用户 ...
- 微服务迁移记(五):WEB层搭建(1)
WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层).公共服务层.用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- docker微服务部署之:三,搭建Zuul微服务项目
docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- 微服务实践(五):微服务的事件驱动数据管理 - DockOne.io
原文:微服务实践(五):微服务的事件驱动数据管理 - DockOne.io [编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第 ...
- .Net微服务实践(五)[服务发现]:Consul介绍和环境搭建
目录 介绍 服务发现 健康检查.键值存储和数据中心 架构 Consul模式 环境安装 HTTP API 和Command CLI 示例API介绍 最后 在上篇.Net微服务实践(四)[网关]:Ocel ...
随机推荐
- 不错的UI设计
- 洛谷 P1186 【玛丽卡】
这道题题目真的想吐槽一下...是在机房同学的解释下才看懂的.就是让你求在可以删一条边的情况下,并且删后保证可以到达终点时,求删了后的最大的最短路径. 70分暴力思路: 枚举删边,然后跑一下最短路即可, ...
- String 类的其他功能
12.01_常见对象(Scanner的概述和方法介绍)(掌握) A:Scanner的概述 B:Scanner的构造方法 Scanner(InputStream source) System.in C: ...
- 猿灯塔:关于Java面试,你应该准备这些知识点
自天子以至于庶人,壹是皆以修身为本 <礼记·大学> 马老师说过,员工的离职原因很多,只有两点最真实: 钱,没给到位 心,受委屈了 当然,我是想换个平台,换个方向,想清楚为什么要跳槽,如果真 ...
- Mister B and PR Shifts,题解
题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+ ...
- Linux多任务编程之七:Linux守护进程及其基础实验(转)
来源:CSDN 作者:王文松 转自Linux公社 ------------------------------------------------------------------------- ...
- scrapy(三):post请求
-- coding: utf-8 -- ''' QiuBai.py 爬虫文件 ''' -- coding: utf-8 -- import scrapy class PostSpider(scrapy ...
- 递归实现DropDownList层级
.NET下拉框DropDownList层级实现 这也算是第一篇博客吧,技术比较菜,写得不好,希望各位博友见谅哈,多多提提意见. 今天做电商网站新闻添加的时候,下拉框选择新闻类别觉得太长,又无法定位其准 ...
- 机器学习实战基础(三十八):随机森林 (五)RandomForestRegressor 之 用随机森林回归填补缺失值
简介 我们从现实中收集的数据,几乎不可能是完美无缺的,往往都会有一些缺失值.面对缺失值,很多人选择的方式是直接将含有缺失值的样本删除,这是一种有效的方法,但是有时候填补缺失值会比直接丢弃样本效果更好, ...
- redis入门指南(五)—— 复制与哨兵
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 一.复制 1.在复制中,数据库分为两类,一类主数据库,一类从数据库,主库用来读写,从库用来读,主 ...