日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

**网页静态化解决方案_Freemarker*

發(fā)布時間:2023/12/31 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 **网页静态化解决方案_Freemarker* 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

課程目標

1. 掌握Freemarker常用的指令與內(nèi)建函數(shù) 2. 完成商品詳細頁的數(shù)據(jù)顯示 3. 完成商品詳細頁的動態(tài)效果 4. 完成商品詳細頁讀取SKU信息的業(yè)務邏輯 5. 完成商品審核調(diào)用功能

前述

1. 使用范圍:* 網(wǎng)頁靜態(tài)化解決方案在實際開發(fā)中運用比較多,比如新聞網(wǎng)站,門戶網(wǎng)站中的新聞頻道或者是文章類的頻道;2. 原理:* 把數(shù)據(jù)庫中的文件事先提取出來,通過文件io的寫入,在服務器上生成這樣一個文件,用戶在訪問的時候直接訪問這個靜態(tài)網(wǎng)頁;用戶訪問的時候直接訪問網(wǎng)頁,而不用訪問數(shù)據(jù)庫了;* 什么是Freemarker?- Freemarker是一個用于java語言編寫的模板引擎,它基于模板來生成文本輸出。FreeMarker與Web容器無關(guān),即在Web運行時,它并不知道Servlet或HTPP。它不僅僅用用表現(xiàn)層的實現(xiàn)技術(shù),而且還可以用于生成XML,JSP或Java等。3. 優(yōu)點:1. 適用性廣: * 不單單是新聞欄目等,電商網(wǎng)站的商品詳細頁也有大量的信息,同樣可以用網(wǎng)頁靜態(tài)化來解決;2. 減輕數(shù)據(jù)庫壓力:* 用戶直接訪問文件而不用訪問數(shù)據(jù)庫;3. 利于SEO: * 容易提高排名4. 適合大規(guī)模且變化不頻繁:* 緩存只能小規(guī)模的數(shù)據(jù),網(wǎng)頁靜態(tài)化能存儲大規(guī)模的數(shù)據(jù)5. 純靜態(tài)化可用Niginx:'* Nginx可以承載5萬并發(fā),而tomcat只有幾百;所以tomcat高并發(fā)還得需要集群;4. 創(chuàng)建模板文件* 四元素:1. 文本, 直接輸出的部分2. 注釋, 即<#-- ... --> 格式不會輸出3. 插值(interpolation):即${...} 部分,將使用數(shù)據(jù)模型中的部分替代輸出4. FTL指令:FreeMarker指令,和HTML標記類似,名字前加# 予以區(qū)分,不會輸出;

FTL指令:

1. assign指令: -->達到在創(chuàng)建模板頁面中的map集合put值的效果,指令是在模板中;1. 定義簡單類型:<#assign linkman="周先生">聯(lián)系人:${linkman}2. 定義對象類型:<#assign info={"mobile":"13301231231",'address':'北京市昌平區(qū)王府街'}>電話:${info.mobile} 地址:${info.address}2. include指令: 包含其他的模板,用于模板文件的嵌套,可以復用;比如常見的頭部尾部是復用的;1. 創(chuàng)建模板文件:head.ftl:<h1>黑馬信息網(wǎng)</h1>2. 在模板文件中使用include指令引入模板<#include "head.ftl">3. if指令:1. 在模板文件body中: <#-- if 指令--><#if success=true>您已通過實名認證<#else>您未通過審核</#if>2. 在demo運行程序中:map.put("success",false);3. 分析: * 先給出條件,條件可以為if,else兩種也可以只if,然后再demo程序中必須給success一個布爾值,否則程序運行報錯;* 模板中的等號可以使用"=" 也可以使用"=="進行判斷,意義一樣;4.list指令1. 作用:可以將list中的值進行遍歷輸出2. 實現(xiàn)步驟:1. demo運行程序://list集合給值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);2. 模板表 <#list goodsList as goods>${goods_index+1} 商品名稱:${goods.name}商品價格:${goods.price}<br/></#list>3. 分析:1. 通過先給值,然后里面進行遍歷輸出;2. ${goods_index} 可以打印出索引號;如果需要順序排列+1即可;

內(nèi)建函數(shù):

