一、最原始示例

1、引入POM依赖

  1. <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
  2. <dependency>
  3. <groupId>org.freemarker</groupId>
  4. <artifactId>freemarker</artifactId>
  5. <version>2.3.26-incubating</version>
  6. </dependency>
  7.  
  8. <!-- Servlet Library -->
  9. <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  10. <dependency>
  11. <groupId>javax.servlet</groupId>
  12. <artifactId>javax.servlet-api</artifactId>
  13. <version>3.1.0</version>
  14. <scope>provided</scope>
  15. </dependency>

2、在WEB-INF/ftl中建立test.ftl

  1. <html>
  2. <head>
  3. <title>Welcome!</title>
  4. </head>
  5. <body>
  6. <h1>
  7. Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
  8. </h1>
  9. </body>
  10. </html>

3、添加TestServlet.java

  1. package com.jsoft.testfreemarker;
  2.  
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6.  
  7. import javax.servlet.ServletException;
  8. import javax.servlet.annotation.WebServlet;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. import freemarker.template.Configuration;
  14. import freemarker.template.Template;
  15.  
  16. /**
  17. * Servlet implementation class TestServlet
  18. */
  19. @WebServlet(name = "test", urlPatterns = "/test")
  20. public class TestServlet extends HttpServlet {
  21. private static final long serialVersionUID = 1L;
  22.  
  23. private Configuration cfg;
  24. @Override
  25. public void init() throws ServletException {
  26. // initialize operation
  27. cfg = new Configuration(Configuration.VERSION_2_3_26);
  28. cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/ftl");
  29. }
  30. /**
  31. * Default constructor.
  32. */
  33. public TestServlet() {
  34. // TODO Auto-generated constructor stub
  35. }
  36.  
  37. /**
  38. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
  39. * response)
  40. */
  41. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  42. throws ServletException, IOException {
  43. response.setCharacterEncoding("utf-8");
  44. Map<String, Object> data = new HashMap<String, Object>();
  45. data.put("user", "Big Joe");
  46. // 得到模板
  47. try {
  48. // 将模板和数据结合,并返回浏览器
  49. Template template = cfg.getTemplate("test.ftl");
  50. template.process(data, response.getWriter());
  51. } catch (Exception e) {
  52. // e.printStackTrace();
  53. response.getWriter().print("暂时无数据");
  54. }
  55. }
  56.  
  57. /**
  58. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
  59. * response)
  60. */
  61. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  62. throws ServletException, IOException {
  63. // TODO Auto-generated method stub
  64. doGet(request, response);
  65. }
  66.  
  67. }

提示:采用了Servlet3.x的注解功能,不需要在web.xml中再配置映射。

4、测试效果

测试工程:https://github.com/easonjim/5_java_example/tree/master/freemarker/test2

二、高级一点的集成

1、在web.xml引入FreeMarker提供的Servlet

  1. <servlet>
  2. <servlet-name>freemarker</servlet-name>
  3. <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
  4. <init-param>
  5. <param-name>TemplatePath</param-name>
  6. <param-value>/</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>NoCache</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. <init-param>
  13. <param-name>ContentType</param-name>
  14. <param-value>text/html;charset=UTF-8</param-value>
  15. </init-param>
  16. <init-param>
  17. <param-name>template_update_delay</param-name>
  18. <param-value>0</param-value>
  19. </init-param>
  20. <init-param>
  21. <param-name>default_encoding</param-name>
  22. <param-value>UTF-8</param-value>
  23. </init-param>
  24. <init-param>
  25. <param-name>number_format</param-name>
  26. <param-value>0.##########</param-value>
  27. </init-param>
  28. </servlet>
  29. <servlet-mapping>
  30. <servlet-name>freemarker</servlet-name>
  31. <url-pattern>*.ftl</url-pattern>
  32. </servlet-mapping>

