初建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. 新API:AttachThreadInput

    https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms681956(v=vs.85).aspx

  2. JavaScript 作用域和变量提升

    本文是这篇文章的简单翻译. 如果按照下面的代码按照JavaScript程序的执行方式执行,alert函数会显示什么? var foo = 1; function bar() { if (!foo) { ...

  3. listview异步加载sd卡图片

    package com.example.gridview; import java.io.File; import java.io.FileOutputStream; import java.io.I ...

  4. WebService开发应用

    WebService是运行于服务端(一般放在信息服务器上的)让客户端来调用的. 以下开发两个简单的实例 1.自己开发服务端自己调用(vs2010) 1).菜单:“新建-项目”,在打开的窗体中选择,如下 ...

  5. Learning WCF Chapter2 WCF Contracts and Serialization

    So far I’ve talked about the standards behind it all,but in fact WCF hides most of this from the dev ...

  6. jackson 常见问题

    org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type   org.codehaus ...

  7. (转载)顺序栈c++实现

    (转载)http://myswirl.blog.163.com/blog/static/51318642200882310239324/ SqStack.h********************** ...

  8. 区别typedef和#define

    1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如:#define PI 3.1415 ...

  9. bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2277  Solved: 853[Submit][Stat ...

  10. JavaScript高级程序设计30.pdf

    第12章 DOM2和DOM3 DOM1级主要定义的是HTML和XML文档的底层结构.DOM2和DOM3则在这个结构的基础上引入了更多的交互能力,也支持更高级的XML特性 DOM2和DOM3级分为许多模 ...