10-SpringMVC04

FreeMarker

1.入门案例

1. 导包:freemarker.jar
2. 需要创建模板文件的路径:src/main/resources/template
3. 创建一个模板对象:hello.ftl
4. 创建一个模板输出路径:src/main/resources/result/hello.html
5. 测试类:FreeMarkerTest.java
public class FreeMarkerTest {
@Test
public void test() throws IOException, TemplateException {
    //第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker的版本号。
    Configuration configuration = new Configuration();
    //第二步:设置模板文件所在的路径。
    File file=new File("src/main/resources/template");
    configuration.setDirectoryForTemplateLoading(file);
    //第三步:设置模板文件使用的字符集。一般就是utf-8.
    configuration.setDefaultEncoding("utf-8");
    //第四步:加载一个模板,创建一个模板对象。
    Template template = configuration.getTemplate("hello.ftl");
    //第五步:创建数据存放到map
    Map data=new HashMap<String,Object>();
    data.put("content","hello");
    //存放map
    Map user=new HashMap<String,String>();
    user.put("username","zhangsan");
    user.put("password","123456");
    data.put("user",user);
    //存放list
    List<String> list=new ArrayList<>();
    list.add("user1");
    list.add("user2");
    list.add("user3");
    list.add("user4");
    data.put("list",list);
    //判断
    data.put("gender","abc");
    /*日期*/
    data.put("birthday",new Date());
    //模板信息输出到指定html
    FileWriter fileWriter=new FileWriter(new File("src/main/resources/result/hello.html"));
    //将数据映射到输出的html
    template.process(data,fileWriter);
    //关闭流
    fileWriter.close();
}
}
6. hello.ftl:书写规范基本符合EL表达式
    1. 直接获取键值对:${content}
    2. 获取pojo,map
        * ${user.username}
    3. 遍历list
        <#list list as user>
        ${user}||序号:${user_index+1}
        </#list>
    4. 判断
        * <#if gender=="male">
            男性
        <#elseif gender=="female">
            女性
        <#else >
            中性
        </#if>
    5. 判断值是否存在:存在就会打印出该值,否则什么都不打印
        * ${content! ""}
    6. 日期格式化: ${birthday?string("yyyy-MM-dd HH:mm:ss")}
    7. include使用:
        <#include "bey.ftl">:
        注意:引用进来的文件也可以使用当前文件的数据值

2. Freemarker视图解析器

1. 导包
<dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.9</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.1.8.RELEASE</version>
</dependency>
2. 配置web应用
3. 注册Freemarker组件
1.  <!--freemarker的配置-->
    <!--freemarker的config-->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!--模板的加载路径,可以作为prefix-->
        <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
        <!--默认字符集-->
        <property name="defaultEncoding" value="utf-8"/>
    </bean>
    <!--freemarker的视图解析器-->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!--视图解析器的后缀-->
        <property name="suffix" value=".ftl"/>
    </bean>
2.   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewNames" value="jsp_*"/>
    </bean>
    <!--freemarker的配置-->
    <!--freemarker的config-->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!--模板的加载路径,可以作为prefix-->
        <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
        <!--默认字符集-->
        <property name="defaultEncoding" value="utf-8"/>
    </bean>
    <!--freemarker的视图解析器-->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!--视图解析器的后缀-->
        <property name="suffix" value=".ftl"/>
        <!--通过order属性,决定解析顺序-->
        <property name="order" value="1"/>
        <!--通过不同的view视图名分发给不同的解析器处理-->
        <property name="viewNames" value="fm_*"/>
    </bean>
和jsp视图解析器共存
1. 配置了同一个页面:视图解析器注册在前的,先执行
2. 配置不同的页面时:
    * Freemark解析器比较温和,如果view视图在freemarker的解析器下找不到页面,继续找下一个视图解析器
    * Jsp视图解析器比较霸道,如果view视图在jsp的解析器下找不到页面,不继续找,404
    *  在配置后缀的bean标签中增加,通过order属性,决定解析顺序
    *  <property name="order" value="1"/>
3. 通过不同的view视图名分发给不同的解析器处理
    * return "jsp_2";根据返回的视图去找对应的视图解析器
    * <property name="viewNames" value="jsp_*"/>
    * <property name="viewNames" value="fm_*"/>
posted @ 2019-08-04 22:18  励志前行  阅读(191)  评论(0编辑  收藏  举报