2、新建test.ftl模板文件

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
  3. <head>
  4. <title>test!</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  6. </head>
  7. <body>
  8. <div>
  9. 直接显示字符串<br />
  10. String:${strValue}<br/>
  11. <hr/>
  12. </div>
  13.  
  14. <div>
  15. 显示日期
  16. date:${myDate?date}<br/>
  17. <hr/>
  18. 显示时间
  19. time:${myDate?time}<br/>
  20. <hr/>
  21. 显示时间戳
  22. datetime:${myDate?datetime}<br/>
  23. <hr/>
  24. </div>
  25.  
  26. <div>
  27. 访问对象数组
  28. ObjectArray:
  29. ${objectArray[0]},${objectArray[1]},${objectArray[2]}
  30. <br />
  31. <hr/>
  32. </div>
  33.  
  34. <div>
  35. 遍历Set中的元素
  36. SetData:<br />
  37. <#list setData as value>
  38. ${value}
  39. </#list>
  40. <hr/>
  41. </div>
  42.  
  43. <div>
  44. 遍历List中的元素
  45. strList:<br/>
  46. <#list strList as strValue >
  47. <#if strValue_index == >
  48. ${strValue} is first element
  49. <#elseif !strValue_has_next>
  50. ${strValue} is last element
  51. <#else>
  52. ${strValue}
  53. </#if>
  54. <br />
  55. </#list>
  56. <hr/>
  57. </div>
  58.  
  59. <div>
  60. 获取map中的值
  61. <br/>
  62. map:
  63. key1=${map.key1},key2=${map.key2},key3=${map.key3}
  64. <hr/>
  65. </div>
  66.  
  67. <#include "foot.html">
  68. </body>
  69. </html>

foot.html为了演示模板中引入文件的效果

  1. <div style="margin-top: 50px;text-align: center;font-size: 12px">
  2. <hr />
  3. this is foot
  4. </div>

3、编写Servlet,这次的Servlet完全不用涉及到FreeMarker的类库使用,只关心Model即可。

  1. package com.jsoft.testfreemarker;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.HashSet;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Set;
  11.  
  12. import javax.servlet.ServletException;
  13. import javax.servlet.annotation.WebServlet;
  14. import javax.servlet.http.HttpServlet;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17.  
  18. /**
  19. * Servlet implementation class TestServlet
  20. */
  21. @WebServlet(name = "test", urlPatterns = "/test")
  22. public class TestServlet extends HttpServlet {
  23. private static final long serialVersionUID = 1L;
  24.  
  25. /**
  26. * Default constructor.
  27. */
  28. public TestServlet() {
  29. // TODO Auto-generated constructor stub
  30. }
  31.  
  32. /**
  33. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
  34. * response)
  35. */
  36. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  37. throws ServletException, IOException {
  38. String strValue = "this is String";
  39. Date myDate = new Date();
  40. Object[] objectArray = new Object[] { 1, "str", 1.2 };
  41. Set<Object> setData = new HashSet<Object>();
  42. setData.add("dataValue1");
  43. setData.add("dataValue2");
  44. setData.add("dataValue3");
  45. List<String> strList = new ArrayList<String>();
  46. strList.add("字符串1");
  47. strList.add("字符串2");
  48. strList.add("字符串3");
  49. Map<String, Object> map = new HashMap<String, Object>();
  50. map.put("key1", "value1");
  51. map.put("key2", "value2");
  52. map.put("key3", "value3");
  53. request.setAttribute("strValue", strValue);
  54. request.setAttribute("objectArray", objectArray);
  55. request.setAttribute("strList", strList);
  56. request.setAttribute("map", map);
  57. request.setAttribute("myDate", myDate);
  58. request.setAttribute("setData", setData);
  59. request.getRequestDispatcher("/WEB-INF/ftl/test.ftl").forward(request, response);
  60. }
  61.  
  62. /**
  63. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
  64. * response)
  65. */
  66. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  67. throws ServletException, IOException {
  68. // TODO Auto-generated method stub
  69. doGet(request, response);
  70. }
  71.  
  72. }

