初建FreeMarker工程

背景:听说freemarker可以用来写页面的组件,热衷于编写可重用代码的我,迫不及待地研究了freemarker,不过,在写组件之前,还是先研究一下freemarker的基本用法。

摘要:本文用了3种不同的方式(main、servlet、action),将freemarker融入工程之中。

一、通过main方法使用freemarker

  1.新建一个普通的Java工程,在工程引入freemarker.jar,(右键-BuildPath(构建路径)-ConfigureBuildPath(配置构建路径) )。

  2.在工程的根目录下建立一个文件夹,命名为templates(命名随意),用来放freemarker的模板文件。

  3.在templates下面新建一个模板文件,命名为sample(命名随意),后缀格式ftl(后缀随意,一般是ftl),文件内容就写一句简单的:

你好${username}

  (以后通过这个模板文件,就可以生成:你好张三、你好李四、你好王五。这个模板,看起来跟使用了struts2的JSP文件差不多,其实struts2本来就用了freemarker,struts2的基础jar包里就有freemarker.jar)

  4.main方法如下:

public class Test
{
public static void main(String[] args) throws Exception
{
//读取模板文件的所在目录
Configuration configuration = new Configuration();
configuration.setDirectoryForTemplateLoading(new File("templates")); //读取模板文件
Template template = configuration.getTemplate("sample.ftl"); //数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "lwp"); //输出方式
Writer out = new OutputStreamWriter(System.out); //将模板转换并输出
template.process(map, out); //使用了流之后,记得要关掉
out.close();
}
}

  5.在控制台看输出结果为:

你好lwp

  (体验了简单的,接着就试试高级一点的)

  6.在templates下面新建一个模板文件header.ftl,内容如下:

<#macro show age="50">
${username}-${age}
</#macro> <#macro show2 age="50">
<#nested>-${age}
</#macro>

  7.修改sample.ftl,内容如下:

1.你好,${username}
2.你好,<#if username=="lwp">程序猿<#else>${username}</#if>
3.你好,${user.name} <#include "header.ftl">
4.你好,<@show />
5.你好,<@show age="12" /> 6.你好,<@show2>${username}</@show2>
7.你好,<@show2 age="12">${username}</@show2> <#import "header.ftl" as lwp>
8.你好,<@lwp.show />
9.你好,<@lwp.show age="12" />

  8.新建一个User类:

public class User implements Serializable
{
private static final long serialVersionUID = 1L; private String name; public User(String name)
{
this.name = name;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
}
}

  9.main方法改为这样:(多了一句map.put("user", new User("userLWP"));)

public class Test
{
public static void main(String[] args) throws Exception
{
//读取模板文件的所在目录
Configuration configuration = new Configuration();
configuration.setDirectoryForTemplateLoading(new File("templates")); //读取模板文件
Template template = configuration.getTemplate("sample.ftl"); //数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "lwp");
map.put("user", new User("userLWP")); //输出方式
Writer out = new OutputStreamWriter(System.out); //将模板转换并输出
template.process(map, out); //使用了流之后,记得要关掉
out.close();
}
}

  10.在控制台看结果:

1.你好,lwp
2.你好,程序猿
3.你好,userLWP
4.你好,lwp-50
5.你好,lwp-12
6.你好,lwp-50
7.你好,lwp-12
8.你好,lwp-50
9.你好,lwp-12

  (效果甚好,我打算以后就用macro来写组件了)

二、通过servlet使用freemarker

  1.新建一个动态web工程,把freemarker.jar复制到WEB-INF的lib里面,(如果不起作用,就用上面的方式引入freemarker.jar吧)。

  2.在WebRoot或WebContent下面,建立一个文件夹,命名为templates(命名随意),用来放freemarker的模板文件。

  3.在templates下面新建一个模板文件,命名为sample(命名随意),后缀格式ftl(后缀随意,一般是ftl),文件内容如下:

  (在servlet中,使用了response输出为网页,所以模板内容按照html5的规范来写,不能像上面那样随意了)

<!DOCTYPE html>
<html>
<head>
<title>MyHtml.html</title>
<meta charset="utf-8">
</head> <body>
1.你好,${username}<br>
2.你好,<#if username=="lwp">程序猿<#else>${username}</#if><br>
3.你好,${user.name}<br> <#include "header.ftl">
4.你好,<@show /><br>
5.你好,<@show age="12" /><br> 6.你好,<@show2>${username}</@show2><br>
7.你好,<@show2 age="12">${username}</@show2><br> <#import "header.ftl" as lwp>
8.你好,<@lwp.show /><br>
9.你好,<@lwp.show age="12" /><br>
</body>
</html>

  4.header.ftl专门被引用,跟之前的一样就行:

<#macro show age="50">
${username}-${age}
</#macro> <#macro show2 age="50">
<#nested>-${age}
</#macro>

  5.复制刚才的User类:

