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

来源:http://www.cnblogs.com/young-z/archive/2017/11/30/7923693.html
-Advertisement-
Play Games

前言 一位小妹去面試前端,前端leader問了"什麼是ajax?",答:“接收後臺的數據,然後然後自己填充和渲染樣式”;一位小哥去面試後臺,技術經理問了“什麼是ajax?”,答:“在不需重新載入整個網頁的情況下,發送非同步請求,返回json數據給前端”。準確答案到底是什麼?Ajax到底屬於前端還是屬於 ...


  前言

  一位小妹去面試前端,前端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 items="${list }" 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: 
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1> 打開main.go文件,查看代碼 點擊快捷鍵F12,進入beego.go文件,查看代碼 2> 打開router.go文件,查看路由 3> 打開default.go文件,查看業務邏輯 4> 打開index.tpl文件,查看前臺頁面 5> 執行邏輯總結 第一步,進入main.go,編譯程式;第二步 ...
  • 本文介紹一下matplotlib的最基本用法。 這次我們要顯示一個線性方程的直線。 首先要引入matplotlib庫,一般是用plt這個簡寫的,我們就按照大多數人的慣例來進行命名: 下麵我們用numpy生成x軸上的數據:從 1到1,總共有50個點: 再定義一個線性方程: 接著把x和y在坐標軸上顯示出 ...
  • 英語里final這個單詞大家都知道是“最終的”意思,其實還有一個意思是“不可更改的”。在Java里,final關鍵字作“不可更改的”來解釋更合適,即由final修飾的東西是“不可更改的”。final可以修飾變數、成員方法和類,還可以修飾方法的參數,但參數歸根結底還是變數。下麵是詳細解釋。 作者: 蟬 ...
  • 一、回顧jQuery實現的ajax 首先說一下ajax的優缺點 jquery 實現的ajax 1 <!DOCTYPE html> 2 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <scri ...
  • PyQt5 的 signal 與 slot 有所改變,例如,先定義一個 ZeroSignal 類: 使用時,一是綁定 slot 如下: 然後是找個機會發動之: 大約如此,完整代碼如下: OK! ...
  • java只所以被推廣,實際上很大原因是因為本身是跨平臺的,很大作用是因為虛擬機的關係。 一般情況下開發人員不需要關註虛擬機內部實現就可以日常開發了,但是有時候涉及到性能的時候就需要瞭解虛擬機的實現機制了。 那麼今天寫的內容更多的是關於編譯一套自己的虛擬機,為日後瞭解虛擬機底層原理鋪鋪路。 編譯虛擬機 ...
  • 歡迎訪問我的個人博客: "原文鏈接" 前言 人生苦短,我用python。學習python怎麼能不搞一下詞雲呢是不是(ง •̀_•́)ง 於是便有了這篇邊實踐邊記錄的筆記。 環境:VMware 12pro + CentOS7 + Python 2.7.5 安裝系統 之前一直用的是win10子系統,現在 ...
  • 首先上原文, 現在,假設我們要增強now()函數的功能,比如,在函數調用前後自動列印日誌,但又不希望修改now()函數的定義,這種在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。本質上,decorator就是一個返回函數的高階函數。 Decorator本質是高階函數? 不信 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...