這篇是承接《輕量級 Java 開發框架 設計》系列Blog文的後續文章,本文將着重講解使用 MVC 設計模式開發基於 Hasor 的應用程序。 php
在《查詢數據庫顯示到頁面(http://my.oschina.net/u/1166271/blog/186940)》一文中簡要介紹瞭如何查詢數據庫的內容並顯示到頁面上,其中也用到了 MVC 開發模式。本文將說起不一樣形式下的 MVC 在 Hasor 中如何運用。 html
最傳統的 MVC 分層是, M 模型層負責處理業務邏輯,V 視圖層負責展示業務層輸出的數據,C 控制器負責外界環境的輸入,並將輸入轉換爲模型層的輸入,最終將模型層的輸出派發到視圖。這種工做方式以下圖所示: java
這種 MVC 強制要求必須經過 控制器 將請求轉發到視圖上才能完成頁面展現。這是典型的 MVC 模型,理解起來並不困難。可是基於這種模型開發人員在開發 Web 應用程序工做中會遇到問題。 git
首先咱們知道,開發 WEB 應用程序須要一個展現頁面。頁面展現技術能夠是 jsp、模板等。使用上面這種方式,開發人員要記住控制器、頁面。兩個地址。而控制器地址和頁面地址每每會出現不一致或者沒法根據一個給定的規則進行互相推導。 github
這樣一來在調試過程當中,開發人員每每會無從下手,究竟是哪一個控制轉到這個視圖,又或者這個控制器最終由哪一個頁面來展現。固然經過跟蹤代碼這根本不是問題。可是不要忘記的是這回耗去開發人員大量的時間。 數據庫
即便開發人員徹底熟悉了對應關係,咱們仍然不能確保這套頁面在軟件生命週期結束以前都是由一我的去維護,後來的人依然會及其痛苦。 設計模式
所以有不少項目放棄了這種模式。固然若是您的項目只有一個顯示頁面,同時具備多個入口地址這種模式無非是最佳的選擇。 框架
----------------------------------------------------------------- jsp
根據上面這種狀況,會出現一個變版 MVC 。其中不一樣的是請求直接進入 View ,由 View 調用 Mode。從而省去 控制器的開發。以下圖所示: maven
這種開發模式有點趨向於比較原始的 JSP + Bean 沒錯,用 JSP + Bean 很準確的描述這種模式。這種模式改良了傳統 MVC 使其更加適用於 Web 應用程序開發。在 Web 開發上能夠體現如下幾個優勢:
1.開發人員沒必要記住 控制器 和 視圖的 映射關係。
2.能夠所見即所得的方式直接訪問 View 視圖,經過根據視圖的須要調用一個或多個 Mode。
不過這種模式下,缺少 action 在頁面展現以前的邏輯處理。
-----------------------------------------------------------------
介於上面兩個 MVC 開發方式的優缺點,有不少同窗就會將兩種模式整合到一塊兒,整合以後的 MVC 結構看上去是這樣的:
其實不難看出,這種 MVC 只是簡單的將前面兩種 MVC 模式混合起來一塊兒應用罷了。在實際開發中,通常會直接訪問 控制器 地址,經過控制器作展現前的邏輯處理。然後轉給視圖作展現,對於視圖而言又多了一個直接調用 Model 通道。經過這個通道能夠減小控制器的編碼量。
在實際應用中,對於一些邏輯簡單的頁面來講有的同窗就會直接訪問視圖,經過視圖直接調用模型展現數據。轉而略去 控制器部分代碼。這至關於上面圖中輸入有了兩條線。
這種 MVC 開發方式具備很強的靈活性,有不少公司都在採用這種模式。
-----------------------------------------------------------------
第一種 MVC在 Hasor 中的體現:
那麼接下來如何使用 Hasor 開發基於上面三種 MVC 模式的應用程序呢?
你們先來看第一種,第一種比較典型,須要:控制器、視圖、模型。三個元素。下面是三個元素的例子代碼:
// M 模型層代碼,負責查詢數據庫中用戶列表 public class UserService { @Inject private JdbcTemplate jdbcTemplate; // /*取得用戶列表*/ public List<UserBean> getUserList() { List<UserBean> userList = jdbcTemplate.queryForList("select * from TB_User", UserBean.class); return userList; } }
//C 控制器 負責接受請求參數,並調用模型層,最終派發視圖顯示。 @Controller("/mgr/user") public class UserAction extends AbstractController { @Inject private UserService userService;//依賴輸入模型層服務類 /*獲取用戶列表,轉發到‘/mgr/user/userList.jsp’*/ @Forword public String userList() { List<UserBean> userList = userService.getUserList(); this.setAttr("userList", userList); return "/mgr/user/userList.jsp"; } }
//最後使用 JSP 做爲 View 表現層,配合 JSTL 標籤庫展現用戶列表數據。 <%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Demo</title> </head> <body> <table> <thead> <tr> <td width="290px;">ID</td> <td width="120px;">姓名</td> <td width="290px;">賬號</td> <td>郵箱</td> </tr> </thead> <tbody> <c:forEach var="user" items="${userList}"> <tr> <td>${user.userUUID}</td> <td>${user.name}</td> <td>${user.loginName}</td> <td>${user.email}</td> </tr> </c:forEach> </tbody> </table> </body> </html>
-----------------------------------------------------------------
第二種 MVC在 Hasor 中的體現:
修改上面這個例子,在 UserServices 上添加 @Bean 註解並給定一個名字,這樣方便在 View 層頁面中找到它。從而完成第二種 MVC 中 V 訪問 M 的須要。修改代碼以下:@Bean("UserService") public class UserService { @Inject private JdbcTemplate jdbcTemplate; // /*取得用戶列表*/ public List<UserBean> getUserList() { List<UserBean> userList = jdbcTemplate.queryForList("select * from TB_User", UserBean.class); return userList; } }
接着咱們只須要 在頁面中 調用這個 Services 便可,因爲使用的頁面展現技術爲 JSP 所以須要藉助 Hasor JSTL 標籤庫進行調用。
這部分邏輯的執行順序應該是這個樣子的:
1.取得名稱爲「UserService」的服務對象。
2.調用 userList 屬性的 getUserList 方法取得用戶列表。
3.使用 JSTL 或者其它手段在頁面中展現用戶數據。
<%@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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Demo</title> </head> <body> <table> <thead> <tr> <td width="290px;">ID</td> <td width="120px;">姓名</td> <td width="290px;">賬號</td> <td>郵箱</td> </tr> </thead> <tbody> <hs:defineBean bean="UserService" var="userService"/> <c:forEach var="user" items="${userService.userList}"> <tr> <td>${user.userUUID}</td> <td>${user.name}</td> <td>${user.loginName}</td> <td>${user.email}</td> </tr> </c:forEach> </tbody> </table> </body> </html>
-----------------------------------------------------------------
第三種 MVC在 Hasor 中的體現:
第三種 MVC 其實就是將前兩個例子綜合到一塊兒,這裏就不在展現代碼是如何開發。這種方式下無外乎就是請求 控制器,控制器將數據放入 request 而後將派發給 JSP 視圖作處理。 JSP 在處理過程當中又再次經過 hs:defineBean 標籤去訪問其它 Servlet 。從而協同完成頁面開發。 ----------------------------------------------------------------
目前的開發代碼存放於(包括Demo程序):
Github: https://github.com/zycgit/hasor
git@OSC: http://git.oschina.net/zycgit/hasor
很是感謝您百忙之中抽出時間來看這一系博文。能夠經過Maven 中央倉庫網站 http://search.maven.org/ 搜索 Hasor 下載 hasor 的相關代碼。