1. 程式人生 > >MVC框架中的模型-檢視分離問題(二) —— 問題產生之所在

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>");
    問題是,用Java構建HTML不僅僅乏味而容易出錯,而且沒法讓美工做這些事。一種改進的方法是,程式設計師可以將公共的HTML元素提取出來幷包裝成Java的表現物件(Java rendering object),例如Table和BulletList。不過這樣還是不能避免servlet中包含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>
    JSP開頭也許只是包含了簡單資料呼叫的HTML檔案,就像上面的這個例子。但它們很快就退化到HTML和Java程式碼又糾纏在一起的情況了,就和當初的Servlets一樣。實際上,美工還是無法修改JSP檔案。更重要的是,JSP鼓勵拙劣的面向物件設計。比如,一個include檔案絕對不是類繼承的一個好替代。JSP檔案也不能建立子類,因此程式設計師就無法抽取出公共的程式碼和HTML。Hunter[6]還總結了一些JSP的其他問題,包括JSP針對列表顯示的粗糙的迴圈機制。
橫向擴張: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

CentOS6MySql5.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-LinuxDNS詳解

相關 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的幾種實現方式。但是,上篇文章中只介紹了服務端採用廣播模式給所有客戶