FreeMarker

FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具,是一个Java类库。

通常由Java程序准备要显示的数据,交由FreeMarker调用对应的模板生成页面。

FreeMarker不是一个Web应用框架,而适合作为Web应用框架的一个组件。

FreeMarker与容器无关,因为它并不知道HTTP或者Servlet。FreeMarker同样可以应用于非Web应用程序环境。

FreeMarker更适合作为Model2框架(例如Struts、SpringMVC)的视图组件,也可以在模板中使用JSP标记库。

环境搭建

  1. 创建基于Maven的Web项目(maven-archetype-webapp

  2. 完善Maven项目目录,添加javaresources目录

  3. 在pom中加入FreeMarker依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>junit</groupId>
    4. <artifactId>junit</artifactId>
    5. <version>4.11</version>
    6. <scope>test</scope>
    7. </dependency>
    8. <dependency>
    9. <groupId>javax.servlet</groupId>
    10. <artifactId>javax.servlet-api</artifactId>
    11. <version>3.1.0</version>
    12. </dependency>
    13. <!-- FreeMarker依赖 -->
    14. <dependency>
    15. <groupId>org.freemarker</groupId>
    16. <artifactId>freemarker</artifactId>
    17. <version>2.3.23</version>
    18. </dependency>
    19. </dependencies>
  1. FreeMarker的核心是一个Servlet,所以需要在web.xml中配置FreeMarker的Servlet
    1. <servlet>
    2. <servlet-name>freemarker</servlet-name>
    3. <!-- FreeMarker的核心Servlet -->
    4. <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    5. <init-param>
    6. <!-- FreeMarker的.ftl模板文件存放路径 -->
    7. <param-name>TemplatePath</param-name>
    8. <param-value>/template</param-value>
    9. </init-param>
    10. <init-param>
    11. <!-- 模板默认编码 -->
    12. <param-name>default_encoding</param-name>
    13. <param-value>UTF-8</param-value>
    14. </init-param>
    15. </servlet>
    16. <servlet-mapping>
    17. <servlet-name>freemarker</servlet-name>
    18. <!-- 处理所有以.ftl结尾的文件请求。ftl是freemarker的模板文件默认后缀,即 Freemarker Template Language -->
    19. <url-pattern>*.ftl</url-pattern>
    20. </servlet-mapping>

示例程序

  1. 编写一个Servlet,用来向容器中添加数据
    1. @WebServlet("/hello")
    2. public class HelloServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. req.setCharacterEncoding("UTF-8");
    6. resp.setContentType("text/html;charset=UTF-8");
    7. // 存放数据
    8. req.setAttribute("msg", "hello freemarker");
    9. // 将请求转发给hello.ftl, 然后便可以走到FreemarkerServlet,FreemarkerServlet会调用hello.ftl模板进行渲染展示
    10. req.getRequestDispatcher("hello.ftl").forward(req, resp);
    11. }
    12. }
  1. webapp下创建template文件夹(即servlet中配置的TemplatePath),用于存放ftl模板文件。

  2. 创建hello.ftl文件

    1. <#-- 展示容器中的msg -->
    2. ${msg}
  1. 启动项目,访问/hello即可看到页面展示