public class User implements Serializable
{
private static final long serialVersionUID = 1L; private String name; public User(String name)
{
this.name = name;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
}
}

  6.新建servlet类,内容如下:

public class TestServlet extends HttpServlet
{
private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
this.execute(req, resp);
}
catch (Exception e)
{
e.printStackTrace();
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
this.execute(req, resp);
}
catch (Exception e)
{
e.printStackTrace();
}
} public void execute(HttpServletRequest req, HttpServletResponse resp)
throws Exception
{
//读取模板文件的所在目录
Configuration configuration = new Configuration();
configuration.setServletContextForTemplateLoading(super.getServletContext(), "templates");
configuration.setDefaultEncoding("utf-8"); //读取模板文件
Template template = configuration.getTemplate("sample.ftl"); //数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "lwp");
map.put("user", new User("userLWP")); //输出方式:response输出
resp.setCharacterEncoding("utf-8");
Writer out = resp.getWriter(); //将模板转换并输出
template.process(map, out); //使用了流之后,记得要关掉
out.close();
}
}

  7.在web.xml配置一下servlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0"> <!-- 项目名称 -->
<display-name>freemarker_servlet</display-name> <servlet>
<!-- servlet的名称(随意) -->
<servlet-name>TestServlet</servlet-name> <!-- servlet的所在路径(按实际填写) -->
<servlet-class>lwp.TestServlet</servlet-class>
</servlet> <servlet-mapping>
<!-- servlet的名称(跟上面一样) -->
<servlet-name>TestServlet</servlet-name> <!-- servlet的请求url -->
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</web-app>

  8.启动一下tomcat,在地址栏输入http://localhost:8080/freemarker_servlet/TestServlet

  9.看到运行结果:

1.你好,lwp
2.你好,程序猿
3.你好,userLWP
4.你好,lwp-50
5.你好,lwp-12
6.你好,lwp-50
7.你好,lwp-12
8.你好,lwp-50
9.你好,lwp-12

  (其实,自从接触struts2之后,我已经好久没用servlet了)

三、通过action使用freemarker

  1.新建一个动态web工程,把struts2的基础包复制到WEB-INF的lib下面。

  (基础包在struts-2.3.16.1\apps\struts2-blank.war,用解压软件打开之后,找到WEB-INF\lib,里面那些包就是基础包了,其中包括了freemarker-2.3.19.jar)。

  2.在WebRoot或WebContent下面,建立一个文件夹,命名为templates(命名随意),用来放freemarker的模板文件。

  3.在templates下面新建一个模板文件,命名为sample(命名随意),后缀格式ftl(后缀随意,一般是ftl),文件内容如下:

  (因为要输出为网页,所以模板内容按照html5的规范来写)

<!DOCTYPE html>
<html>
<head>
<title>MyHtml.html</title>
<meta charset="utf-8">
</head> <body>
<#if user ?? || username ??>
1.你好,${username}<br>
2.你好,<#if username=="lwp">程序猿<#else>${username}</#if><br>
3.你好,${user.name}<br> <#include "header.ftl">
4.你好,<@show /><br>
5.你好,<@show age="12" /><br> 6.你好,<@show2>${username}</@show2><br>
7.你好,<@show2 age="12">${username}</@show2><br> <#import "header.ftl" as lwp>
8.你好,<@lwp.show /><br>
9.你好,<@lwp.show age="12" /><br>
</#if>
</body>
</html>

  4.header.ftl专门被引用,跟之前的一样就行:

<#macro show age="50">
${username}-${age}
</#macro> <#macro show2 age="50">
<#nested>-${age}
</#macro>

  5.复制之前的User类:

public class User implements Serializable
{
private static final long serialVersionUID = 1L; private String name; public User(String name)
{
this.name = name;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
}
}

  6.新建action,内容如下:

public class TestAction extends ActionSupport
{
private static final long serialVersionUID = 1L; private String username;
private User user; @Override
public String execute() throws Exception
{
//数据
this.username = "lwp";
this.user = new User("userLWP"); //返回
return ActionSupport.SUCCESS;
} public String getUsername()
{
return username;
} public void setUsername(String username)
{
this.username = username;
} public User getUser()
{
return user;
} public void setUser(User user)
{
this.user = user;
}
}

  7.在struts.xml配置action:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package name="default" extends="struts-default">
<!-- action的请求名字 -->
<action name="test" class="lwp.TestAction">
<result name="success" type="freemarker">/templates/sample.ftl</result>
</action> <!-- ftl模板文件是不能直接输出的,经过action之后才能转化页面显示。以下这个配置是经过action的直接返回 -->
<action name="*">
<result type="freemarker">/templates/{1}.ftl</result>
</action>
</package>
</struts>

  8.在web.xml配置struts:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0"> <!-- 项目名称 -->
<display-name>freemarker_struts</display-name> <!-- struts2的配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

  9.启动一下tomcat,在地址栏输入http://localhost:8080/freemarker_struts/test.action

  10.看到运行结果:

