1,添加该项目所使用到的所有依赖(自己想简化,可以试着去改动测试)
<!--配置freemarker模板依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--配置dozer依赖-->
<dependency>
<groupId>com.github.dozermapper</groupId>
<artifactId>dozer-spring-boot-starter</artifactId>
<version>6.2.0</version>
</dependency>
<!--添加mybatisplus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
<version>0.30</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.编辑全局配置文件application.yml
server:
port: 8888
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
freemarker:
cache: false # 缓存配置 开发阶段应该配置为false 因为经常会改
suffix: .ftl # 模版文件后缀名
charset: UTF-8 # 文件编码
template-loader-path: classpath:/templates/
3.然后在编写后台数据库代码过程中:
(1)写进行 modle 层
PO类 Article.class
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Article {
private Long id;
private String author;
private String title;
private String content;
private Date createtime;
}
VO类 ArticleVO.class (这里涉及到java bean的赋值转换中的一些知识,简单普及一下:在实际的开发过程中,由于业务的复杂性,通常并不能做到一个model实体贯穿持久层、服务层、控制层。通常需要进行实体对象java bean的赋值转换。自己项具体了解的,可以去百度。这里可以直接去实现)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ArticleVO { //VO类即是一个 前端展示的数据结构相对应
private Long id;
private String author;
private String title;
private String content;
@JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss",timezone = "GMT+8")
private Date createtime;
}
(2)其次是 dao 层
ArticleMapper.class
public interface ArticleMapper extends BaseMapper<Article> {
}
(3)再进行 service 层
ArticleService.class
public interface ArticleService {
void saveArticle(ArticleVO articleVO);
void deleteArticle(Long id);
void updateArticle(ArticleVO articleVO);
ArticleVO getArticle(Long id);
List<ArticleVO> getAll();
}
ArticleJPAServiceImpl.class
//里面的操作数据库方法都是baseMapper为我们提供
@Service
public class ArticleJPAServiceImpl implements ArticleService{
@Resource
private ArticleMapper articleMapper;
@Resource
private Mapper dozerMapper;
@Override
public void saveArticle( ArticleVO articleVO) {
Article articlePO = dozerMapper.map(articleVO,Article.class);
articleMapper.insert(articlePO);
}
@Override
public void deleteArticle(Long id) {
articleMapper.deleteById(id);
}
@Override
public void updateArticle(ArticleVO articleVO) {
//将articleVO转换为articlePO,使用dozer或者springUtils
Article articlePO=dozerMapper.map(articleVO,Article.class);
articleMapper.updateById(articlePO);
}
@Override
public ArticleVO getArticle(Long id) {
return dozerMapper.map(articleMapper.selectById(id),ArticleVO.class);
}
@Override
public List<ArticleVO> getAll() {
List<Article> articles=articleMapper.selectList(null);
return DozerUtils.mapList(articles,ArticleVO.class);
}
}
(4)最后进行 controller 层
ArticleController.class
@Slf4j //进行日志的一个打印
@RestController
@RequestMapping("/rest") //相当于在路径前面加了个test
public class ArticleController {
//service层注入
@Resource
ArticleService articleService;
//1.获取一篇文章
@GetMapping("/articles/{id}")
public AjaxResponse getArticle(@PathVariable("id") Long id){
ArticleVO article=articleService.getArticle(id);
log.info("article"+article);
return AjaxResponse.success(article);
}
//2.获取所有文章
@GetMapping("/articles")
public AjaxResponse getAll(){
List<ArticleVO> articles=articleService.getAll();
log.info("allArticles"+articles);
return AjaxResponse.success(articles);
}
//3.保存一篇文章
@PostMapping("/articles")
public AjaxResponse saveArticle(@RequestBody ArticleVO article){
articleService.saveArticle(article);
log.info("deleteArticle"+article);
return AjaxResponse.success();
}
//4.删除一篇文章
@DeleteMapping("/articles/{id}")
public AjaxResponse deleteArticle(@PathVariable("id") Long id){
articleService.deleteArticle(id);
log.info("deleteArticle"+id);
return AjaxResponse.success();
}
//5.更新一篇文章
@PutMapping("/articles")
public AjaxResponse updateArticle(@RequestBody ArticleVO article){
articleService.updateArticle(article);
log.info("updateArticle"+article);
return AjaxResponse.success();
}
}
TemplateController.class
@Controller
@RequestMapping("/template")
public class TemplateController {
@Resource
ArticleService articleService;
@GetMapping("/freemarker")
public String index(Model model) {
List<ArticleVO> articles = articleService.getAll();
model.addAttribute("articles", articles);
//模版名称,实际的目录为:resources/templates/fremarkertemp.ftl
return "freemarkertemp";
}
}
4.前端展示框架(在resources目录下的templates文件夹下,新建下面html文件并更改后缀名为ftl)
freemarkertemp.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/webjars/bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<table class="table">
<tr>
<td>作者</td>
<td>教程名称</td>
<td>内容</td>
</tr>
<#list articles as article>
<tr>
<td>${article.author}</td>
<td>${article.title}</td>
<td>${article.content}</td>
</tr>
</#list>
</table>
</div>
<script src="/webjars/jquery/jquery.min.js "></script>
<script src="/webjars/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
(5)我的实现路径: http://localhost:8888/template/freemarker,如果想继续学习freemarker相关的知识,可以浏览:http://freemarker.foofun.cn/index.html
(6)结果展示
5.随手记