1. 程式人生 > 其它 >Spring+SpringMVC+MyBatis整合進階篇(四)RESTful實戰(前端程式碼修改)

Spring+SpringMVC+MyBatis整合進階篇(四)RESTful實戰(前端程式碼修改)

前言

前文《RESTful API實戰筆記(介面設計及Java後端實現)》中介紹了RESTful中後端開發的實現,主要是介面地址修改和返回資料的格式及規範的修改,本文則簡單介紹一下,RESTful過程中前端程式碼的改變以及前後端分離的一些想法。

整合程式碼及修改計劃

在這次的程式碼修改過程中,後端改動相對較大,而前端程式碼的改動更多的是配合後端修改,主要是請求介面的url及js的ajax請求部分,修改後的程式碼更加符合RESTful規範:

    function saveArticle() {
        var title = $("#title").val();
        var addName = $("#addName").val();
        var content = UE.getEditor('myEditor').getContent();
        var id = $("#articleIdfm").val();
        var data = {"id": id, "articleTitle": title, "articleContent": content, "addName": addName}
        $.ajax({
            type: method,//方法型別
            dataType: "json",//預期伺服器返回的資料型別
            url: url,//url
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(data),
            success: function (result) {
                console.log(result);//列印服務端返回的資料
                if (result.resultCode == 200) {
                    $.messager.alert("系統提示", "儲存成功");
                    $("#dlg").dialog("close");
                    $("#dg").datagrid("reload");
                    resetValue();
                }
                else {
                    $.messager.alert("系統提示", "操作失敗");
                    $("#dlg").dialog("close");
                    resetValue();
                };

          },
            error: function () {
                $.messager.alert("系統提示", "操作失敗");
            }
        });
    }

改動較大的則是登入模組的程式碼,登入頁面樣式改變,與後端的互動也完全修改,由原來的後端接受登入資訊並進行邏輯處理最後控制頁面跳轉,改為前端通過js和cookie的操作來控制登入流程,後端僅作為介面提供者的角色。

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>perfect-ssm - 登入</title>
    <meta name="keywords" content="perfect-ssm">
    <meta name="description" content="perfect-ssm">
    <link href="css/bootstrap.min14ed.css" rel="stylesheet">
    <link href="css/font-awesome.min93e3.css" rel="stylesheet">
    <link href="css/animate.min.css" rel="stylesheet">
    <link href="css/style.min862f.css" rel="stylesheet">
    <!--[if lt IE 9]>
    <meta http-equiv="refresh" content="0;ie.html"/>
    <![endif]-->
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script src="http://apps.bdimg.com/libs/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="/js/login.js"></script>
    <script src="/js/common.js"></script>
</head>
<body class="gray-bg">
<div class="middle-box text-center loginscreen  animated fadeInDown">
    <div>
        <div>
            <h1 class="logo-name">13</h1>
        </div>
        <h3>歡迎使用 perfect-ssm</h3>
        <form class="m-t" role="form" id="adminlogin" method="post"
              name="adminlogin" onsubmit="return false" action="##">
            <div class="form-group">
                <input type="email" class="form-control" placeholder="使用者名稱" name="userName" id="userName" required="">
            </div>
            <div class="form-group">
                <input type="password" class="form-control" placeholder="密碼" name="password" id="password" required="">
            </div>
            <button type="button" class="btn btn-primary block full-width m-b" onclick="javascript:login();">登 錄
            </button>
            <p class="text-muted text-center"><a href="##" onclick="javascript:adminlogin.reset();return false;">
                <small>重置</small>
            </a>
            </p>
        </form>
    </div>
</div>
</body>
</html>
function login() {
    var userName = $("#userName").val();
    var password = $("#password").val();
    var roleName = $("#roleName").val();
    if (userName == null || userName == "") {
        alert("使用者名稱不能為空!");
        return;
    }
    if (password == null || password == "") {
        alert("密碼不能為空!");
        return;
    }
    $.ajax({
        type: "POST",
        dataType: "json",
        url: "/users/cookie",
        data: $('#adminlogin').serialize(),
        success: function (result) {
            if (result.resultCode == 200) {
                setCookie("userName", result.data.currentUser.userName);
                setCookie("roleName", result.data.currentUser.roleName);
                window.location.href = "main.jsp";
            };
        },
        error: function () {
            alert("異常!");
        }
    });

}

頁面的設計和美感與原來的專案並沒有太多差別,這也是大部分朋友詬病這個專案的地方,由於暫時只是做一些功能性的實現和優化,因此頁面的重構放在了後面的工作計劃中,前端樣式這次也只是修改了登入頁面,其他頁面並沒有修改,因為這個階段想要增加的是RESTful和快取模組以及其他中介軟體的整合,至於頁面重構會放到下一個專案中,目前的easyui會完全剝除掉,計劃使用vue + ssm api實現一個前後端分離的實戰專案。

控制權轉變

這是我對這次程式碼改動的一點小總結: 修改前:

修改後:

從圖中可以看出後端和前端的功能變化,後端由原來的大包大攬似的獨裁者變成了介面提供者,而前端也不僅僅是原來那樣僅處理小部分業務,頁面跳轉也不再由後端來處理和決定,整個專案的控制權已經由後端過渡至前端來掌控,後端所扮演的角色轉變已然改變,目前雖然沒有完全實現如圖中的效果,因為頁面和功能實在有些少,小小的改變並沒有帶來特別明顯的衝擊感,但是八字已經有了一撇啦。

前後端分離的展望

其實目前的專案中已經有了前後端分離的雛形了,比如登入流程,及文章詳情頁,都是採用的靜態頁面+RESTful來實現所有功能,

傳統的開發模式中,前端開發人員一般只是簡單地將UI設計師提供的原型圖實現成靜態的html頁面,切切圖、寫寫css、調調樣式之類的,而具體的頁面互動邏輯,比如與後臺的資料互動工作、或者頁面間的跳轉,可能都是由後端的開發人員來實現的,前端十分的耦合後臺。

甚至可能後臺人員直接兼顧前端的工作,一邊實現API介面,一邊開發頁面,兩者互相切換著做,導致後臺的開發壓力大大增加,前後端工作分配不均,不僅僅開發效率慢,而且相互依賴嚴重,不能做到完全的並行開發,而且程式碼難以維護,前端如果只是做html程式碼,後端還需要參照著改,一旦改動則痛苦無比。

如上文中的圖片所示,前後端分離的話則可以很好的解決前後端分工不均的問題,將更多的互動邏輯分配給前端來處理,而後端則可以專注於其本職工作,比如提供API介面,進行許可權控制等工作,前端開發人員可以獨立完成與使用者互動的整一個過程,兩者可以並行開發,不互相依賴,開發效率更快,而且分工比較均衡。

想法很多,這裡就不一一列舉了,待完成後再詳細介紹吧,進階篇中的文章還是更多的介紹後端的一些技術棧,前端的重構會在下個專案中實現。

結語

首發於我的個人部落格,新的專案演示地址:perfect-ssm,登入賬號:admin,密碼:123456

如果有問題或者有一些好的創意,歡迎給我留言,也感謝向我指出專案中存在問題的朋友,本篇主要講述了實現RESTful中前端部分的修改。