前后端不分离与前后端分离的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.mzph.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对…