5.1. 獲取集合大小:1. 格式:變量+?+函數(shù)名稱2. 代碼演示:1. 顯示集合記錄:<#-- 內(nèi)建函數(shù)-->一共${goodsList?size} 條記錄5.2. 轉(zhuǎn)換JSON字符串為對象:1. 代碼<#assign text="{'bank':'工商銀行','account':'10101920201920212'}" /><#assign data=text?eval />開戶行:${data.bank} 賬號:${data.account} 2. ?eval進行轉(zhuǎn)換,如果是數(shù)組也可以進行轉(zhuǎn)換;5.3. 日期格式化:1. 代碼中對變量賦值:map.put("today", new Date());2.在模板文件中加入當前日期:${today?date} <br>當前時間:${today?time} <br>當前日期+時間:${today?datetime} <br>日期格式化: ${today?string("yyyy 年 MM 月 dd 日 hh:mm:ss")}5.4. 數(shù)字轉(zhuǎn)換為字符串1. 代碼中對變量賦值:map.put("point", 102920122);2. 修改模板:累計積分:${point}3. 我們會發(fā)現(xiàn)數(shù)字會以每三位一個分隔符顯示,有些時候我們不需要這個分隔符,就需要將數(shù)字轉(zhuǎn)為字符串,使用內(nèi)建函數(shù)c:累計積分:${point?c}5.5. 空值運算符 " ?? "1. 現(xiàn)象:如果你在模板中使用了變量但是在代碼中沒有對變量賦值,那么運行生成時會拋出異常。但是有些時候,有的變量確實是 null,怎么解決這個問題呢?2. 判斷某變量是否存在: " ?? "1. 解析:用法為:variable??,如果該變量存在,返回 true,否則返回 false2. 示例:<#if aaa??>aaa 變量存在<#else>aaa 變量不存在</#if>5.6. 缺失變量默認值: " ! "1. 現(xiàn)象:我們除了可以判斷是否為空值,額也可以使用!對null值做轉(zhuǎn)換處理2. 在模板加入:${aaa!'bbb沒有被賦值'}3. 分析: 這個比上面的?判斷更為簡單,不需要if語句,這里!后的'' 也可以使用"";

運算符

1. 算數(shù)運算符:FreeMarker 表達式中完全支持算術(shù)運算,FreeMarker 支持的算術(shù)運算符包括:+, - , * , / , % 2. 邏輯運算符:邏輯運算符有如下幾個: <#if aaa=true && bbb=false> </#if>邏輯與:&&邏輯或:||邏輯非:!邏輯運算符只能作用于布爾值,否則將產(chǎn)生錯誤 3. 比較運算符:表達式中支持的比較運算符有如下幾個:1 =或者==:判斷兩個值是否相等.2 !=:判斷兩個值是否不等.3 >或者 gt:判斷左邊值是否大于右邊值 <#if (aaa=>1) >4 >=或者 gte:判斷左邊值是否大于等于右邊值5 <或者 lt:判斷左邊值是否小于右邊值6 <=或者 lte:判斷左邊值是否小于等于右邊值A(chǔ)=1;A!=”1” 字符串不能使用大于 大于等于 小于 小于等于1. 舉例:<#--3. 運算符舉例--><#if (100>10)>100肯定比10大啊</#if> <br/>2. 分析:* if里面的判斷語句必須用括號引起來,如果不引起來的話大于小于使用gt,或者gte* 因為如果不引起來,使用">"號作為大于,容易與前面的<if 標簽進行融合,程序運行錯誤;

Demo小程序 – 前面代碼完整版總結(jié):

