SpringBoot整合Freemarker

一、SpringBoot 项目常见目录结构

常见目录:
SpringBoot整合Freemarker_第1张图片

1. 代码层(src/main/java)结构

根目录:com.wfxuni

  • 启动类(SpringBootStructureApplication.java)推荐放在根目录com.wfxuni包下;

  • 实体类:jpa项目com.wfxuni.domain,mybatis项目com.wfxuni.pojo/entity

  • 数据接口访问层(Dao):jpa项目com.wfxuni.repository,mybatis项目com.wfxuni.mapper

  • 数据服务接口层(Service):com.wfxuni.service

  • 数据服务实现层(Service Implements):com.wfxuni.service.impl

  • 前端控制器层(Controller):com.wfxuni.controller

  • 工具类库(utils):com.wfxuni.utils

  • 配置类(config):com.wfxuni.config

  • 数据传输对象(dto):com.wfxuni.dto,- - 数据传输对象(Data Transfer Object)用于封装多个实体类(domain)之间的关系,不破坏原有的实体类结构;

  • 视图包装对象(vo):com.wfxuni.vo,- - 视图包装对象(View Object)用于封装客户端请求的数据,防止部分数据泄露(如:管理员ID),保证数据安全,不破坏 原有的实体类结构。


2. 资源目录resources结构

  • 项目配置文件:resources/application.yml或者resources/application.properties

  • 静态资源目录:resources/static/,用于放置html、css、js和图片等静态资源,该目录下的所有文件可以被直接访问;

  • 视图模板目录:resources/templates/,用于存放freemarker、thymeleaf等模板文件;

  • mybatis映射文件:mybatis项目,resources/mapper/

  • mybatis配置文件:mybatis项目,resources/mapper/config/

补充:SpringBoot工程是没有webapp文件夹的,静态文件放在src/main/resources/static文件夹下,可以被直接访问,而模板文件放在src/main/resources/templates下,该文件夹没有被映射,模板文件无法直接访问。


二、SpringBoot使用Freemarker

创建一个基本的SpringBoot Maven项目后,使用Freemarker步骤:

1. pom文件添加freemarker依赖


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring‐boot‐starter‐freemarkerartifactId>
dependency>

2. 配置文件中添加配置

# 设置返回页面的后缀名,默认后缀名为.ftl,前提是加载了freemarker依赖
spring.freemarker.suffix=.ftl
# 设置模板文件加载路径,默认是/templates/
spring.freemarker.template-loader-path=classpath:/templates/

# 设置freemarker页面编码格式
spring.freemarker.charset=UTF-8
# 设置视图输出HTML的contentType
spring.freemarker.content-type=text/html

# 开放过程中关闭freemarker缓存方便调试
# 关闭freemarker页面缓存
spring.freemarker.cache=false
# 设置刷新模板的时间间隔
spring.freemarker.settings.template_update_delay=0

3. controller跳转到目标页面

@Controller
@RequestMapping("/to")
public class WelcomeController {

    @RequestMapping("/freemarker")
    public String toFreemarker(){
        return "welcome";
    }
}

注意freemarker文件所在位置,并修改对应模板文件加载路径
SpringBoot整合Freemarker_第2张图片

4. 访问成功
SpringBoot整合Freemarker_第3张图片

三、Controller层返回后台数据到Freemarker

1. src/resources/templates/hello.ftl


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FREEMARKER PAGEtitle>
head>
<body>

    <h2>Hello,${user.username},${user.address}好玩吗?h2>

body>
html>

2. HelloController

@Controller
@RequestMapping("/to")
public class HelloController{

    @RequestMapping("/hello")
    public String toHelloFtl(ModelMap map) {

        User user = new User();
        user.setUsername("小李");
        user.setAddress("深圳");
        map.addAttribute("user", user);
        return "hello";
    }

    @RequestMapping("/hello2")
    public ModelAndView toHelloFtl2() {
        ModelAndView mv = new ModelAndView();
        User user = new User();
        user.setUsername("小薛");
        user.setAddress("北京");

        mv.addObject("user", user);
        mv.setViewName("hello");
        return mv;
    }

}

3. 浏览器访问

SpringBoot整合Freemarker_第4张图片

SpringBoot整合Freemarker_第5张图片

四、Freemarker加载静态资源

1. 配置资源映射

SpringBoot 默认配置的/**映射到/static 或 /public、/resources、/META-INF/resources)/webjars/**会映射到classpath:/META-INF/resources/webjars/,注意:/static等目录都是在classpath:下。

静态资源映射还有一个配置选项,为了简单这里用.properties方式书写:

spring.mvc.static-path-pattern=/** # Path pattern used for static resources.

这个配置会影响默认的/**,假如修改为/static/**后,只能映射如/static/js/sample.js这样的请求(修改前是/js/sample.js),此外这个配置只能写一个值,不像大多数可以配置多个用逗号隔开的。


2. 编写代码加载静态资源

.properties中不配置,则默认为spring.mvc.static-path-pattern=/**

  • freemarker页面路径:src/resources/templates/freemarker/login.ftl
  • 样式文件路径:src/resources/static/css/login.css

SpringBoot整合Freemarker_第6张图片
成功访问:
SpringBoot整合Freemarker_第7张图片
如果配置文件改成:

spring.mvc.static-path-pattern=/static/** 

路径${base}/css/login.css要改为${base}/static/css/login.css


3. freemarker中获取项目根路径

.ftl文件头部加上:

<#assign base=springMacroRequestContext.contextPath />

引用:

<script src="${base}/js/demo.js" type=text/javascript"></script>

4. freemarker获取session

  • 实现多页面获取当前登录用户名
@RequestMapping("/")
public String showHome(HttpSession httpSession) {
    String name = SecurityContextHolder.getContext().getAuthentication().getName();
    // username存储到session中 前台根据 ${Session["username"]} 获取
    httpSession.setAttribute("username", name);
    return "main";
}

freemarker中用${Session["username"]},即可获取。


  • 参考:Spring Boot 静态资源处理

你可能感兴趣的:(Spring,Boot)