前后端不分離與前后端分離的Java Web開發對比介紹

在現代Web開發中,前后端架構設計有兩種主要模式:前后端不分離和前后端分離。本文將詳細介紹這兩種模式,展示如何使用Spring Boot開發應用,并提供可運行的示例代碼。

前后端不分離的Java Web開發

在前后端不分離的架構中,前端頁面與后端代碼緊密耦合在一起,通常使用模板引擎在服務器端生成HTML頁面并返回給客戶端。

項目結構
springboot-thymeleaf
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── example
│       │           └── DemoApplication.java
│       │           └── HelloController.java
│       └── resources
│           ├── templates
│           │   └── hello.html
│           └── application.yml
代碼和配置

DemoApplication.java:

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

HelloController.java:

package com.example;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {@GetMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Hello, World!");return "hello";}
}

hello.html:

<!DOCTYPE html>
<html>
<head><title>Hello</title>
</head>
<body><h1 th:text="${message}"></h1>
</body>
</html>

application.yml:

server:port: 8080
spring:thymeleaf:cache: false
部署和運行
  1. 將Spring Boot應用打包成JAR文件:

    mvn clean package
    
  2. 在命令行中運行:

    java -jar target/springboot-thymeleaf-0.0.1-SNAPSHOT.jar
    
  3. 在瀏覽器中訪問http://localhost:8080/hello,你應該會看到“Hello, World!”。

請求處理流程
  1. 客戶端請求:用戶在瀏覽器中輸入URL,例如http://localhost:8080/hello,瀏覽器發送HTTP請求到服務器。
  2. Spring Boot接收請求:Spring Boot內置的Tomcat服務器接收請求。
  3. 請求解析和路由:Spring Boot使用DispatcherServlet作為前端控制器,將請求路由到對應的Controller。
  4. Controller處理請求HelloController中的sayHello方法被調用,處理請求并返回視圖名稱hello
  5. 視圖解析和渲染:Spring Boot使用Thymeleaf模板引擎解析hello.html模板,將數據模型中的message屬性替換為實際值。
  6. 生成和返回響應:生成的HTML頁面作為HTTP響應返回給客戶端。
  7. 客戶端顯示響應:瀏覽器接收響應并渲染HTML內容,顯示給用戶。

前后端分離的Java Web開發

在前后端分離的架構中,前端和后端是獨立開發和部署的。前端通過API調用與后端進行數據交互。前端通常使用現代JavaScript框架(如Vue.js),后端使用Spring Boot提供RESTful API。

項目結構
springboot-vue
├── backend
│   ├── src
│   │   └── main
│   │       ├── java
│   │       │   └── com
│   │       │       └── example
│   │       │           └── DemoApplication.java
│   │       │           └── HelloController.java
│   │       └── resources
│   │           └── application.yml
└── frontend├── public│   └── index.html└── src├── App.vue├── main.js└── components└── HelloWorld.vue
后端代碼和配置

DemoApplication.java:

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

HelloController.java:

package com.example;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/api/hello")public String sayHello() {return "Hello, World!";}
}

application.yml:

server:port: 8080
前端代碼和配置

index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue App</title>
</head>
<body><div id="app"></div><script src="/dist/build.js"></script>
</body>
</html>

App.vue:

<template><div id="app"><HelloWorld msg="Welcome to Your Vue.js App"/></div>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'App',components: {HelloWorld}
}
</script>

main.js:

import Vue from 'vue'
import App from './App.vue'Vue.config.productionTip = falsenew Vue({render: h => h(App),
}).$mount('#app')

HelloWorld.vue:

<template><div><h1>{{ msg }}</h1><button @click="fetchMessage">Fetch Message</button><p>{{ message }}</p></div>
</template><script>
export default {props: {msg: String},data() {return {message: ''}},methods: {fetchMessage() {fetch('/api/hello').then(response => response.text()).then(data => {this.message = data;});}}
}
</script>
部署和運行
后端
  1. 將Spring Boot應用打包成JAR文件:

    mvn clean package
    
  2. 在命令行中運行:

    java -jar backend/target/springboot-vue-0.0.1-SNAPSHOT.jar
    
前端
  1. 在frontend目錄中安裝依賴:

    npm install
    
  2. 啟動開發服務器:

    npm run serve
    
  3. 在瀏覽器中訪問http://localhost:8081,你應該會看到Vue.js應用,點擊按鈕后顯示從后端獲取的數據。

