07 Freemarker.txt

UP 返回
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。
另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。

1. 练习demo
  创建maven项目 D:\ProjectCodes\eclipse_pyg\freemarkerDemo
  引入依赖 
	<dependency>
		<groupId>org.freemarker</groupId>
		<artifactId>freemarker</artifactId>
		<version>2.3.23</version>
	</dependency>
  在资源目录中创建文件 test.ftl
	<html>
	<head>
		<meta charset="utf-8">
		<title>Freemarker入门小DEMO </title>
	</head>
	<body>
	<#--我只是一个注释,我不会有任何输出  -->
	${name},你好。${message}
	</body>
	</html>
  创建类 Test.java
	public class Test {
		public static void main(String[] args) throws IOException, TemplateException {
			// 1.创建一个配置对象
			Configuration configuration = new Configuration(Configuration.getVersion());
			// 2.设置模板所在的目录
			configuration.setDirectoryForTemplateLoading(
					new File("D:\\ProjectCodes\\eclipse_pyg\\freemarkerDemo\\src\\main\\resources"));
			// 3.设置字符集
			configuration.setDefaultEncoding("utf-8");
			// 4.获取模板对象
			Template template = configuration.getTemplate("test.ftl");
			// 5.创建数据模型(可以是对象 也可以是)
			Map map = new HashMap();
			map.put("name", "张三");
			map.put("message", "欢迎来到神奇的品优购世界!");
	
			// 6.创建一个输出流对象
			Writer out = new FileWriter("D:\\TestFolder\\test.html");
			// 7.输出
			template.process(map, out);
			// 8.关闭out
			out.close();
		}
	}
  执行main方法,可以看到生成了html文件

2. FTL指令和函数
  2.1 assign	用于在页面上定义一个变量 
	(1)定义简单类型:
		<#assign linkman="周先生">
		联系人:${linkman}
	(2)定义对象类型:
		<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
		电话:${info.mobile}  地址:${info.address}
  2.2 include	用于模板文件的嵌套
	创建模板文件head.ftl
		<h1>黑马信息网</h1>
	修改test.ftl,在模板文件中使用include指令引入刚才我们建立的模板
	<#include "head.ftl">
  2.3 if  判断,,判断可以用=也可以用==
		<#if success=true>
	  		你已通过实名认证
		<#else>  
	  		你未通过实名认证
		</#if>
	在代码中对str变量赋值
		map.put("success", true);
  2.4 list 列表。在代码中创建goodsList并赋值,就可以在模板中遍历
		----商品价格表----<br>
		<#list goodsList as goods>
		  ${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br>
		</#list>

		goods_index+1 使用循环变量+_index就可以在循环中得到索引
  2.5 内建函数		: 变量+?+函数名称  
	1)得到集合大小	?size
		共  ${goodsList?size}  条记录
	2)转换JSON字符串为对象   ?eval
		<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
		<#assign data=text?eval />
		开户行:${data.bank}  账号:${data.account}

	3)日期格式化		在java代码中塞入的对象是date类型
		当前日期:${today?date} <br>
		当前时间:${today?time} <br>   
		当前日期+时间:${today?datetime} <br>        
		日期格式化:  ${today?string("yyyy年MM月")}
	  显示效果为:
		2017-5-24	获取日期
		17:58:41	获取时间
		2017-5-24 17:58:41	获取日期和时间
		2017年05月	自定义格式
	4)数字转换为字符串 		对应java代码塞入的对象是int数字
			累计积分:${point}
		显示效果为102,920,155,数字会以每三位一个分隔符显示,有些时候我们不需要这个分隔符,就需要将数字转换为字符串,使用内建函数c
			累计积分:${point?c}
	5)空值处理	如果模板中的变量没有在代码中赋值,生成时就会抛异常。此时需要处理空值
		可以用??来做判断,存在返回true
			<#if aaa??>
			  aaa变量存在
			<#else>
			  aaa变量不存在
			</#if>
		也可以用缺失变量默认值:“!”,没有给定值时默认使用后面的值
			${aaa!'-'}
	2.6 运算符	支持+, - , * , / , %,&&,||,!
		 =或者==:判断两个值是否相等. 
		 !=:判断两个值是否不等. 
		 >或者gt:判断左边值是否大于右边值 
		 >=或者gte:判断左边值是否大于等于右边值 
		 <或者lt:判断左边值是否小于右边值 
		 <=或者lte:判断左边值是否小于等于右边值 
	 =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,
	而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,
	大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)> 

3. 创建模块pinyougou-page-interface,打包jar
    创建模块pinyougou-page-service,打包war,参照contentservice的pom,修改端口9005及interface的依赖,同时添加freemarker的依赖。复制资源下的配置文件,修改applicationContext-service.xml的端口,同时添加:
	<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>
    配置好一些freemarker的参数,同时为了动态改变HTML生成的位置,添加一个属性文件page.properties
	
    将item.html拷贝至web-inf/ftl下 ,修改扩展名为ftl ,将商品名称用插值代替。在D盘建立文件夹item,将必要的样式表和Js拷贝到此目录下,此目录为生成的目录
    pinyougou-manager-web引入依赖pinyougou-page-interface,GoodsController中添加测试方法
    将item.html头部分拆分到head.ftl ,将尾部拆分到foot.ftl ,用include指令在item.ftl中引入 。
    在生成html的文件夹中引入angular和base.js,修改item模板,这里面会涉及到购物车 规格选中效果 用户选中判断等方法,参考代码
	D:\ProjectCodes\eclipse_pyg\pinyougou-parent\pinyougou-page-service\src\main\java\com\pinyougou\page\service\impl\ItemPageServiceImpl.java
	D:\ProjectCodes\eclipse_pyg\pinyougou-parent\pinyougou-page-service\src\main\webapp\WEB-INF\ftl
	D:\ProjectCodes\eclipse_pyg\pinyougou-parent\pinyougou-manager-web\src\main\java\com\pinyougou\manager\controller\GoodsController.java
	
    对生成的文件夹单独创建一个模块pinyougou-page-web,转移文件进来,用于以后使用
	D:\ProjectCodes\eclipse_pyg\pinyougou-parent\pinyougou-pag-web\src\main\webapp\js\controller\itemController.js

















DOWN 返回