初建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 注 ...
随机推荐
- 【HDU 3435】 A new Graph Game (KM|费用流)
A new Graph Game Problem Description An undirected graph is a graph in which the nodes are connected ...
- ASP.NET多用户操作相同互斥的对象
[一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3574154.html ] 现象:公有静态变量不可用于ASP.NET多用户操作,否则该变量会被多 ...
- qt 原子操作 QAtomicInt(++和--都不是原子操作:都包含三条机器指令)
++和--都不是原子操作:都包含三条机器指令 http://sroply.blog.163.com/blog/static/17092651920106117251539/
- IP 碎片重组
IP 碎片重组 内核中的IP重组函数. struct sk_buff * ip_defrag(struct sk_buff * skb, u32 user) { ...... //如果内核范围超出限制 ...
- statspack系列8
原文:http://jonathanlewis.wordpress.com/2006/12/27/analysing-statspack-8/ 作者:Jonathan Lewis 在前面的关于stat ...
- Vijos_1792_摆花_(动态规划,多重集组合数)
描述 https://vijos.org/p/1792 共n种花,第i种花有a[i]个,要摆m个,同一种花连续且花按照序号从小到大排,问共有多少种摆花方案. 描述 小明的花店新开张,为了吸引顾客, ...
- BZOJ_1002_[FJOI2007]_轮状病毒_(递推+高精)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 1002: [FJOI20 ...
- HDU 5938 Four Operations 【贪心】(2016年中国大学生程序设计竞赛(杭州))
Four Operations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- sorts
各种排序算法: #include <stdio.h> #include <string.h> #include <ctype.h> #include <std ...
- objective-c中点语法的使用
点语法的作用:提供一种访问属性的setter和getter的机制. 用法举例: 1.创建一个Person类,并声明属性.在person.h中. 2.实现一个init方法,并使用点语法等.在pers.m ...