zoukankan      html  css  js  c++  java
  • Spring Boot 整合 Freemarker



    原文地址:

    江南一点雨:Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?



    1.Freemarker 简介

    Freemarker介绍及学习:Java模板引擎Freemarker
    在这里插入图片描述
    Freemarker 可以将模版和数据渲染成 HTML 。

    Freemarker 模版后缀为 .ftl(FreeMarker Template Language)。FTL 是一种简单的、专用的语言,它不是像 Java 那样成熟的编程语言。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

    2.Spring Boot 整合 Freemarker

    2.1 创建工程

    创建一个 Spring Boot 工程,引入 Freemarker 依赖,如下图:
    在这里插入图片描述

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    工程创建完成后,在 org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration 类中,可以看到关于 Freemarker 的自动化配置:

    @Configuration
    @ConditionalOnClass({ freemarker.template.Configuration.class, FreeMarkerConfigurationFactory.class })
    @EnableConfigurationProperties(FreeMarkerProperties.class)
    @Import({ FreeMarkerServletWebConfiguration.class, FreeMarkerReactiveWebConfiguration.class,
                    FreeMarkerNonWebConfiguration.class })
    public class FreeMarkerAutoConfiguration {
    }
    

    从这里可以看出,当 classpath 下存在 freemarker.template.Configuration 以及 FreeMarkerConfigurationFactory 时,配置才会生效,也就是说当我们引入了 Freemarker 之后,配置就会生效。但是这里的自动化配置只做了模板位置检查,其他配置则是在导入的 FreeMarkerServletWebConfiguration 配置中完成的。那么我们再来看看 FreeMarkerServletWebConfiguration 类,部分源码如下:

    @Configuration
    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
    @ConditionalOnClass({ Servlet.class, FreeMarkerConfigurer.class })
    @AutoConfigureAfter(WebMvcAutoConfiguration.class)
    class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration {
            protected FreeMarkerServletWebConfiguration(FreeMarkerProperties properties) {
                    super(properties);
            }
            @Bean
            @ConditionalOnMissingBean(FreeMarkerConfig.class)
            public FreeMarkerConfigurer freeMarkerConfigurer() {
                    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
                    applyProperties(configurer);
                    return configurer;
            }
            @Bean
            @ConditionalOnMissingBean(name = "freeMarkerViewResolver")
            @ConditionalOnProperty(name = "spring.freemarker.enabled", matchIfMissing = true)
            public FreeMarkerViewResolver freeMarkerViewResolver() {
                    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
                    getProperties().applyToMvcViewResolver(resolver);
                    return resolver;
            }
    }
    
    1. @ConditionalOnWebApplication 表示当前配置在 web 环境下才会生效。
    2. ConditionalOnClass 表示当前配置在存在 Servlet 和 FreeMarkerConfigurer 时才会生效。
    3. @AutoConfigureAfter 表示当前自动化配置在 WebMvcAutoConfiguration 之后完成。
    4. 代码中,主要提供了 FreeMarkerConfigurer 和 FreeMarkerViewResolver。
    5. FreeMarkerConfigurer 是 Freemarker 的一些基本配置,例如 templateLoaderPath、defaultEncoding 等
    6. FreeMarkerViewResolver 则是视图解析器的基本配置,包含了viewClass、suffix、allowRequestOverride、allowSessionOverride 等属性。

    在这个类的构造方法中,注入了 FreeMarkerProperties:

    @ConfigurationProperties(prefix = "spring.freemarker")
    public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {
            public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";
            public static final String DEFAULT_PREFIX = "";
            public static final String DEFAULT_SUFFIX = ".ftl";
            /**
             * Well-known FreeMarker keys which are passed to FreeMarker's Configuration.
             */
            private Map<String, String> settings = new HashMap<>();
    }
    

    FreeMarkerProperties 中则配置了 Freemarker 的基本信息,例如模板位置在 classpath:/templates/ ,再例如模板后缀为 .ftl,那么这些配置我们以后都可以在 application.properties 中进行修改。

    2.2 创建类

    public class User {
        private Long id;
        private String username;
        private String address;
        //省略 getter/setter
    }
    

    创建 UserController:

    @Controller
    public class UserController {
        @GetMapping("/index")
        public String index(Model model) {
            List<User> users = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                User user = new User();
                user.setId((long) i);
                user.setUsername("javaboy>>>>" + i);
                user.setAddress("www.javaboy.org>>>>" + i);
                users.add(user);
            }
            model.addAttribute("users", users);
            return "index";
        }
    }
    

    在 freemarker 中渲染数据:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <table border="1">
        <tr>
            <td>用户编号</td>
            <td>用户名称</td>
            <td>用户地址</td>
        </tr>
        <#list users as user>
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.address}</td>
            </tr>
        </#list>
    </table>
    </body>
    </html>
    

    在这里插入图片描述

    2.3 其他配置

    如果我们要修改模版文件位置等,可以在 application.properties 中进行配置:

    spring.freemarker.allow-request-override=false
    spring.freemarker.allow-session-override=false
    spring.freemarker.cache=false
    spring.freemarker.charset=UTF-8
    spring.freemarker.check-template-location=true
    spring.freemarker.content-type=text/html
    spring.freemarker.expose-request-attributes=false
    spring.freemarker.expose-session-attributes=false
    spring.freemarker.suffix=.ftl
    spring.freemarker.template-loader-path=classpath:/templates/
    

    配置文件按照顺序依次解释如下:

    1. HttpServletRequest的属性是否可以覆盖controller中model的同名项
    2. HttpSession的属性是否可以覆盖controller中model的同名项
    3. 是否开启缓存
    4. 模板文件编码
    5. 是否检查模板位置
    6. Content-Type的值
    7. 是否将HttpServletRequest中的属性添加到Model中
    8. 是否将HttpSession中的属性添加到Model中
    9. 模板文件后缀
      10.模板文件位置
  • 相关阅读:
    leetcode 155. Min Stack 、232. Implement Queue using Stacks 、225. Implement Stack using Queues
    leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String
    leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
    leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
    leetcode 162. Find Peak Element
    leetcode 88. Merge Sorted Array
    leetcode 74. Search a 2D Matrix 、240. Search a 2D Matrix II
    Android的API版本和名称对应关系
    spring 定时任务执行两次解决办法
    解析字符串为泛型的方法
  • 原文地址:https://www.cnblogs.com/aixing/p/13327200.html
Copyright © 2011-2022 走看看