Springboot整合FreeMarker的實現(xiàn)示例
一、項目搭建
1、新建模塊


2、導(dǎo)入依賴 :將不相關(guān)的依賴刪掉
<!-- <dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>2.1.4</version>-->
<!-- </dependency>-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>3、新建軟件包,放入student實體類
package com.lv.code.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 學(xué)生表 student
* @author hgh
* @date 2022-01-21T13:35:43.912
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student {
/**
* 學(xué)生編號 主鍵 自增
*/
private Long stuId;
/**
* 學(xué)生名字
*/
private String stuName;
/**
* 學(xué)生電話
*/
private String stuPhone;
/**
* 學(xué)生班級
*/
private Long stuClass;
/**
* 學(xué)生地址
*/
private String stuAddress;
}4、新建StudentMapper接口
package com.lv.code.mapper;
import com.lv.code.pojo.Student;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
@Repository
public interface StudentMapper extends Mapper<Student> {
}5、Springboot04Application內(nèi)引用mapper
package com.lv.code;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.lv.code.mapper")
public class Springboot04Application {
public static void main(String[] args) {
SpringApplication.run(Springboot04Application.class, args);
}
}6、application.yml文件配置
server:
port: 8080
# 配置數(shù)據(jù)源
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/aaa?userSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
# 日志打印
logging:
level:
com.lv.code.mapper: debug7、測試
Springboot04ApplicationTests:
package com.lv.code;
import com.lv.code.mapper.StudentMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot04ApplicationTests {
@Autowired
StudentMapper mapper;
@Test
void contextLoads() {
System.out.println(mapper.selectAll());
}
}
8、將切面、util包、啟動器導(dǎo)入
導(dǎo)入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>切面PageAspect:
package com.lv.code.aspect;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lv.code.util.PageBean;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
* @author yk
*/
@Component
@Aspect
@Slf4j
public class PageAspect {
@Around(value = "execution(* *..*Service.*Pager(..))")
public Object invoke(ProceedingJoinPoint point) throws Throwable {
PageBean pageBean = null;
for (Object e : point.getArgs()) {
if (e instanceof PageBean) {
pageBean = (PageBean) e;
break;
}
}
if (pageBean != null && pageBean.isPagination()) {
PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
}
Object obj = point.proceed(point.getArgs());
if (obj != null) {
if (obj instanceof Page) {
Page page = (Page) obj;
PageInfo pageInfo = new PageInfo(page);
pageBean.setTotal(new Long(pageInfo.getTotal()).intValue());
return pageInfo.getList();
}
}
return obj;
}
}util包中的PageBean類
package com.lv.code.util;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author 銀嚳
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
private int total;
private int page = 1;
private int rows = 5;
private boolean pagination = true;
private String url;
private Map<String, String[]> ms;
public void setMs(Map<String, String[]> ms) {
this.ms = ms;
}
public int calcStartIndex() {
return (page - 1) * rows;
}
public int calcMaxPage() {
return total % rows == 0 ? total / rows : total / rows + 1;
}
public int nextPage() {
return Math.min(page + 1, calcMaxPage());
}
public int prevPage() {
return Math.max(page - 1, 1);
}
public void setRequest(HttpServletRequest req) {
setUrl(req.getRequestURL().toString());
setMs(req.getParameterMap());
String page = req.getParameter("page");
if (page == null) {
setPage(1);
} else {
setPage(Integer.parseInt(page));
}
String rows = req.getParameter("rows");
if (rows == null) {
setRows(5);
} else {
setRows(Integer.parseInt(rows));
}
String pagination = req.getParameter("pagination");
if ("false".equals(pagination)) {
setPagination(false);
}
}
}9、新建service層
新建StudentService接口:
package com.lv.code.service;
import com.lv.code.pojo.Student;
import com.lv.code.util.PageBean;
import java.util.List;
public interface StudentService {
List<Student> findPager(PageBean pageBean);
}實現(xiàn)StudentService接口:StudentServiceImpl
package com.lv.code.service;
import com.lv.code.mapper.StudentMapper;
import com.lv.code.pojo.Student;
import com.lv.code.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper mapper;
@Override
public List<Student> findPager(PageBean pageBean) {
return mapper.selectAll();
}
}10、新建controller層
StudentController類:
package com.lv.code.controller;
import com.github.pagehelper.PageRowBounds;
import com.lv.code.service.StudentService;
import com.lv.code.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class StudentController {
@Autowired
private StudentService service;
@GetMapping
public Object find(HttpServletRequest request){
PageBean pageBean=new PageBean();
pageBean.setRequest(request);
return service.findPager(pageBean);
}
}11、運行啟動類Springboot04Application,訪問localhost:8080網(wǎng)址
二、freemarker介紹
1、新建資源文件application.yml
更改配置文件,添加freemarker配置
server:
port: 8080
# 配置數(shù)據(jù)源
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/aaa?userSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
freemarker:
#指定HttpServletRequest的屬性是否可以覆蓋controller的model的同名項
allow-request-override: false
#req訪問request
request-context-attribute: req
#后綴名freemarker默認(rèn)后綴為.ftl,當(dāng)然你也可以改成自己習(xí)慣的.html
suffix: .ftl
#設(shè)置響應(yīng)的內(nèi)容類型
content-type: text/html;charset=utf-8
#是否允許mvc使用freemarker
enabled: true
#是否開啟template caching
cache: false
#設(shè)定模板的加載路徑,多個以逗號分隔,默認(rèn): [ “classpath:/templates/” ]
template-loader-path: classpath:/templates/
#設(shè)定Template的編碼
charset: UTF-8
# 日志打印
logging:
level:
com.lv.code.mapper: debug2、模板語法

