初建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 注 ...
随机推荐
- UNIX网络编程——套接字选项
http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt( ...
- POP3、SMTP、IMAP和Exchange的区别在哪里?
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:永遇乐链接:http://www.zhihu.com/question/24605584/answer/29039357来源: ...
- go网络编程示例,客户端,服务器端
http://blog.csdn.net/wangningyu/article/details/22859245 http://blog.csdn.net/wangningyu/article/det ...
- linux 下 poll 编程
poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...
- Java 编程下 Eclipse 如何设置单行代码显示的最大宽度
Eclipse 下一行代码的默认宽度是 80 , 稍长一点的一行代码就会自动换行,代码可读性较差,我们可以自己在 Eclipse 对代码宽度进行设置. 设置路径为:[Window]→[Preferen ...
- Xcode5下去除Icon高光
1:Images.xcassets中, 选中图片, 查看属性. 在“iOS icon is pre-rendered” 打勾 2:Info.plist中修改 (1):添加 Icon already i ...
- Binomial Showdown
Binomial Showdown TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 2323 Accepted: 572 D ...
- [comparator] 策略模式
我们知道策略模式,首先是各种策略可以替换,其实我们常见的Arrays.sort();中可以指定比较器,实现comparator接口的比较器,作为对象传入,这不就是策略模式吗,好理解吧
- JavaScript高级程序设计57.pdf
表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...
- 【oracle】初学jobs
含义:job是oracle的一种对象,可以理解为定时执行的程序 目的:定时自动执行特定代码 照猫画虎--创建job 1.创建测试表JOB_TEST create table JOB_TEST(a da ...