spring下使用free marker

本文介绍了在Spring项目中如何集成并使用FreeMarker模板引擎,包括添加Maven依赖,配置applicationContext.xml,设置视图解析器,控制器中返回视图名称,以及在FreeMarker模板中的基本用法和页面静态化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring下maven依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.20</version>
</dependency>

在applicationContent.xml配置
将视图获取器的bean配置为

<bean id="freeMarkerConfigurer"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/tpl/"></property><!-- 视图模板的位置 -->
        <property name="defaultEncoding" value="utf-8" />
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">1</prop>
                <prop key="locale">zh_CN</prop>
                <prop key="datetime_format">yyyy-MM-dd</prop><!-- 时间格式化 -->
                <prop key="date_format">yyyy-MM-dd</prop><!-- 日期格式化 -->
                <prop key="number_format">#.##</prop>
            </props>
        </property>
    </bean>

    <bean id="freeMarkerViewResolver"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="cache" value="true" />
        <property name="prefix" value="" />
        <property name="suffix" value=".tpl" /><!-- 模板默认后缀名 -->
        <property name="contentType" value="text/html;charset=UTF-8" />
        <property name="allowSessionOverride" value="true" />
        <property name="allowRequestOverride" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="requestContextAttribute" value="request" />
    </bean>

在控制器直接返回视图

@RequestMapping("index")
public ModelAndView Select(SearchInfo searchInfo,ModelAndView modelAndView) {
        modelAndView.setViewName("index");
        try {
            List list = (List) getMethod("select", SearchInfo.class).invoke(service, searchInfo);
            modelAndView.addObject("list", list);
            return modelAndView;
        } catch (Exception e) {
            return modelAndView;
        }
}

在模板中

${user.name}   单值
<#list list as item >       遍历集合中的元素
    <font color="red">${item}</br></font>
    ${item_index}//下标
</#list>
${myDate?date} 日期 
${myDate?time}   时间 
${myDate?datetime}     时间戳 
${objectArray[0]},${objectArray[1]},${objectArray[2]}  对象数组
key1=${map.key1},key2=${map.key2},key3=${map.key3}  map访问
if判断
    <#if strValue_index == 0>       
    <#elseif !strValue_has_next>
    <#else>  
    </#if> 
swich
    < #switch value>        
        < #case refValue>...<#break> 
        < #case refValue>...<#break> 
        < #default>... 
    < /#switch> 

关于页面静态化

//在这里我将页面静态化的步骤放入了一个工具类中,让其作为一个静态方法,方便多次调用
public class PageStatic {
    /**
     * 静态化页面,将模板渲染后,生成一个真是存在的文件
     * @param filePath  模板文件的路径
     * @param templateName  模板文件的名字
     * @param dataModelMap  要渲染的数据
     * @param destPath      生成后的 文件的位置
     * @throws Exception
     */
    public static void staticPage(String filePath,String templateName,Map dataModelMap,String destPath) throws Exception {
        // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
        Configuration configuration = new Configuration();
         // 第二步:设置模板文件所在的路径。
        configuration.setDirectoryForTemplateLoading(new File(filePath));
        // 第三步:设置模板文件使用的字符集。一般就是utf-8.
        configuration.setDefaultEncoding("utf-8");
        // 第四步:加载一个模板,创建一个模板对象。
        Template template = configuration.getTemplate(templateName);
        // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
        // Map dataModel = new HashMap();
        // 向数据集中添加数据
        // dataModel.put("hello", "this is my first freemarker test.");
        // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
        Writer out = new FileWriter(new File(destPath));
        System.out.println("已创建"+destPath);
        // 第七步:调用模板对象的process方法输出文件
        template.process(dataModelMap, out);
        System.out.println("已输出");
        // 第八步:关闭流。
        out.close();

    }
}

在控制器中使用

@RequestMapping("index")
public String Select(SearchInfo searchInfo,HttpServletRequest req) {
    try {
        //获取数据
        List list = (List) getMethod("select", SearchInfo.class).invoke(service, searchInfo);
        HashMap<String, List> map = new HashMap<String, List>();
        map.put("list", list);
        //获取模板所在的位置
        File file = new File(req.getServletContext().getRealPath("/WEB-INF/ftl/"));
        //静态化页面生成的位置
        File destFile = new File(req.getServletContext().getRealPath("/staticHtml/"));
        //静态化页面
        String destPath = destFile.getPath()+"/index.html";
        //生成静态页面
        PageStatic.staticPage(file.getPath(), "index.ftl", map, destPath );
        //重定向到静态化页面
        return "redirect:/staticHtml/index.html";
    } catch (Exception e) {
        return "redirect:/staticHtml/index.html";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值