1.你好,lwp
2.你好,程序猿
3.你好,userLWP
4.你好,lwp-50
5.你好,lwp-12
6.你好,lwp-50
7.你好,lwp-12
8.你好,lwp-50
9.你好,lwp-12

初建FreeMarker工程的更多相关文章

  1. android学习17——命令行建gradle工程

    使用命令行建gradle工程要涉及到几个工具的版本. 1.gradle的版本.这个用gradle -version查到. 2.SDK BuildTools的版本. 这个要先配好SDK的环境变量,然后在 ...

  2. SSH整合 第二篇 工程初建

    SSH整合,第二篇. 创建工程 这里只是测试和理解hibernate.建立Java工程就好了. 1.hibernate-4.2.21.jar hibernate包下的required,即\hibern ...

  3. react 工程起步 安装chrome 开发调试工具 react developer tools 及初建一个react 项目...

    1.安装react 开发工具 1.下载    chrome      react developer tools 下载地址:https://pan.baidu.com/s/1eSZsXDC  下载好是 ...

  4. 用maven在eclipse用spring建javaweb工程(一)

    一,步骤   只标注重点步骤: 新建工程选择Maven Project next---next---选择web工程 next---命名如下: 点击finish创建完成. 二,index.jsp和pom ...

  5. 在eclipse中使用Maven建web工程的两种方式

    Eclipse版本:Neon Release (4.6.0) Maven版本:3.3.9 第一种方式: 右键新建maven工程,勾选创建一个简单工程 填入信息,注意打包方式要改为war 点击完成,创建 ...

  6. Vue学习笔记(五)——配置开发环境及初建项目

    前言 在上一篇中,我们通过初步的认识,简单了解 Vue 生命周期的八个阶段,以及可以应用在之后的开发中,针对不同的阶段的钩子采取不同的操作,更好的实现我们的业务代码,处理更加复杂的业务逻辑. 而在这一 ...

  7. Hibernate 系列教程2-创建maven工程

    第1步:通过eclipse新建1个java maven项目. 选择file–>new–>other–>MAVEN PROJECT选项 第2步:New Maven project 选择 ...

  8. IDEA 初建Spring项目(Hello Spring)

    新建项目 在文件夹中建立一个项目文件 打开项目 打开IDEA,点击Open,根据所建项目路径找到该项目 依赖注入 点击项目名右键,点击new,点击file,创建pom.xml 内容为: <pro ...

  9. springMVC整理01--搭建普通的工程

    1. Spring MVC 简介Spring MVC 是 Spring 基于 MVC 设计理念提供的一个表现层的 Web 框架.是目前主流的MVC 框架之一.Spring MVC 通过一套 MVC 注 ...

随机推荐

  1. 忽然想到,为什么以前iOS的工资高

    听说做iOS的在上海工资也可以  前几年还行,现在也不太行了除非你水平很高 现在移动应用已经100多万了,基本饱和了以前是新的商业模式要抢时间,会的人也少

  2. 通过硬件层提高Android动画的性能

    曾有许多人问我为什么在他们开发的应用中,动画的性能表现都很差.对于这类问题,我往往会问他们:你们有尝试过在硬件层解决动画的性能问题么? 我们都知道,在播放动画的过程中View在每一帧动画的显示时重绘自 ...

  3. Win7资源管理器已停止工作——StackHash_6c37,R6205错误

      2013-9-20 此问题由来已久,截图及"问题签名"如下: 问题签名: 问题事件名称: BEX64 应用程序名: Explorer.EXE 应用程序版本: 6.1.7601. ...

  4. Uncompressing Linux___ done, booting the kernel_tekkamanninja-ChinaUnix博客

    今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,所以移植到能够启动起来的阶段很简单,但是在移植的时候还是出现了一个比较常见的问题: MIN ...

  5. oracle构建一致性读

    对于实际的业务系统,通常有一些热点的表,insert和delete的量非常大,这个时候就会发现一些查询语句的逻辑读比较偏高,这时可能就是oracle在构建一致性块的进行的consistent read ...

  6. Ext.onReady(function(){} )函数的作用域分析(1)

    Ext.onReady(function(){ var genResultDelete = function(){ alert('delete') ; } var renderResult = fun ...

  7. Xcode5下去除Icon高光

    1:Images.xcassets中, 选中图片, 查看属性. 在“iOS icon is pre-rendered” 打勾 2:Info.plist中修改 (1):添加 Icon already i ...

  8. centos 6.4 大容量磁盘分区步骤

    首先安装分区工具 yum install parted 假设需要分区的设备为/dev/sdb 运行如下命令 parted /dev/sdb (parted) mklabel gpt #大于2TB的磁盘 ...

  9. HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)

    异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Des ...

  10. 数据库分库分表(sharding)系列【转】

    原文地址:http://www.uml.org.cn/sjjm/201211212.asp数据库分库分表(sharding)系列 目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三 ...