請求處理流程
  1. 客戶端請求:用戶在瀏覽器中輸入URL,例如http://localhost:8081,瀏覽器加載Vue.js應用。
  2. 前端發起API請求:用戶在Vue.js應用中點擊按鈕,Vue.js通過fetch API向后端發起請求http://localhost:8080/api/hello
  3. Spring Boot接收請求:Spring Boot內置的Tomcat服務器接收請求。
  4. 請求解析和路由:Spring Boot使用DispatcherServlet將請求路由到對應的Controller。
  5. Controller處理請求HelloController中的sayHello方法被調用,處理請求并返回數據。
  6. 生成和返回響應:Spring Boot將Controller返回的數據封裝成HTTP響應并返回給前端。
  7. 前端處理響應:Vue.js應用接收響應數據并更新視圖,顯示在頁面上。

現代開發框架的簡化

傳統Java Web開發 vs. 前后端分離開發

  • 傳統Java Web開發:前端頁面和后端代碼緊密耦合,通過模板引擎生成HTML頁面。
  • 前后端分離開發:前端和后端獨立開發和部署,前端通過API與后端交互,前端通常使用現代JavaScript框架如Vue.js,后端使用Spring Boot提供RESTful API。

總結

無論是前后端不分離還是前后端分離,最終目標都是

提供高效、可靠的Web服務。前后端分離架構使得開發更靈活,前后端團隊可以獨立工作,提升開發效率和代碼維護性。通過示例代碼和詳細解釋,希望能幫助你更好地理解這兩種架構模式及其實現方式。如果你有更多的問題或需要更詳細的講解,歡迎留言討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23725.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 命令 `uniq`:去重利器

Linux 命令 uniq&#xff1a;去重利器 在 Linux 系統中&#xff0c;處理文本數據是日常任務中不可或缺的一部分。當我們面對大量重復的數據行時&#xff0c;如何高效地去除這些重復項成為了一個值得探討的話題。這時&#xff0c;uniq 命令就派上了用場。本文將介紹 uniq 命令的…

走進AI大模型的瘦身房,看看如何把大模型塞進我們的手機里

人工智能的廣泛應用已經改變了我們的生活方式。從智能助手到自動駕駛汽車&#xff0c;AI技術正變得越來越普及。然而&#xff0c;這些AI大模型往往參數眾多&#xff0c;體積龐大&#xff0c;需要依賴龐大的網絡計算資源&#xff0c;如何讓大模型能在個人電腦&#xff0c;甚至手…

【docker】 /bin/sh: ./mvnw: No such file or directory解決方案.dockerignore被忽略

報錯如下&#xff1a;解決方案很簡單&#xff0c;但是容易讓大家忽視的問題。 > CACHED [stage-1 2/4] WORKDIR /work/ …

【Android面試八股文】使用equals和==進行比較的區別?

使用equals和==進行比較的區別 這道題想考察什么 ? 在開發中當需要對引用類型和基本數據類型比較時應該怎么做,為什么有區別。 考察的知識點 equals 的實現以及棧和堆的內存管理 考生應該如何回答 在 Java 中,equals() 方法和 == 運算符用于比較對象之間的相等性,但它…

數據賦能(111)——體系:監控數據采集——概述、關注焦點

概述 監控數據采集是指對數據采集過程進行實時的監視和控制&#xff0c;以確保數據的準確性、完整性和可用性。監控數據采集旨在及時發現并解決數據采集過程中出現的問題&#xff0c;保證數據的穩定性和可靠性。 監控數據采集的主要目的是確保數據的準確性、完整性和可用性。…

要改進單例模式的實現以確保線程安全并優化性能,有幾種常見的方法

要改進單例模式的實現以確保線程安全并優化性能&#xff0c;有幾種常見的方法。以下是幾種改進 ThreadUtil 單例實現的方法&#xff1a; ### 1. 懶漢式&#xff08;線程安全版&#xff09; 使用同步機制來確保線程安全&#xff0c;但只在第一次創建實例時同步&#xff0c;這樣…

正則匹配規則

正則表達式&#xff1a;查找某字符串開始和某字符串結束的字符串 a.*?b 查找以a開始&#xff0c;并且以b結束的字符串 例如&#xff1a; 字符串為&#xff1a;上海12345abcd.opi,.<>北京 patten &#xff1a;上海.*?北京 結果&#xff1a;上海12345abcd.opi,.<>…

用互斥鎖解決緩存擊穿

我先說一下正常的業務流程&#xff1a;需要查詢店鋪數據&#xff0c;我們會先從redis中查詢&#xff0c;判斷是否能命中&#xff0c;若命中說明redis中有需要的數據就直接返回&#xff1b;沒有命中就需要去mysql數據庫查詢&#xff0c;在數據庫中查到了就返回數據并把該數據存入…

