1. 程式人生 > >從MVC到Ajax再到前後端分離的思考

從MVC到Ajax再到前後端分離的思考

轉自:從MVC到Ajax再到前後端分離的思考

從MVC到Ajax再到前後端分離的思考

    <div class="postBody">
        <div id="cnblogs_post_body" class="blogpost-body" deep="8"><h1>  前言</h1>

  一位小妹去面試前端,前端leader問了”什麼是ajax?”,答:“接收後臺的資料,然後然後自己填充和渲染樣式”;一位小哥去面試後臺,技術經理問了“什麼是ajax?”,答:“在不需重新載入整個網頁的情況下,傳送非同步請求,返回json資料給前端”。準確答案到底是什麼?Ajax到底屬於前端還是屬於後端?前端(或者後端)到底需不需要懂得Ajax?Ajax請求與普通的http請求有什麼區別?資料庫中的資料通過Ajax請求和普通請求下分別是怎麼傳遞到前臺的…等等一些問題,似乎需要靜下心來理一理。

  MVC篇

  最典型的MVC就是JSP + servlet + javabean的模式,不少人的web起點應該也是這個,記得當時看到最多的問題就是JSP和Servlet區別,後來隨著Struts 、Spring MVC等框架出來,MVC被談論的更多了,越來越多的人開始想要深入學習和理解它,同時也有越來越多的問題開始圍繞MVC展開。基本的概念:MVC = Model View Controller = 模型-檢視-控制器,太過於概念化的東西確實不太好理解,也許框架都用了好幾年,一問MVC還是會懵。不過還是Talk is cheap,下面以Spring MVC + jsp的開發過程示例,同時也是資料在普通http請求後從資料庫傳遞到前端的過程。

  背景:ssm專案中,將資料庫中TBL_PERSON表的記錄全部獲取,在前端以表格呈現出來,即<table>標籤下(因為自己寫的樣式實在太醜,重點關注過程吧)

  1.Controller層關鍵程式碼

複製程式碼
package com.mmm.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.mmm.pojo.Person; import com.mmm.service.PersonService; @Controller @RequestMapping("person") public class PersonController { @Autowired PersonService personService; /** * 框架跳轉頁面預設是forward,也就是請求轉發 * 這裡的model設定的屬性,在jsp頁面也能直接通過el表示式獲取 * */ @RequestMapping(value="httplist") public String httplist(Model model) { List<Person> list = personService.selectAll(); model.addAttribute("list", list); return "person/list"; } ...... }
複製程式碼

  2.jsp頁面

複製程式碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>Person列表</title>   
  </head>

  <body>
    <table>
        <tr>
            <th>姓名</th>
            <th>性別</th>
        </tr>
        <c:forEach var="i" begin="0" end="${list.size() }">
            <tr>
                <td>${list[i].name }</td>
                <td>${list[i].gender }</td>
            </tr>
        </c:forEach>
    </table>
  </body>
</html>
複製程式碼

  3.tomcat啟動專案,位址列輸入http://localhost:8081/mm-web/person/httplist,即可看到如下頁面,獲取到了資料庫中完整資料

  Ajax篇

  傳統web開發在沒有應用Ajax技術的時候,往往頁面是用jsp,而這也讓我們看到MVC的不足,檢視與控制器間的過於緊密的連線,每次請求必須經過“控制器->模型->檢視”這個流程,當java指令碼 + 各種表示式 + html程式碼 +javascript程式碼混雜一塊的時候,簡直痛不欲生,程式碼可讀性十分差,而且給後面維護和修改程式碼的人帶來很大阻礙。再說下Ajax,首先簡單介紹下,Ajax = 非同步 Javascript 和 XML,聽名字不難發現,並未涉及到後端java程式碼,核心物件XMLHTTPRequest(可擴充套件超文字傳輸請求),通過它,我們可以在不重新整理頁面的情況下,傳送非同步請求至後臺,並獲取後臺返回的json資料。說的簡單點,就是不重新整理或者跳轉頁面,傳送請求然後拿資料,在這裡,比較重要的一點,主動權是在前臺這邊,前臺拿到資料後再根據需求去填充資料內容,渲染樣式,實現頁面效果。而且由於Ajax基於的Javascript屬於前端指令碼,並不依賴於jsp環境,頁面寫Html也是可以的。所以下面以Spring MVC + Ajax + jsp示例(這裡的ajax採用Jquery寫法,工作中一般也是應用Jquery較多,原生js寫法相較繁瑣一點,這裡就不展示了),同時為了區別返回json資料和直接跳轉頁面的區別,在控制器中寫了兩個方法,一個用於跳轉頁面,但並未拿到資料,等頁面載入後,通過js發起Ajax請求到控制層拿到資料,再動態填充到頁面,並且無需重新整理頁面,所以後面我們在位址列輸入地址後,看上去像一次請求,其實一共兩次。

  1.Controller層關鍵程式碼