1. pom.xml:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itcast.demo</groupId><artifactId>freemarkerDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version></dependency></dependencies></project> 2. src/main/java/cn/itcast/demo/Test.java:package cn.itcast.demo;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.*;public class Test {public static void main(String[] args) throws IOException, TemplateException {//創(chuàng)建一個配置對象,獲取該對象的版本Configuration configuration=new Configuration(Configuration.getVersion());//獲取模板所在目錄configuration.setDirectoryForTemplateLoading(new File("D:\\freemarkerDemo\\src\\main\\resources"));//設置編碼集configuration.setDefaultEncoding("utf-8");//獲取模板對象Template template=configuration.getTemplate("test.ftl");//給值Map map=new HashMap();map.put("name","張三豐");map.put("message","歡迎來到神奇的Freemarker世界!");//if指令默認給值map.put("success",false);//list集合給值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);//給日期格式化賦值map.put("today",new Date());//數(shù)字轉(zhuǎn)為字符串給值map.put("point",135465);//輸出對象Writer out=new FileWriter("D:\\freemarkerDemo\\src\\main\\java\\cn\\itcast\\demo\\test.html");//輸出template.process(map,out);//關(guān)閉out.close();}}3. src/main/java/cn/itcast/demo/test.html:* 這個是輸出的文件,運行后即可得到此文件,內(nèi)容略;4. src/main/resources/head.ftl:<h1>黑馬信息網(wǎng)</h1>5. src/main/resources/test.ftl:<html><head><title>demo</title><meta charset="utf-8"></head><#-- freemarker注釋:我是一個注釋,不會輸出--><!-- html注釋 我會輸出--><body><#--FTL指令--><#--FTL指令 1. include指令--><#include "head.ftl"><#-- 插值 -->${name},你好。${message}<br/><#--FTL指令2. assign指令--><#assign linkman="周先生">${linkman} <br/><#--FTL指令 3. if 指令--><#if success=true>您已通過實名認證<#else>您未通過審核</#if><br/><#--FTL指令 4. list指令 -->-----商品列表--------<br/><#list goodsList as goods>${goods_index+1} 商品名稱:${goods.name}商品價格:${goods.price}<br/></#list><#-- 內(nèi)建函數(shù)--><#--內(nèi)建函數(shù) 1.獲取集合長度 -->一共${goodsList?size} 條記錄 <br/><#--內(nèi)建函數(shù) 2.將JSON字符串轉(zhuǎn)換為對象--><#assign text="{'bank':'招商銀行','account':'546135615464'}"><#assign data=text?eval>開戶行:${data.bank} 卡號:${data.account} <br/><#--內(nèi)建函數(shù) 3.日期格式化-->當前日期:${today?date} <br/>當前時間:${today?time} <br/>當前日期+時間: ${today?datetime} <br/>自定義日期:${today?string("yyyy年MM月dd日 HH:mm:ss")} <br/><#--內(nèi)建函數(shù) 4. 數(shù)字轉(zhuǎn)為字符串--><#--顯示普通數(shù)字-->累計積分:${point} <br/><#--顯示字符串數(shù)字-->累計積分:${point?c}<#--運算符--><#--1.空值運算符--><#if aaa??>aaa存在: ${aaa}<#else >aaa不存在</#if><#-- 2. 缺少變量默認值: !-->${bbb!"bbb不存在"} <br/><#--3. 運算符舉例--><#if (100>10)>100肯定比10大啊</#if> <br/></body></html>

實戰(zhàn)總結(jié):

1. 工作中使用網(wǎng)頁靜態(tài)化解決方案:1. 環(huán)境搭建:1. 導入依賴:pom.xml:<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>2. 引入spring提供的支持:resources/spring/applicationContext-service.xml: <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><property name="templateLoaderPage" value="/WEB-INF/ftl/"/><property name="defaultEncoding" value="UTF-8"/></bean> 3. 最好還應該路徑動態(tài)化,不要寫死: resources/properties/page.properties: [程序不一定在windows系統(tǒng)中運行,Linux等沒有D盤C盤,所以應該將地址提取出來]pagedir=d:\\Item\\2. 實戰(zhàn)要點:* 在調(diào)用數(shù)據(jù)庫中的數(shù)據(jù)的時候,首先創(chuàng)建一個interface,再創(chuàng)建一個impl實現(xiàn)類實現(xiàn)它的獲取方法;* 在獲取方法中 代碼示例:@Servicepublic class ItemPageServiceImpl implements ItemPageService {//注入配置對象@Autowiredprivate FreeMarkerConfigurer freeMarkerConfigurer;//注入虛擬路徑@Value("${pageidr}")private String pagedir;//注入商品數(shù)據(jù)訪問層@Autowiredprivate TbGoodsMapper goodsMapper;//注入商品詳細頁訪問層@Autowiredprivate TbGoodsDescMapper goodsDescMapper;@Overridepublic boolean genItemHtml(Long goodsId) {//獲得配置對象Configuration configuration=freeMarkerConfigurer.getConfiguration();try {//獲得模板Template template=configuration.getTemplate("item.ftl");//設置字符集configuration.setDefaultEncoding("UTF-8");//設置數(shù)據(jù)模型Map dataModel=new HashMap<>();//注入主表數(shù)據(jù)TbGoods goods=goodsMapper.selectByPrimaryKey(goodsId);dataModel.put("goods",goods);//注入商品擴展表數(shù)據(jù)TbGoodsDesc goodsDesc=goodsDescMapper.selectByPrimaryKey(goodsId);dataModel.put("goodsDesc",goodsDesc);//設置生成目錄Writer out=new FileWriter(pagedir+goodsId+".html");//輸出template.process(dataModel,out); //輸出out.close();return true;} catch (Exception e) {e.printStackTrace();return false;}}}* 我們創(chuàng)建模板的時候,應該將頁面的頭部和底部給提取出來,創(chuàng)建一個新的ftl文件,然后使用<#include>標簽進行調(diào)用; * 在展示數(shù)據(jù)的時候,需要從數(shù)據(jù)庫中拿數(shù)據(jù),但是數(shù)據(jù)庫中的數(shù)據(jù)是JSON格式的,我們需要使用?eval 進行數(shù)據(jù)轉(zhuǎn)換,轉(zhuǎn)換成對象即可調(diào)用了;* 在展示大量數(shù)據(jù)需要用到遍歷集合的時候,可以使用 <#list> 方法進行遍歷使用 ${..} 方法展示數(shù)據(jù),使用<#if 變量??> 判斷是否為空或 變量!'' 進行判斷;* 轉(zhuǎn)換為對象后的數(shù)據(jù)調(diào)用的名稱需要注意,因為是鍵值對,所以調(diào)用的時候需要參照數(shù)據(jù)庫中的key值和value值,否則無法調(diào)用;* 如果數(shù)據(jù)庫中存入的數(shù)據(jù)不是鍵值對的JSON格式,則可以直接進行遍歷輸出;* 查詢面包屑分類列表的時候,可以先查詢出該商品的id值,然后查出三級分類的各名稱,然后再在頁面中${...} 顯示即可;* 如果是選中的東西如何顯示? 可以先在controller.js中創(chuàng)建一個方法,接收前端頁面來的key值和value值;* 在工作中比如商品詳情頁面的生成,可以放在商品審核的時候完成,當商品審核通過點擊事件啟動的時候,就生成靜態(tài)頁面;

總結(jié)

以上是生活随笔為你收集整理的**网页静态化解决方案_Freemarker*的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。