初建FreeMarker工程
初建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工程的更多相关文章
- android学习17——命令行建gradle工程
使用命令行建gradle工程要涉及到几个工具的版本. 1.gradle的版本.这个用gradle -version查到. 2.SDK BuildTools的版本. 这个要先配好SDK的环境变量,然后在 ...
- SSH整合 第二篇 工程初建
SSH整合,第二篇. 创建工程 这里只是测试和理解hibernate.建立Java工程就好了. 1.hibernate-4.2.21.jar hibernate包下的required,即\hibern ...
- react 工程起步 安装chrome 开发调试工具 react developer tools 及初建一个react 项目...
1.安装react 开发工具 1.下载 chrome react developer tools 下载地址:https://pan.baidu.com/s/1eSZsXDC 下载好是 ...
- 用maven在eclipse用spring建javaweb工程(一)
一,步骤 只标注重点步骤: 新建工程选择Maven Project next---next---选择web工程 next---命名如下: 点击finish创建完成. 二,index.jsp和pom ...
- 在eclipse中使用Maven建web工程的两种方式
Eclipse版本:Neon Release (4.6.0) Maven版本:3.3.9 第一种方式: 右键新建maven工程,勾选创建一个简单工程 填入信息,注意打包方式要改为war 点击完成,创建 ...
- Vue学习笔记(五)——配置开发环境及初建项目
前言 在上一篇中,我们通过初步的认识,简单了解 Vue 生命周期的八个阶段,以及可以应用在之后的开发中,针对不同的阶段的钩子采取不同的操作,更好的实现我们的业务代码,处理更加复杂的业务逻辑. 而在这一 ...
- Hibernate 系列教程2-创建maven工程
第1步:通过eclipse新建1个java maven项目. 选择file–>new–>other–>MAVEN PROJECT选项 第2步:New Maven project 选择 ...
- IDEA 初建Spring项目(Hello Spring)
新建项目 在文件夹中建立一个项目文件 打开项目 打开IDEA,点击Open,根据所建项目路径找到该项目 依赖注入 点击项目名右键,点击new,点击file,创建pom.xml 内容为: <pro ...
- springMVC整理01--搭建普通的工程
1. Spring MVC 简介Spring MVC 是 Spring 基于 MVC 设计理念提供的一个表现层的 Web 框架.是目前主流的MVC 框架之一.Spring MVC 通过一套 MVC 注 ...
随机推荐
- 合并 ios 静态库
合并 cordovaLib库: lipo -create 'Release-iphoneos/libCordova.a' "Release-iphonesimulator/libCordov ...
- windows apache 配置多个服务站点
原文 方法一:多个APACHE服务 更改第一个站点的根目录: 在文件Apache2.2/conf/httpd.conf中查找 DocumentRoot 属性,将后面的路径改为你的主站点的路径, 如:D ...
- 《C语言程序设计现代方法》第1章 C语言概述
C语言的特点:C语言是一种底层语言.C语言是一种小型语言.C语言是一种包容性语言. C语言的优点:高效.可移植.功能强大.灵活.标准库.与UNIX系统集成. C语言的缺点:C程序更容易隐藏错误.C程序 ...
- MySQL 数据库 引擎
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引 擎:ISAM.MYISAM和HEAP.另外两种类型I ...
- [CODEVS1014]装箱问题
题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...
- 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
这一章在第19页,写的好深奥,我竟然没看明白在说什么--之后再看了几遍,终于明白了. 原文: C程序员的巧计有时候却成为c++程序员的陷阱.例如把单一元素的数组放在一个struct的末尾,于是每个st ...
- phonegap与微信开放平台接口整合
在开发phonegap应用的过程中有个需求需要将应用的消息推送到微信上.于是我自己写了一个微信的phonegap插件,并成功整合进了应用. 插件地址:https://github.com/ajccom ...
- 5 个在 Linux 中管理文件类型和系统时间的有用命令
对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...
- date 、cal、bc
date cal date是显示日期与时间 date +%Y/%M/%D date +%Y/%m/%d date +%H:%M cal cal 2016
- 什么时候使用Shell
因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化.因此,Shell脚本只要“用心写”一次,即可应用到很多系统上.因此,之所以要使用Shell脚本是基于: 简单性:Shel ...