MVC框架中的模型-檢視分離問題(二) —— 問題產生之所在
模板引擎[1](template engine)是web模板系統[2](web template system)的核心部件,主要功能是將web模板[3](web templates)和內容資訊整合到一起產生web文件。示意圖如下:
圖1: web模板系統示意[1]
下面以基於Java的引擎為例說明模板引擎的歷史演變。當然涉及的概念同樣可以被應用到其他語言的引擎上,比如Perl, VisualBasic。主要內容翻譯自《Enforcing Strict Model-View Separation in Template Engines[7]》。(見藍色字型。以後若無另外說明,藍色字型
開端:Servlets[4]時代
Java開始支援伺服器端開發採用的是Servlets。它可以建立響應HTTP GET/POST命令的方法,在這些方法中可以通過print語句生成HTML。比如,下面是一個簡單servlet的核心程式碼,它可以產生一個網頁對某個URL引數傳過來的name說“hello”。
out.println("<html>");
out.println("<body>");
out.println("<h1>Servlet test</h1>");
String name = request.getParameter("name");
out.println("Hello, "+name+".");
out.println("</body>");
out.println("</html>");
巨大的進步:JSP[5]時代
下一階段的進化帶來了Java Server Pages(JSP),乍看起來是一次巨大的進步。JSP檔案本質上就是servlet,是嵌入了Java程式碼的HTML檔案。JSP會被伺服器自動轉換為servlet。剛才的那個程式碼示例用JSP表示如下:
<html>
<body>
<h1>JSP test</h1>
Hello, <%=request.getParameter("name")%>.
</body>
</html>
橫向擴張:Template時代
當JSP也不是問題的答案時,程式設計師們開始考慮模板(template)的主意。一個模板就是一個包含若干“洞(hole)”的HTML文件,這些洞裡面可以放資料或簡單操作的結果。不幸的是,幾乎每個模板引擎都重複著JSP的錯誤;它們每個都提供了一種圖靈完備的(Turing-complete)、針對特定工具的程式語言來嵌入到HTML中。就如JSP一樣,設計師們被迫去想象程式產生的行為,而不是著眼在頁面模板(page exemplar)上。
有些模板引擎修復了JSP一些比較噁心的做法,但它們大多都沒有去探尋過那個最初的原因:為什麼JSP對於大型系統來說是一場災難?一個模板應該只需要考慮如何呈現一個數據集的檢視,而完全與底下要產生這些待顯示的結果的資料計算分離。如果一種模板語言太強大,模板設計者就會承擔混淆模板與業務邏輯的風險。
從上面可以看到,“模型-檢視分離”問題一直糾纏著模板引擎的實現。為什麼這樣的混淆應該被避免?敬請下回分解。
相關推薦
一起寫框架-MVC框架-基礎功能-環境搭建(二)
utils src 編寫 con eclipse開發 aaa res text web測試 實現功能 搭建Eclipse開發環境 1.了解Eclipse工具普通項目是怎樣關聯依賴項目的 2.了解Eclipse工具WEB項目是怎樣關聯依賴項目的 實現步驟 1. 創建一個Jav
CentOS6中MySql5.6資料庫主從複製/讀寫分離(二)
程式碼層面實現讀寫分離 在文章(一)中我們已經有了兩個資料庫而且已經實現了主從資料庫同步,接下來的問題就是在我們的業務程式碼裡面實現讀寫分離,假設我們使用的是主流的ssm的框架開發的web專案,這裡面我們需要多個數據源。 在此之前,我們在專案中一般會使用一
Unity3D《一看就明白系列》之Unity3D中使用SqlLite資料庫(二)採用框架結構
主要就是增刪改查,而這些操作語句我們主要就是更改其中的引數。 因此我們需要做一個架構來實現這一目標 DB:整體 中間功能層:實現功能 邏輯層:在功能層之下實現不同的邏輯 For Example: Void Add(a,b)這是一個功能實現兩個數相加 Add(2,
分散式定時任務Elastic-Job框架在SpringBoot工程中的應用實踐(二)
文章摘要:在生產環境中部署Elastic-Job集群后,那麼如何來運維監控線上跑著的定時任務呢? 如果在生產環境的大規模伺服器叢集上部署了整合Elastic-Job的業務工程,而沒有相應的運維監控工具可以來監控定時任務執行狀態和動態修改定時任務執行時間,修改相應的配置還得手動
使用Spring+MySql實現讀寫分離(二)spring整合多數據庫
ont 依據 xml配置 實現 整合 配置 item 匹配 mic 緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大
【Java入門提高篇】Day5 Java中的回調(二)
彈出對話框 java入門 也會 color 編程 args performed show clas Java中有很多個Timer,常用的有兩個Timer類,一個java.util包下的Timer,一個是javax.swing包下的Timer,兩個Timer類都有用到回調
(二)Centos之在VM虛擬機中安裝Centos操作系統
logs tps 用戶名 權限 就是 最好 啟動 網絡 iyu 一、下載 阿裏雲鏡像 https://mirrors.aliyun.com/centos/7/isos/x86_64/ 下載那個 DVD版本即可。 二、安裝 我們選 典型 安裝 簡單
python中的數組(二)
print pre bsp 數組元素 如何 python clas 範圍 ber python如何取一定範圍的數組元素呢? 詳情看示例1--3 直接看代碼 1.分片 1 #取一定範圍的元素 2 lucky_number = [0,1,2,3,4,5,6] 3 #分片
05-Linux中DNS詳解(二)
相關 proc gen lin 四種方法 .... rate 我的網站 四種 接“04-Linux中DNS詳解(一)” 六、在Linux上測試域名解析1、先檢查DNS是否設置正確 cat /etc/resolv.conf [resolv.conf] # Generate
基於SSM框架的博客系統(二)博主登錄功能
erl 映射 import incr pac 加密 actor gets AC 一、 準備 1.數據庫 創建表db_blogger: 1 DROP TABLE IF EXISTS `t_blogger`; 2 3 CREATE TABLE `t_bl
Python中操作mysql知識(二)
python mysql 1.創建表Teacher:create table Teacher( teaId int not null, teaname varchar(100), age int, sex enum('M', 'F'), phone int);
工作過程中註意事項(二)
lin tar exe rep ice 註意 cmd 官網 linu 1.windows上開啟nginx 安裝:官網下載http://nginx.org/en/download.html 註意:下載下來後解壓存放在沒有中文的目錄下,不然啟動會報錯,啟動可雙擊exe文件,也可
在ArcGIS中建立Python工具(二)
上一篇中我們瞭解到有兩種方式在 ArcGIS 中建立 Python工具,這一篇就來看看如何在標準工具箱中建立指令碼工具。 ArcGIS Help 中指令碼工具的幫助過於枯燥,在這裡,我以一個具體的例項來總結構建指令碼工具的過程,我要實現的需求是做個快速實現羽化邊界效果的小工具,
Python影象處理庫PIL中影象格式轉換(二)
參考:https://blog.csdn.net/icamera0/article/details/50843196?utm_source=blogxgwz0 接上一篇《Python影象處理庫PIL中影象格式轉換(一)》 二、其他不同模式轉換為“RGB”模式 模式“RGB”為24位彩色影
2018 - Python 3.7 爬蟲之 利用 Scrapy 框架 獲取圖片並下載(二)
一、 通過命令構建一個爬蟲專案 二、定義 item 三、啟用 pipeline 管道 四、編寫爬蟲 Spider 五、執行爬蟲 六、結果檢視 未安裝 Scrapy 框架,見上一篇文章:框架安裝及配置 一、 通過命令構建一個爬蟲專
RxDataSources與TableView中實現介面展示(二)
通過按鈕重新整理介面引數,設定延時為2s // ViewController.swift // RxSwiftTest // // Created by travey on 2018/11/5. // Copyright © 2018年 ZhouShijie. All rights r
一篇SSM框架整合友好的文章(二)
上一篇講述了DAO 層,mybatis實現資料庫的連線,DAO層介面設計,以及mybtis和spring的整合。DAO層採用介面設計方式實現,介面和SQL實現的分離,方便維護。DAO層所負責的僅僅是介面的設計和實現,而負責的邏輯即一個或多個DAO層介面的拼接是在Sevice層中完成。這篇文章接上篇文章,
安卓專案實戰之強大的網路請求框架okGo使用詳解(二):深入理解Callback之自定義JsonCallback
前言 JSON是一種取代XML的資料結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網路傳輸資料將減少更多流量從而加快了傳輸速度,目前客戶端伺服器返回的資料大多都是基於這種格式的,相應的我們瞭解的關於json的解析工具主要有兩個:Gson(Google官方出的)和fas
系統中日誌的管理(二)
1.日誌的遠端同步 (1)日誌的傳送方:輸入命令,更改檔案配置,將指定的日誌傳送給接收方,其中有兩種協議傳送,一種為upd,另一種為tep協議,兩種協議傳送方式不同,更改時要注意 vim /etc/rsyslog.conf *.*
Spring Boot中使用WebSocket總結(二):向指定使用者傳送WebSocket訊息並處理對方不線上的情況
Spring Boot中使用WebSocket總結(二):向指定使用者傳送WebSocket訊息並處理對方不線上的情況 在上一篇文章(www.zifangsky.cn/1355.html)中我介紹了在Spring專案中使用WebSocket的幾種實現方式。但是,上篇文章中只介紹了服務端採用廣播模式給所有客戶