用 Hasor 谈一谈MVC设计模式
為什么80%的碼農都做不了架構師?>>> ??
????MVC 是一個老生常談的東西早已不是什么稀罕物件,不過在這里還是扒一扒到底都有多少種 MVC。
一、經典 MVC
????先說最經典的 MVC,一個請求控制器的請求,負責讀取數據,然后將數據派發到試圖上。如圖:
????在經典?MVC 中,可以看到我們請求的頁面并不是真正的頁面,而是一個控制器。具體顯示的頁面由這個控制器來決定,大名頂頂的?struts 框架就是這樣一種模式。然而,通常為了記憶方便,基于這種經典模式的 MVC 我們通常是把 Controller 的名字起的和 View 一樣。
? ? 這種模式下,Controller 的職責主要有兩個:1、確定顯示的最終頁面。2、執行頁面邏輯準備相關數據。
????在 View 中使用的數據是來自?Controller 給予的。
????例如“判斷當前用戶是否登錄,如果登錄則展現用戶詳細信息,如果未登錄則展現登錄界面”。這種場景比較適合這種模式。
?
二、視圖前置 MVC
? ? 這是 MVC 的一個變版,在這種模式中 View 的地位被提升到 Controller 之前。也就是說請求是先得到了要顯示的頁面,而頁面中的數據的獲取邏輯被后置的?Controller 提供。
????這種模式下,Controller 的職責變得只有一個,那就是:執行頁面邏輯準備相關數據。視圖前置這種模式在職責上更加清晰,但是它失去了對頁面展現的控制。
? ? 通常在某個數據集中展現的地方會有這種模式的身影,例如:List 頁面,在List 頁面通常伴隨著查詢、分頁。這種頁面中頁面本身一般是不會有太大的變化,更多的是后臺的數據提取邏輯。
????其實這種 MVC 我們也并不陌生,jsp + bean 就是這樣一種形式。
?
三、視圖前置 MVC?變版
? ? 這是 視圖前置 MVC 的一個變版,它的工作模式沒有太大的變化。不同的是 View 被進一步前置到 瀏覽器中,通過 javascript 通過 ajax 的方式訪問?Controller。
? ? 這種模式下,一般有兩類工程師共同開發一個應用程序,他們是:前段工程師、后段工程師。
? ? 這種模式的優點在于,前后端開發工程師,只需要協議數據交換格式。即可開始各自的開發工作。也是最常見的一種模式。這也是前后端分離的一種體現。
?
四、使用 Hasor 實現三種 MVC 模式的開發
-Controller
? ? 我們先以 Controller?為例子進行說明,下面是使用?Hasor 開發的?Controller。
@MappingTo("/index.htm") public class Index {public void execute(RenderData data) {data.put("data", new UserData());} }? ? 在例子中,我們簡單的把 UserData 這個數據寫入到 RenderData 對象中。最后在頁面渲染的時候再把這個對象拿出來。
????當然您也可以像這樣,直接把對象塞到 Request 中。
data.getHttpRequest().setAttribute("data", new UserData());? ? 或者干脆更直接一點
@MappingTo("/index.htm") public class Index {public void execute(HttpServletRequest request) {request.setAttribute("data", new UserData());} }? ? 除了前面三種方式之外,Haosr 還學習優秀的 JFinal 框架。您可以繼承一個類,通過繼承類的各種工具方法來實現數據的設置,例如:
@MappingTo("/index.htm") public class Index extends WebController {public void execute() {this.putData("data", new UserData());// orthis.setAttr("data", new UserData());} }? ? 具體想用哪種方式,你喜歡就好。
-實踐:經典MVC設計模式
? ? 我們可以通過這種方式實現 經典MVC模式。如下:
@MappingTo("/index.htm") public class Index extends WebController {public void execute() throws ServletException, IOException {// 方式 1this.setAttr("data", new UserData());getRequest().getRequestDispatcher("/userinfo.htm").forward(getRequest(),getResponse());// 方式 2this.setAttr("data", new UserData());getResponse().sendRedirect("/userinfo.htm");// 方式 3this.setAttr("data", new UserData());renderTo("/userInfo.htm");} }你也可以這樣:
@MappingTo("/index.htm") public class Index {public void execute(RenderData data) {data.put("data", new UserData());data.viewName("/userInfo.htm");} }-實踐:視圖前置 MVC
????前面提到過,前置 mvc 就是一種 jsp + bean 的模式。那么索性就 “JSP + Bean”把。先看負責獲取數據的 ManagerBean,為了減少每次獲取 UserInfo 時重復創建 Manager 的問題。下面還特意添加了@Singleton注解實現了單例。
@Singleton public class UserManager {public UserInfo getUserById(long userId) {return new UserInfo();} }? ? 接下來真的 JSP 登場,為了JSP可以訪問到我們的 Bean,你需要引入 Hasor 的 JSP 標簽庫。接下來通過 hs 庫訪問我們的?ManagerBean 獲取 UserInfo。
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ taglib prefix="hs" uri="http://project.hasor.net/hasor/schema/jstl" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html lang="zh-CN"> <body><hs:findType var="userManager" type="net.demo.hasor.manager.UserManager"/> <c:set var="userInfo" scope="request" value="${userManager.getUserById(1234)}"/> 姓名:${userInfo.name}<br/> 年齡:${userInfo.age}<br/></body> </html>? ? 下面這個是運行結果:
-實踐:視圖前置 MVC 變版
? ? 在這種模式下我們需要借助一個 Controller 幫我們把數據透給前端 js 程序。瀏覽器通過請求我們的接口 Controller?來獲取數據。接口?Controller 負責返回 json 數據。
@MappingTo("/getUserInfo.json") public class GetUserInfo {public UserInfo execute(RenderData data) {return new UserInfo();} }????訪問URL運行結果:
? ? 其實這種模式,本質上還是經典MVC模式。
轉載于:https://my.oschina.net/ta8210/blog/753001
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的用 Hasor 谈一谈MVC设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族 C++ 微服务框架技术内幕揭秘
- 下一篇: Tomcat+Nginx+Memcach