Unity DOTS技術(三)JobSystem+Burst+批處理

文章目錄 一.傳統方式二.使用JobSystemBurst方式三.批處理 在之前的例子中我們都中用的單線程與傳統的編譯器,下面我們試著使用JobSystem與打找Burst編譯器來對比一下性能的差異. 一.傳統方式 1.首先用傳統方式創建10000個方塊并讓基每幀旋轉 2.我們可以看到他的幀率是40 …

RBAC 模型梳理

1. RBAC 模型是什么 RBAC&#xff08;Role-Based Access Control&#xff09;即&#xff1a;基于角色的權限控制。通過角色關聯用戶&#xff0c;角色關聯權限的方式間接賦予用戶權限。 RBAC 模型由 4 個基礎模型組成&#xff1a; 基本模型 RBAC0&#xff08;Core RBAC&#x…

面向AI應用開發實戰分享 - 基礎篇

“前端轉AI&#xff0c;第一講來了” 引言 如果你是一名前端開發&#xff0c;同時又對AI開發很感興趣&#xff0c;那么恭喜你&#xff0c;機會來了。 如果不是也沒關系&#xff0c;同樣能幫大家了解AI應用的開發思路。 本文將帶大家從面向AI開發的基礎知識開始&#xff0c;再…

Vue3:ElementPlus分裝動態列表查詢表單和彈窗動態表單

文章目錄 概要表單組件封裝彈窗組件調用表單組件頁面列表調用查詢表單 表單組件封裝 組件代碼 <template><el-formref"ruleFormRef"class"elForm":inline"true":rules"rules":model"TableList"label-width"…

AlaSQL.js:用SQL解鎖JavaScript數據操作的魔法

簡介 先附上 github 地址 https://github.com/AlaSQL/alasql AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or …

高德車道級安全預警再升級 10大場景全方位守護行車安全

今日起&#xff0c;2024年高考、端午節小長假相繼到來&#xff0c;正值新一波出行高峰到來&#xff0c;高德地圖車道級安全預警功能再次升級。升級后的車道級安全預警功能覆蓋了10大安全風險較高的行車場景&#xff0c;全方位、超視距地為用戶實時探測、預警行車風險&#xff0…

成都躍享未來教育咨詢有限公司,值得信賴!

在浩渺的教育咨詢市場中&#xff0c;成都躍享未來教育咨詢有限公司以其獨特的魅力和卓越的服務質量&#xff0c;成為了行業內的璀璨明星。作為一家致力于為學生提供全方位教育咨詢服務的公司&#xff0c;成都躍享未來教育咨詢有限公司始終堅持安全可靠的原則&#xff0c;為廣大…

樹莓派4B_OpenCv學習筆記4:測試攝像頭_imread加載顯示圖像_imwrite保存圖片

今日繼續學習樹莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;簡稱RPi或RasPi&#xff09; 本人所用樹莓派4B 裝載的系統與版本如下: 版本可用命令 (lsb_release -a) 查詢: Opencv 版本是4.5.1&#xff1a; 今日對之前的測試CSI攝像頭函數進行一些理解說明&#x…

pytorch中的zero_grad()函數的含義和使用

optimizer.zero_grad() &#xff0c;用于將模型的參數梯度初始化為0。 #反向計算 loss.backward()#反向傳播計算梯度 optimizer.step()#更新參數&#xff0c;梯度被反向計算之后&#xff0c;調用函數進行所有參數更新 #在反向傳播計算時&#xff0c;梯度的計算是累加&#xff…

降噪是什么意思?視頻如何降噪?一文了解全部

在視頻制作的過程中&#xff0c;我們經常會遇到噪音問題&#xff0c;這些噪音可能來自拍攝環境、錄制設備或其他源頭。然而&#xff0c;對于初學者來說&#xff0c;降噪是什么意思&#xff0c;以及如何有效地在視頻中進行降噪可能是一些疑惑的問題。本文將深入解釋降噪的概念&a…

【算法】深入淺出爬山算法:原理、實現與應用

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

echarts學習: 繪制雙y軸折線圖

前言 我們公司項目中的折線圖大都是雙y軸的&#xff0c;因為這些圖表往往需要同時展示水位和流量這兩種不同單位的數據&#xff0c;因此如何繪制雙y軸折線圖就是就是我所面臨的首要問題。 1.如何繪制雙y軸 將yAxis屬性的值設置為一個數組&#xff0c;并在數組中添加兩個axis對…