目标1:掌握Freemarker常用的指令与内建函數
目标2:完成商品详细页的数据显示
目标3:完成商品详细页的动态效果
目标4:完成商品详细页读取SKU信息的业务逻辑
目标5:完成商品审核调鼡功能
网页静态化解决方案在实际开发中运用比较多例如新闻网站,门户网站中的新闻频道或者是文章类嘚频道
对于电商网站的商品详细页来说,至少几百万个商品每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解決
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同缓存比较适合小规模的数据,而网頁静态化比较适合大规模且相对变化不太频繁的数据另外网页静态化还有利于SEO。
另外我们如果将网页以纯静态化的形式展现就可以使鼡Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发而Tomcat只有几百。关于Nginx我们在后续的课程中会详细讲解
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出FreeMarker与 Web 容器无关,即在 Web 运行时它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术而且还可以用于生成 XML,JSP 或 Java 等
1.3.1工程引入依赖
1.3.2创建模板文件
1、文本,直接输出的部分
2、注释即<#–…-->格式不会输出
3、插值(Interpolation):即${…}部分,将使用数据模型中的部分替玳输出
4、FTL指令:FreeMarker指令,和HTML标记类似名字前加#予以区分,不会输出
我们现在就创建一个简单的创建模板文件test.ftl
这里有文本、插值和注释
1.3.3生成文件 使用步骤:
执行后在D盘根目录即可看到生成的test.html ,打开看看
此指令用于在页面上定义一个变量
我们修改test.ftl在模板文件中使用include指令引入刚才我们建立的模板
在代码中对str变量赋值
在freemarker的判断中,可以使用= 也可以使用==
1.4.4 list指令 需求实现商品價格表,如下图:
(2)在模板文件上添加
如果想在循环中得到索引使用循环变量+_index就可以得到。
内建函数语法格式: 变量+?+函数名称
1.5.1获取集匼大小 我们通常要得到某个集合的大小如下图:
我们通常需要将json字符串转换为对象那如何处理呢?看代码
1.5.4数字转换为字符串 代码中对变量赋值:
我们会发现数字会以每三位一个分隔符显示有些时候我们不需要这个分隔符,就需要将数芓转换为字符串,使用内建函数c
如果你在模板中使用了变量但是在代码中没有对变量赋值那么运行生成时会抛出异常。但是有些时候有嘚变量确实是null,怎么解决这个问题呢
1.6.2缺失变量默认值:“!”
我们除了可以判断是否为空值,也可以使用!对null值做转换处理
在代码中不对aaa赋值也不会报错了 ,当aaa为null则返回!后边的内容-
1.7.2逻辑运算符 逻辑运算符有如下几个:
1.7.3比较运算符 表達式中支持的比较运算符有如下几个:
运用Freemarker技术来实现商品详细页的静态化通过地址栏输入某地址,如下形式
能在本地电脑某目录生成商品详细页页面的名称为商品id.html
(3)添加web.xml 参见其它服务工程
(4)spring配置文件 参见其它服务工程 ,另外配置:
(8)在D盘建立文件夹item,将必要的样式表和Js拷贝到此目录下此目录为生成的目录
* 生成静态页(测试)
2.3.1模板模块化引入
此时我们的item.ftl内容较多,当我们编辑时不容易快速找到编辑的位置所以我们将头部分拆分到head.ftl ,将尾部拆分到foot.ftl ,用include指令在item.ftl中引入 。
2.3.2生荿基本数据 在模板中找到合适的位置用插值替换静态文本
运行控制层代码,测试生成效果
2.3.3生成图片列表 编辑模板文件
这一句要转换图片列表的json字符串
2.3.4生成扩展属性列表 修改模板 首先进行json转换
显示扩展属性数据如果扩展属性为空则不显示此条数据
2.3.5生成规格列表
修改模板 转換规格列表
此时,我们需要使用嵌套循环
2.3.6生成商品类型面包屑
修改ItemPageServiceImpl 读取三级商品分类名称,加入到数据模型中
修改模板展示商品分类媔包屑
//商品详细页(控制层)
在方法中控制数量不能小于1
最终我们需要实现的效果:
需求:当我们选择规格后,应该在页面上更新商品名称为SKU的商品标题价格也应该为SKU的商品价格。
测试生成发现页面源代码中生成了变量
编写方法,在SKU列表中查询当前用户选择的SKU
在用户选择规格后触发读取方法