4、测试效果

测试工程:https://github.com/easonjim/5_java_example/tree/master/freemarker/test3

FreeMarker与Servlet结合示例的更多相关文章

  1. Freemarker与Servlet

    1.导入jar包(freemarker.jar) 2.web.xml配置一个普通servlet <servlet> <servlet-name>hello</servle ...

  2. Servlet小示例:jsp页面提交信息Servlet接收并打印输出

    该示例采用doPost方法提交表单,该示例一共包含两个文件. 一个是用来提交用户信息的表单userForm2.jsp,另一个是用来接收参数的Servlet. userForm2.jsp <%@ ...

  3. Servlet Filter 示例

    1. CityQuery.java package com.xxx.servlet; import com.google.common.collect.Lists; import com.xxx.da ...

  4. 开发一个Servlet示例

    Servlet响应请求步骤: Servlet是一个基于Java技术的Web组件,运行在服务器端,用户利用Servlet可以很轻松地扩展Web服务器的功能,使其满足特定的应用需要.Tomcat是一个常用 ...

  5. freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)

    什么是freemarker? freemarker类似于jsp,但不是jsp!怎么说呢?freemarker文件后缀是.ftl,它不像jsp本质是servlet,它将构建模板.解析模板.使用模板分离开 ...

  6. 【学习笔记】FreeMarker 之于Servlet与Stuts2的应用

    FreeMarker应用在Servlet(0配置web.xml形式): 准备环境: tomcat7.eclipse最新版.jdk1.8.freemarker v2.3.20.jar 举例项目结构图: ...

  7. FreeMarker的基础语法

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web ...

  8. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  9. 用freemarker生产静态页面

    FreeMarker概述 * FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写     * Template + data model = output    ...

随机推荐

  1. VMWare虚拟网络编辑

    VMWare虚拟网络编辑记录. 点击"编辑->虚拟网络编辑器" 在网卡列表中选择"VMnet8"查看目前设置,点击右下角的更改设置进行网络修改. 备注:更 ...

  2. 为WebSphere Application Server v8.5安装并配置JDK7

    IBM WebSphere Application Server v8.5可以同时支持不同版本的JDK共存,并且可以通过命令设置概要文件所使用的JDK版本.WAS8.5默认安装JDK6,如果要使用JD ...

  3. 每天学点Linux命令之Linux-Shell中的数据重定向与管道命令

    在Linux shell中, 数据重定向使用 > < 符号,管道命令使用 | 符号链接前后两个命令. 具体区别如下: 数据重定向 1.(>): 左侧应该有标准输出 > 右侧只能 ...

  4. 242 Valid Anagram 有效的字母异位词

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词.例如,s = "anagram",t = "nagaram",返回 true ...

  5. Install-Package : “XXXX”已拥有为“XXXX”定义的依赖项。

    Install-Package : “AutoMapper”已拥有为“NETStandard.Library”定义的依赖项.所在位置 行:1 字符: 16+ Install-Package <& ...

  6. can't set blob value on that column

    MySQL_Prepared_Statement::setBlob: can't set blob value on that column, MySQL error code:0, SQLState ...

  7. 前端面试题HTML

    浏览器页面有哪三层构成,分别是什么,作用是什么?

  8. SQL SERVER 2008 在某表中新增一列时失败

    背景:新增列语句如:“alter table 表名 add 列名 float default 0 with values”(用VS2010做网站,这句话是在C#代码里执行的) 报错提示: 警告: 已经 ...

  9. 安全,轻松的Axios与Nuxt.js集成

    modules: [ // Doc: https://github.com/nuxt-community/axios-module#usage '@nuxtjs/axios' ], /* ** Axi ...

  10. 全局唯一的支付和订单id生成算法

    数据库存储的是两个Long类型的复合主键.显示到页面的是一个27位的数字单号 package com.yunyihenkey.common.idworker; /** * * @desc * @aut ...