freemarker与spring的整合

来源:互联网 发布:linux 怎么引导win 7 编辑:程序博客网 时间:2024/05/16 19:08

已经测试过freemarker的基本语法,但是项目中大多会用到spring,所以freemarker需要与spring进行整合,而spring也为我们提供了的FreemarkerConfigurer。

需求:在浏览器输入:localhost:8080/freemarker/index.do的时候跳转个一个欢迎页,但是在D:/模板引擎/freemarker下生成spring-freemarker.html文件。

1、创建maven项目freemarker,打包方式为war,指定tomcat容器运行环境。
2、导入springmvc和freemarker包,如下

<dependencies>    <dependency>        <groupId>org.freemarker</groupId>        <artifactId>freemarker</artifactId>        <version>2.3.23</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>4.2.4.RELEASE</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context-support</artifactId>        <version>4.2.4.RELEASE</version>    </dependency>    <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <version>4.12</version>    </dependency>  </dependencies>

3、部署描述文件web.xml中配置前端控制器,如下

<servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:applicationContext.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>springmvc</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>

4、在spring配置文件applicationContext.xml中进行相关配置

<context:component-scan base-package="com.hfut" />    <mvc:annotation-driven />    <bean        class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/" />        <property name="suffix" value=".jsp" />    </bean>    <!-- 配置freemark -->    <bean id="freemarkerConfig"        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />        <property name="defaultEncoding" value="GBK" />    </bean>

5、编写Controller

@Controllerpublic class HtmlGenController {    @Autowired    private FreeMarkerConfigurer configurer;    @RequestMapping("/index")    public String index(Model model){        //获取configuration对象        Configuration configuration = configurer.getConfiguration();        try {            //加载模板            Template template = configuration.getTemplate("freemarker1.ftl");            //创建数据集            Map map = new HashMap<>();            map.put("hello", "hello spring-freemarker");            //创建输出流            Writer out = new FileWriter(new File("D:/模板引擎/freemarker/spring-freemarker.html"));            //调用template的process方法输出文件            template.process(map, out);            //关闭流            out.close();        } catch (Exception e) {            e.printStackTrace();        }        model.addAttribute("hello", "hello freemarker");        return "index";    }}

6、浏览器访问:localhost:8080/freemarker/index.do
会跳转到/WEB-INF/index.jsp。
index.jsp内容如下

<body>    <h1>${hello }</h1></body>

这里写图片描述

查看D:/模板引擎/freemarke文件夹
这里写图片描述
到这里整合测试就成功了。

工程目录结构如下
这里写图片描述

需要注意的是,如果嫌这种方式测试麻烦,而希望只配置一下freemarker与spring的整合,再单独写个测试类测试的话。如下

1、配置文件中

<!-- 配置freemark -->    <bean id="freemarkerConfig"        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />        <property name="defaultEncoding" value="GBK" />    </bean>

2、测试类

public class SpringFreemarkerTest {    @Test    public void test() throws Exception{        ApplicationContext ac =                 new ClassPathXmlApplicationContext("classpath:applicationContext.xml");        FreeMarkerConfigurer configurer = ac.getBean("freemarkerConfig",FreeMarkerConfigurer.class);        //获取configuration对象        Configuration configuration = configurer.getConfiguration();        //加载模板        Template template = configuration.getTemplate("freemarker1.ftl");        //创建数据集        Map map = new HashMap<>();        map.put("hello", "hello spring-freemarker");        //创建输出流        Writer out = new FileWriter(new File("D:/模板引擎/freemarker/spring-freemarker.html"));        //调用template的process方法输出文件        template.process(map, out);        //关闭流        out.close();    }}

那么一旦运行就会抛出个异常如下:
这里写图片描述
这个时候找模板文件并不是去你指定的/WEB/ftl文件夹下去找,而是去resource下去找,所以根本找不到。

解决办法:将模板文件夹 放到resource下。然后配置的时候指定模板文件夹在classpath下的位置

<!-- 配置freemark -->    <bean id="freemarkerConfig"        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">        <property name="templateLoaderPath" value="classpath:/ftl" />        <property name="defaultEncoding" value="GBK" />    </bean>