用 Hasor 谈一谈MVC设计模式
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
????MVC 是一個(gè)老生常談的東西早已不是什么稀罕物件,不過(guò)在這里還是扒一扒到底都有多少種 MVC。
一、經(jīng)典 MVC
????先說(shuō)最經(jīng)典的 MVC,一個(gè)請(qǐng)求控制器的請(qǐng)求,負(fù)責(zé)讀取數(shù)據(jù),然后將數(shù)據(jù)派發(fā)到試圖上。如圖:
????在經(jīng)典?MVC 中,可以看到我們請(qǐng)求的頁(yè)面并不是真正的頁(yè)面,而是一個(gè)控制器。具體顯示的頁(yè)面由這個(gè)控制器來(lái)決定,大名頂頂?shù)?struts 框架就是這樣一種模式。然而,通常為了記憶方便,基于這種經(jīng)典模式的 MVC 我們通常是把 Controller 的名字起的和 View 一樣。
? ? 這種模式下,Controller 的職責(zé)主要有兩個(gè):1、確定顯示的最終頁(yè)面。2、執(zhí)行頁(yè)面邏輯準(zhǔn)備相關(guān)數(shù)據(jù)。
????在 View 中使用的數(shù)據(jù)是來(lái)自?Controller 給予的。
????例如“判斷當(dāng)前用戶(hù)是否登錄,如果登錄則展現(xiàn)用戶(hù)詳細(xì)信息,如果未登錄則展現(xiàn)登錄界面”。這種場(chǎng)景比較適合這種模式。
?
二、視圖前置 MVC
? ? 這是 MVC 的一個(gè)變版,在這種模式中 View 的地位被提升到 Controller 之前。也就是說(shuō)請(qǐng)求是先得到了要顯示的頁(yè)面,而頁(yè)面中的數(shù)據(jù)的獲取邏輯被后置的?Controller 提供。
????這種模式下,Controller 的職責(zé)變得只有一個(gè),那就是:執(zhí)行頁(yè)面邏輯準(zhǔn)備相關(guān)數(shù)據(jù)。視圖前置這種模式在職責(zé)上更加清晰,但是它失去了對(duì)頁(yè)面展現(xiàn)的控制。
? ? 通常在某個(gè)數(shù)據(jù)集中展現(xiàn)的地方會(huì)有這種模式的身影,例如:List 頁(yè)面,在List 頁(yè)面通常伴隨著查詢(xún)、分頁(yè)。這種頁(yè)面中頁(yè)面本身一般是不會(huì)有太大的變化,更多的是后臺(tái)的數(shù)據(jù)提取邏輯。
????其實(shí)這種 MVC 我們也并不陌生,jsp + bean 就是這樣一種形式。
?
三、視圖前置 MVC?變版
? ? 這是 視圖前置 MVC 的一個(gè)變版,它的工作模式?jīng)]有太大的變化。不同的是 View 被進(jìn)一步前置到 瀏覽器中,通過(guò) javascript 通過(guò) ajax 的方式訪(fǎng)問(wèn)?Controller。
? ? 這種模式下,一般有兩類(lèi)工程師共同開(kāi)發(fā)一個(gè)應(yīng)用程序,他們是:前段工程師、后段工程師。
? ? 這種模式的優(yōu)點(diǎn)在于,前后端開(kāi)發(fā)工程師,只需要協(xié)議數(shù)據(jù)交換格式。即可開(kāi)始各自的開(kāi)發(fā)工作。也是最常見(jiàn)的一種模式。這也是前后端分離的一種體現(xiàn)。
?
四、使用 Hasor 實(shí)現(xiàn)三種 MVC 模式的開(kāi)發(fā)
-Controller
? ? 我們先以 Controller?為例子進(jìn)行說(shuō)明,下面是使用?Hasor 開(kāi)發(fā)的?Controller。
@MappingTo("/index.htm") public class Index {public void execute(RenderData data) {data.put("data", new UserData());} }? ? 在例子中,我們簡(jiǎn)單的把 UserData 這個(gè)數(shù)據(jù)寫(xiě)入到 RenderData 對(duì)象中。最后在頁(yè)面渲染的時(shí)候再把這個(gè)對(duì)象拿出來(lái)。
????當(dāng)然您也可以像這樣,直接把對(duì)象塞到 Request 中。
data.getHttpRequest().setAttribute("data", new UserData());? ? 或者干脆更直接一點(diǎn)
@MappingTo("/index.htm") public class Index {public void execute(HttpServletRequest request) {request.setAttribute("data", new UserData());} }? ? 除了前面三種方式之外,Haosr 還學(xué)習(xí)優(yōu)秀的 JFinal 框架。您可以繼承一個(gè)類(lèi),通過(guò)繼承類(lèi)的各種工具方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的設(shè)置,例如:
@MappingTo("/index.htm") public class Index extends WebController {public void execute() {this.putData("data", new UserData());// orthis.setAttr("data", new UserData());} }? ? 具體想用哪種方式,你喜歡就好。
-實(shí)踐:經(jīng)典MVC設(shè)計(jì)模式
? ? 我們可以通過(guò)這種方式實(shí)現(xiàn) 經(jīng)典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");} }-實(shí)踐:視圖前置 MVC
????前面提到過(guò),前置 mvc 就是一種 jsp + bean 的模式。那么索性就 “JSP + Bean”把。先看負(fù)責(zé)獲取數(shù)據(jù)的 ManagerBean,為了減少每次獲取 UserInfo 時(shí)重復(fù)創(chuàng)建 Manager 的問(wèn)題。下面還特意添加了@Singleton注解實(shí)現(xiàn)了單例。
@Singleton public class UserManager {public UserInfo getUserById(long userId) {return new UserInfo();} }? ? 接下來(lái)真的 JSP 登場(chǎng),為了JSP可以訪(fǎng)問(wèn)到我們的 Bean,你需要引入 Hasor 的 JSP 標(biāo)簽庫(kù)。接下來(lái)通過(guò) hs 庫(kù)訪(fǎng)問(wèn)我們的?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>? ? 下面這個(gè)是運(yùn)行結(jié)果:
-實(shí)踐:視圖前置 MVC 變版
? ? 在這種模式下我們需要借助一個(gè) Controller 幫我們把數(shù)據(jù)透給前端 js 程序。瀏覽器通過(guò)請(qǐng)求我們的接口 Controller?來(lái)獲取數(shù)據(jù)。接口?Controller 負(fù)責(zé)返回 json 數(shù)據(jù)。
@MappingTo("/getUserInfo.json") public class GetUserInfo {public UserInfo execute(RenderData data) {return new UserInfo();} }????訪(fǎng)問(wèn)URL運(yùn)行結(jié)果:
? ? 其實(shí)這種模式,本質(zhì)上還是經(jīng)典MVC模式。
轉(zhuǎn)載于:https://my.oschina.net/ta8210/blog/753001
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的用 Hasor 谈一谈MVC设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 魅族 C++ 微服务框架技术内幕揭秘
- 下一篇: Tomcat+Nginx+Memcach