3、在資源文件中的templates文件下新建index.ftl文件
增加模塊:



然后可選中freemarker直接生成ftl文件
到此這篇關(guān)于Springboot整合FreeMarker的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Springboot整合FreeMarker 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 根據(jù)經(jīng)緯度獲取地址實現(xiàn)代碼
這篇文章主要介紹了 java 根據(jù)經(jīng)緯度獲取地址實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
java報錯Cause: java.sql.SQLException問題解決
本文主要介紹了java報錯Cause: java.sql.SQLException問題解決,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Java中BigDecimal與0比較的一個坑實戰(zhàn)記錄
BigDecimal屬于大數(shù)據(jù),精度極高,不屬于基本數(shù)據(jù)類型,屬于java對象,下面這篇文章主要給大家介紹了關(guān)于Java中BigDecimal與0比較的一個坑的相關(guān)資料,需要的朋友可以參考下2022-12-12
Nacos docker單機(jī)模式部署實現(xiàn)過程詳解
這篇文章主要介紹了Nacos docker單機(jī)模式部署實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Curator實現(xiàn)zookeeper的節(jié)點監(jiān)聽詳解
這篇文章主要介紹了Curator實現(xiàn)zookeeper的節(jié)點監(jiān)聽詳解,Curtor框架中一共有三個實現(xiàn)監(jiān)聽的方式,一種是NodeCache監(jiān)聽指定節(jié)點,一種是pathChildrenCache監(jiān)聽子節(jié)點,一種是TreeCache可以監(jiān)控所有節(jié)點 相當(dāng)于以上兩種的合集,需要的朋友可以參考下2023-12-12
如何使用Spring boot的@Transactional進(jìn)行事務(wù)管理
這篇文章介紹了SpringBoot中使用@Transactional注解進(jìn)行聲明式事務(wù)管理的詳細(xì)信息,包括基本用法、核心配置參數(shù)、關(guān)鍵注意事項、調(diào)試技巧、最佳實踐以及完整示例,感興趣的朋友一起看看吧2025-02-02
java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析
這篇文章主要為大家介紹了java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Spring事務(wù)中@Transactional注解不生效的原因分析與解決
在Spring框架中,@Transactional注解是管理數(shù)據(jù)庫事務(wù)的核心方式,本文將深入分析事務(wù)自調(diào)用的底層原理,解釋為什么事務(wù)不生效,并提供多種解決方案,希望對大家有所幫助2025-03-03