複製程式碼
package com.mmm.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.mmm.pojo.Person;
import com.mmm.service.PersonService;

@Controller
@RequestMapping("person")
public class PersonController {

    @Autowired
    PersonService personService;

    /**
     * 這裡接受位址列請求,僅起到轉發頁面作用,並未傳遞到我們資料庫的內容
     * */
    @RequestMapping(value="toPage")
    public String httplist() {
        return "person/list";
    } 

    /**
     * 這裡@ResponseBody代表該方法接受請求後不是跳轉頁面,而是直接返回json資料
     * 注意引入json相關jar包,還有spring MVC配置中不要漏掉<mvc:annotation-driven/>
     * */
    @RequestMapping(value="ajaxlist")
    @ResponseBody
    public List<Person> ajaxlist() {
        List<Person> list = personService.selectAll();
        return list;
    } 

    ......
}
複製程式碼

   2.jsp頁面

複製程式碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>Person列表</title>
    <!-- 引入Jquery -->
    <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
    <!-- 編寫指令碼 -->
    <script type="text/javascript">
        $(function() {
            $.ajax({
                url: '${pageContext.request.contextPath}/person/ajaxlist',
                type: 'post',
                dataType: 'json',
                success: function(data) {//這裡的data代表的就是返回person集合list
                    var html = "";
                    html += "<tr><th>姓名</th><th>性別</th></tr>";
                    for(var i in data){
                        html += "<tr><td>"+data[i].name+"</td><td>"+data[i].gender+"</td></tr>";
                    }
                    $("table").html(html);
                }
            });
        });
    </script>
  </head>

  <body>
    <table>
    </table>
  </body>
</html>
複製程式碼

  3.tomcat啟動專案,位址列輸入http://localhost:8081/mm-web/person/toPage,即可看到如下頁面,同樣獲取到了資料庫中完整資料(是兩次請求)

 

相關推薦

壹開始前後分離 [.netCore 填坑 ] 三十四║Swagger:API多版本控制,帶來的思考

前言 大家週二好呀,.net core + Vue 這一系列基本就到這裡差不多了,今天我又把整個系列的文章下邊的全部評論看了一下(我是不是很負責哈哈),提到的問題基本都解決了,還有一些問題,已經在QQ群裡討論過了,今天再寫一篇,然後給這個系列畫一個暫時的句號吧,這些天也考慮寫點兒啥,希望看到的小夥伴給點

真實資料對接 0開發前後分離的企業級上線專案(前後分離式 手把手0打造電商平臺-前端開發)

第1章 課程介紹(2018配套教程:電商前端+電商後端+電商許可權管理系統課程) 本章中會先讓大家瞭解課程整體情況,然後手把手帶大家做一些開發前的準備工作。 1-1 課程導學 1-2 電商平臺需求分析 1-3 架構設計及技術選型 1-4 前後端配合方式及資料介面

全程真實數據對接 帶你0開發前後分離的企業級上線項目

詳情 支付 開發 線上 完成 分享 提取 rom AC <ignore_js_op> 第1章 課程介紹(2018配套教程:電商前端+電商後端+電商權限管理系統課程)本章中會先讓大家了解課程整體情況,然後手把手帶大家做一些開發前的準備工作。後臺管理系統測試賬號和密

真實資料對接 0開發前後分離的企業級上線專案

