CMS系統模版引擎設計(2) 頁面生產流程

2021-05-26 10:15:49 字數 1421 閱讀 8779

上節我們介紹了下基本的幾個類。下面我們來講下本cms系統的執行機制。

乙個url請求過來,我們的cms系統就要對url進行分析,知道其domain屬於哪個site,url符合哪個page的訪問規則,然後再把page的template裡的label進行行替換。

如何攔截url請求呢? 那就是httpmodule。

自定義乙個cmshttpmodule:ihttpmodule,在config裡增加httpmodule的配置即可。

我畫了一張圖,先看一下生產流程。

步驟如下:

獲取匹配當前domain的site,如果匹配不到,說明資料庫中不存在這個site。那就只能輸出空資訊了。

【注意】如果你想讓你的url訪問沒有字尾,那必須新增「萬用字元對映」,並且不能「檢查檔案是否存在」,什麼是萬用字元?即使所有的url格式,不管是什麼後最,有沒有字尾,都會走asp.net的 isapi篩選器。也就是都會走我們定義的httpmodule,包括頁面內的、js等靜態資源。所以我們必須過濾掉不想處理的字尾,這些字尾可以是針對每個site配置,也可以針對全域性配置,所以我們還需要給site類增加乙個config屬性,並且定義乙個config類。

public class config

setif (_configs.containskey(key))

_configs[key] = value;

else

_configs.add(key, value);}}

}

site獲取configvalue的邏輯是先從自己的config獲取,如果沒有再去global的config獲取。為什麼需要config呢?因為不同的站點可能需要自定義一些變數到前台使用。

好了,過濾說完了,就該獲取page了。

根據url拿page例項,page也需要用hashtable來快取,因為這個獲取例項的請求實在是太大了,複雜度也要降到o(1)。

如果page是null,說明資料庫不存在這個page,所以要跳出httpmodule,讓iis接手繼續處理。

如果存在,則需要判斷page是否快取,我們這裡快取其實就是生成靜態頁,如果快取了,則根據url生成靜態頁檔名,再去查詢是否存在這個檔案,如果存在還要判斷檔案的建立時間是否過期。如果過期了,我們就得重新寫入乙個新檔案,通過返回舊檔案,等新檔案建立成功後覆蓋掉舊檔案(讀寫分離)。

如果不是快取,則獲取page.template.content,然後迴圈labels,對content進行替換。

var html 

=page.template.content;

foreach

(var label 

inpage.labels)

最後輸出被替換掉標籤的html,則頁面生產完成。

我講的都是粗略的框架,開發過程中會出現很多細節性的東西,我就不提了,只提一些比較重要的。下節我們該講如何設計label了! 

WebAPI引擎生成系統的設計

web ria應用的乙個基本特點是,前端和後端要分離,前端只做介面操作和呼叫webapi,後端只提供http webapi呼叫。後端不依賴於前端的實現,基於http協議,隨便用乙個瀏覽器在位址列敲一下都能進行webapi的呼叫。前端要依賴於webapi的定義。現在都在炒作 雲計算 雲 要成功開花結果...

WebAPI引擎生成系統的設計

web ria應用的乙個基本特點是,前端和後端要分離,前端只做介面操作和呼叫webapi,後端只提供http webapi呼叫。後端不依賴於前端的實現,基於http協議,隨便用乙個瀏覽器在位址列敲一下都能進行webapi的呼叫。前端要依賴於webapi的定義。現在都在炒作 雲計算 雲 要成功開花結果...

秒殺商城系統 商品列表頁的設計 (十)

假設商品和秒殺商品都在一張表中,秒殺活動經常以不同的形式展開,資料庫欄位也要經常改啊,那和資料庫有關的老 是不是也要一起改,當資料庫不斷修改,後期維護也比較困難。xmlns th charset utf 8 商品詳情title head class panel panel default class...