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.模板文件位置
  • 相关阅读:
    forEach方法的实现
    经典笔试题
    Js中的filter()方法
    arguments参数对象
    随机验证码实现
    DB2 字符串比较
    博客园那篇文章,怎么被“注入”的?
    DB2存储过程创建临时表,返回临时表集合
    Struts的一些关键词
    DB2使用笔记生成存储过程ID
  • 原文地址:https://www.cnblogs.com/aixing/p/13327200.html
Copyright © 2011-2022 走看看