=》前往下載 第1章 課程介紹(2018配套教程:電商前端+電商後端+電商許可權管理系統課程) 本章中會先讓大家瞭解課程整體情況,然後手把手帶大家做一些開發前的準備工作。後臺管理系統測試賬號和密碼(切勿修改,導致其他同學體驗不了) 賬號:admin 密碼:admin (Java一期課程I

最新對接真實資料 0開發前後分離企業級上線專案實戰

第1章 課程介紹(2018配套教程:電商前端+電商後端+電商許可權管理系統課程)本章中會先讓大家瞭解課程整體情況,然後手把手帶大家做一些開發前的準備工作。後臺管理系統測試賬號和密碼(切勿修改,導致其他同學體驗不了)        賬號

壹開始前後分離 [ Vue2.0+.NET Core2.1] 二十║Vue基礎終篇:元件詳解+專案說明

緣起 新的一天又開始啦,大家也應該看到我的標題了,是滴,Vue基礎基本就到這裡了,咱們回頭看看這一路,如果你都看了,並且都會寫了,那麼現在你就可以自己寫一個Demo了,如果再瞭解一點路由,ajax請求(這裡是axios),那麼你就可以準備面試前端了,哈哈,當然沒有這麼誇張,往後的路還很長,至少咱們基礎都會了

壹開始前後分離 [ Vue2.0+.NET Core2.1] 二十一║Vue實戰:開發環境搭建【詳細版】

緣起  哈嘍大家好,兜兜轉轉終於來到了Vue實戰環節,前邊的 6 篇關於Vue基礎文章我剛剛簡單看了看,感覺寫的還是不行呀,不是很系統,所以大家可能看上去比較累,還是得抽時間去潤潤色,修改修改語句和樣式,至少也得對得住粉絲哈,應該給部落格園官方提個小建議,要是能允許好友或者其他人修改文章的功能就好了,比如百

壹開始前後分離【 .NET Core2.0 +Vue2.0 】框架之十二 || 三種跨域方式比較,DTOs(資料傳輸物件)初探

更新反饋 1、博友@童鞋說到了,Nginx反向代理實現跨域,因為我目前還沒有使用到,給忽略了,這次記錄下,為下次補充。 程式碼已上傳Github+Gitee,文末有地址   今天忙著給小夥伴們提出的問題解答,時間上沒把握好,都快下班了,趕緊釋出:書說上文《從壹開始前

壹開始前後分離 [ Vue2.0+.NET Core2.1] 二十三║Vue實戰:Vuex 其實很簡單

前言 哈嘍大家週五好,馬上又是一個週末了,下週就是中秋了,下下週就是國慶啦,這裡先祝福大家一個比一個假日嗨皮啦~~轉眼我們的專題已經寫了第 23 篇了,好幾次都堅持不下去想要中斷,不過每當看到群裡的交流,看到部落格下邊好多小夥伴提出問題,我又燃起了鬥志,不過這兩天感冒了,所以更新的比較晚,這裡也提醒大家,節

壹開始前後分離 [ Vue2.0+.NET Core2.1] 二十四║ Vuex + JWT 實現授權驗證登陸

壹週迴顧 哈嘍,又是元氣滿滿的一個週一,又與大家見面了,週末就是團圓節了,正好咱們的前後端也要團圓了,為什麼這麼說呢,因為以後的開發可能就需要前後端一起了,兩邊也終於會師了,還有幾天Vue系列就基本告一段落了,大家也好好加油鴨,今天將的內容呢,其實細心的你看到題目應該就能大家猜到了,前提是一直看本系列的小夥

壹開始前後分離 [ Vue2.0+.NetCore2.1] 二十六║Client渲染、Server渲染知多少{補充}

前言 書接上文,昨天簡單的說到了 SSR 服務端渲染的相關內容《二十五║初探SSR服務端渲染》,主要說明了相關概念,以及為什麼使用等,昨天的一個小栗子因為時間問題,沒有好好的給大家鋪開來講,今天呢,咱們就繼續說一下這個 SSR 服務端渲染,並結合著 Client 客戶端渲染,一起說一說相關的內容,當然還是圍

壹開始前後分離 [ vue + .netcore 補充專案2 ] 二七║ Nuxt 基礎:框架初探

緣起 哈嘍大家好,又是週四了,俗話說週四來了,週末還遠麼哈哈,老張我也想下週請假,來個16天的大長假喲,不知道大家是怎麼請假的,近來發現文章下邊已經沒有人評論了,趕腳比較淒涼了,大家看到的麻煩點個贊呀說個話呀,增加下人氣哈哈,剛剛突然想到原來問題都跑到群裡了,也是,當初建立群的目的就是解決問題滴,不能本末倒

壹開始前後分離 [ vue + .netcore 補充教程 ] 二八║ Nuxt 基礎:面向原始碼研究Nuxt.js

前言 哈嘍大家週五好,又是一個開開心心的週五了,接下來就是三天小團圓啦,這裡先祝大家節日快樂咯,希望都沒有加班哈哈,今天公司發了月餅,嗯~時間來不及了,上週應該搞個活動抽中幾個粉絲髮月餅的,下次吧,這裡先預告一下,聖誕節活動,給粉絲送蘋果吧哈哈,不過聽起來好 low 呀,大家有好的想法可以下邊評論或者來

壹開始前後分離 [ vue + .netcore 補充教程 ] 二九║ Nuxt實戰:非同步實現資料雙渲染

回顧 哈嘍大家好!又是元氣滿滿的周~~~二哈哈,不知道大家中秋節過的如何,馬上又是國慶節了,博主我將通過三天的時間,給大家把專案二的資料添上(這裡強調下,填充資料不是最重要的,最重要的是要配合著讓大家明白 nuxt.js 是如何一步步實現服務端渲染的),雖說是基於 Nuxt 的,但是資料來源還是我們的老

壹開始前後分離 [ vue + .netcore 補充教程 ] 三十║ Nuxt實戰:動態路由與Vuex狀態樹

【SSR 同構】 SSR 用通過同構的方法解決了上面問題。我們先說一下 SSR 的具體表現,比如我們現在有一個列表頁,列表中每一行對應一個詳情頁,那麼如果直接用瀏覽器訪問列表頁時,伺服器返回資料和 html 融合後的頁面,瀏覽器拿到頁面直接渲染,這就省去了先請求 js 再由 js 發起資料請求的過程,頁

壹開始前後分離 [ vue + .netcore 補充教程 ] 三十║ Nuxt實戰:動態路由+同構

上期回顧 說接上文《二九║ Nuxt實戰:非同步實現資料雙端渲染》,昨天咱們通過專案二的首頁資料處理,簡單瞭解到了 nuxt 非同步資料獲取的作用,以及親身體驗了幾個重要資料夾的意義,整篇文章也一直在往如何實現服務端渲染的方向講解,因為我個人感覺這個是一個重點,如果是隻會如何使用的話,大家就可以走馬觀花的看

壹開始前後分離 [ vue + .netcore 補程 ] 三十一║ Nuxt終篇:基於Vuex的許可權驗證探究

緣起 哈嘍大家好,今天週四啦,樓主明天要正式放假了,這裡先祝大家節日快樂咯,希望在家裡能繼續研究點兒東西吧,今天呢是 nuxt 的最後一篇,主要是對許可權登陸進行研究,這一塊咱們之前在說第一個專案的時候已經稍微說到了,具體的邏輯大家可以檢視這篇文章《二十四║ Vuex + JWT 實現授權驗證登陸》,具體的

MVC到前後分離

摘要:MVC模式早在上個世紀70年代就誕生了,直到今天它依然存在,可見生命力相當之強。MVC模式最早用於Smalltalk語言中,最後在其它許多開發語言中都得到了很好的應用,例如,Java中的Struts、Spring MVC等框架。 1. 理解MVC MVC是一種經典的

壹開始前後分離 [.netCore 填坑 ] 三十二║ 四種方法快速實現專案的半自動化搭建

更新 1、更新小夥伴 @ 提出好點子:試試VS的外掛擴充套件:VSIX、ItemProject等,將T4模板給製作外掛,這裡先記下,有懂的小夥伴可以自己先試試,我會在以後更新。 2、感謝小夥伴  @的測試和指正,本文 T4 模板已經支援 Oracle 緣起 哈嘍大家週二好呀,這個國慶過的真

壹開始前後分離 [.netCore 填坑 ] 三十三║ ⅖ 種方法實現完美跨域

緣起 哈嘍大家週四好,趁著大家在團建的時候花一個下午學點兒東西,也是督促大家學習喲,希望大家看到老張的文章,可以有一丟丟的學習動力。不過話說過來,該吃的團建還是要去的,不能學我呀 [ /(ㄒoㄒ)/~~ ],昨天開始搭建公司的前後端分離專案,糾結是 Iview 還是 ElementUI ,百思不得其解,都說