【工具类】页面静态化 --- Freemarker的使用

介绍

FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。

页面静态化

把一个动态页面(使用Ajax去服务器请求数据)给静态化保存到服务器,让用户直接请求这个静态页面
好处:用户方法某个页面的时候不用再去后台请求,也不用在去数据库请求,减少后台服务器和数据库服务器的压力

问题:

  • 什么时候生成静态页面比较合适
    • 可以对访问量比较大的一些页面,这些页面不经常发生变化,而且这些页面应该是展示数据使用的
    • 可以在程序启动完成后去缓存这个页面,然后在数据进行增删改的时候去修改缓存
  • 将静态页面生成到什么位置
    • 生成在项目存放页面的地方,上线的应该存放在tomcat容器中,Nginx本身就是一个静态资源服务器,也可以存放在Nginx服务器中
  • 应该生成几个静态页面
    • 根据项目情况,个人看着办

模板文件

模板文件中有四种元素:
1、文本,直接输出的部分
2、注释,即<#–…-->格式不会输出
3、插值(Interpolation):即${…}部分,将使用数据模型中的部分替代输出
4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出
Freemarker的模板文件后缀可以任意,一般建议为ftl。

java代码基本演示

public class FreeMarkerTest {
    public static void main(String[] args) throws Exception{
        //1.创建 Freemarker 的配置类对象
        Configuration configuration=new Configuration(Configuration.getVersion());
        //2.设置模板所在的目录
        configuration.setDirectoryForTemplateLoading(new File("E:\\ftl"));
        //3.设置字符集
        configuration.setDefaultEncoding("utf-8");
        //4.加载模板
        Template template = configuration.getTemplate("test.ftl");
        //5.创建数据模型
        Map map=new HashMap();
        map.put("name", "赵丽颖");
        map.put("message", "你好啊");
        map.put("success", false);
        
        List goodsList=new ArrayList();
        Map goods1=new HashMap();
        goods1.put("name", "苹果");
        goods1.put("price", 5.8);
        Map goods2=new HashMap();
        goods2.put("name", "香蕉");
        goods2.put("price", 2.5);
        Map goods3=new HashMap();
        goods3.put("name", "橘子");
        goods3.put("price", 3.2);
        goodsList.add(goods1);
        goodsList.add(goods2);
        goodsList.add(goods3);
        map.put("goodsList", goodsList);
        //6.创建Writer对象
        Writer out =new FileWriter(new File("E:\\ftl\\test.html"));
        //7.输出
        template.process(map, out);
        //8.关闭Writer对象
        out.close();
    }
}

模板文件

<html> 
	<head>
		<meta charset="utf-8"> 
		<title>Freemarker入门</title>
	</head> 
	<body>
		<!--我只是一个注释,我不会有任何输出 --> 
		<!--
			${插值表达式} 在模板文件中使用最多的,模板想要填充数据,就必须使用${} 来进行占位
			${} 中的值 必须和模型中的Map中的Key或者Bean对象中的属性名称保持一致
			<#assign 变量名="">  是在模型中声明一个变量,声明的变量可以直接在插值表达式中使用
					如果模板中声明的变量和数据模型中声明的变量冲突了,freemrarker会使用模板中声明的这个变量
			
			书写freemarker模板文件的一些规则:
					和html  xml很像
					标签正常关闭,自闭和 围堵标签
					标签必须正常嵌套,不能出现交叉嵌套
					标签名称严格区分大小写
					<  </ 和指令之间不能加空白字符
		--> 
		${name}你好,${message} 
		<br>
		
		<#assign linkman="周先生"> 
		联系人:${linkman}
		<br>
		
		
		<!-- map 集合
			使用<#assign> 声明map集合的时候注意 , key必须带引号
		-->
		<#assign info={"mobile":"13333333333",'address':'北京市昌平区'} > 
		电话:${info.mobile} 地址:${info.address}
		
		<br>
		
		<!-- 
			include 指令可以被多层嵌套包含,但是注意不要写成死循环
		-->
		<#include "head.ftl"/>
		<br>
		
		<!-- 
			if 指令必须有闭合
			这个指令的条件可以是一个结果为Boolean类型的表达式
		
		-->
		<#if success=true> 
		你已通过实名认证 
		<#else> 
		你未通过实名认证 
		</#if>
		<br>
		<!-- 
			map
			goodsList 数据模型中的名称
			as  关键字
			goods  每次遍历出来的临时变量,任意名称
		-->
		<#list goodsList as goods> 
		商品名称: ${goods.name} 
		价格:${goods.price}
		<br> 
		</#list>
		<br>
		<br>
	</body> 
</html>

Spring框架中使用Freemarker生成静态页面

pom.xml文件导入

		<dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>

Spring配置文件中配置

	<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!--指定模板文件所在目录-->
        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
        <!--指定字符集-->
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
    <!-- 加载属性文件,文件中可以指定相关路径,可以不配置-->
    <context:property-placeholder location="classpath:freemarker.properties"/>

通用方法用于生成静态页面

	/*
	* 第一个参数,模板名称,会结合Spring配置的路径去查找模板文件
	* 第二个参数,生成的静态页面名称
	* Map:模板所需的数据
	*/
    public void generateHtml(String templateName, String htmlPageName, Map map){
        // 获得配置对象
        Configuration configuration = freeMarkerConfigurer.getConfiguration();
        Writer out = null;
        try {
        	// 加载模板
            Template template = configuration.getTemplate(templateName);
            // 构造输出流,outPutPath  变量:文件路径
            // 指定输出的静态页面放在哪里
            out = new FileWriter(new File(outPutPath + htmlPageName));
            // 输出文件
            template.process(map,out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
发布了34 篇原创文章 · 获赞 14 · 访问量 1568

猜你喜欢

转载自blog.csdn.net/Wan_Yuan/article/details/104556630