亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Boot 與 Vue.js 整合流程

2024-07-14 08:42:21
字體:
來源:轉載
供稿:網友

一直都想嘗試做前后端分離,我之前一直是學 Java 的,所以后端選擇了 Spring Boot;前端選擇了 Vue.js 這個輕量、易上手的框架。網上其實已經有了不少 Spring Boot 和 Vue.js 整合的資料,Github 上就有好多 repo,但是每當我指望按圖索驥的時候就會出現各種各樣奇怪的 bug,上 Stack Overflow 問了也沒人搭理。前前后后研究了差不多三個星期,現在總算是理清楚了。

本文重點介紹我在實踐過程中的基本流程,以及我遇到的一個困擾了我好久的問題,就是如何 CORS。

框架版本

  • Spring Boot: 2.0.4.RELEASE(JDK 是1.8)
  • Vue.js: 2.x

基本流程

前端:編寫 Vue 組件

首先用 vue-cli 搭好腳手架,我這個 Demo 用到的第三方庫有:

  • axios:負責 HTTP 請求
  • bootstrap-vue:Bootstrap 和 Vue.js 的整合,方便設計頁面
  • vue-router:管理路由
  • qs:實現 CORS

然后寫一個登錄組件:

<!-- 下面是我直接從 bootstrap-vue 文檔抄下來的模板 --><template> <div> <b-form @submit="onSubmit" @reset="onReset" v-if="show">  <b-form-group id="exampleInputGroup1"     label="Username:"     label-for="exampleInput1">  <b-form-input id="exampleInput1"      type="text"      v-model="form.username"      required      placeholder="Enter username">  </b-form-input>  </b-form-group>  <b-form-group id="exampleInputGroup2"     label="Password:"     label-for="exampleInput2">  <b-form-input id="exampleInput2"      type="text"      v-model="form.password"      required      placeholder="Enter password">  </b-form-input>  </b-form-group>  <b-form-group id="exampleGroup4">  <b-form-checkbox-group v-model="form.checked" id="exampleChecks">   <b-form-checkbox value="me">Check me out</b-form-checkbox>   <b-form-checkbox value="that">Check that out</b-form-checkbox>  </b-form-checkbox-group>  </b-form-group>  <b-button type="submit" variant="primary">Submit</b-button>  <b-button type="reset" variant="danger">Reset</b-button> </b-form> </div></template><script>//...</script>

我現在想實現的就是用戶登錄成功之后導航到另一個組件,所以我就又寫了一個歡迎組件:

<template> <div>  <h1>Welcome!</h1> </div></template>

記得配置路由:

// src/router/index.js

import Vue from 'vue'import Router from 'vue-router'import Login from '@/components/Login.vue'import Information from '@/components/Information.vue'Vue.use(Router)export default new Router({ routes: [ {  path: '/',  name: 'Login',  component: Login }, {  path: '/information',  name: 'Information',  component: Information } ]})

后端:提供 RESTful API

因為只有后端提供了接口,前端才能調用,所以現在要進行后端開發。RESTful 是現在很流行的 API 設計風格,所以我這里也實踐了一下。下面是 controller 的代碼,完整源碼地址附在文末。

@RestController@RequestMapping("/api")public class LoginController { @RequestMapping(path = "/login", method = RequestMethod.POST) @ResponseBody public String login(@RequestParam String username,      @RequestParam String password) {  // 簡單處理一下,實際開發中肯定是要用到數據庫的  if (username.equals("123") && password.equals("123")) {   return "successful";  } else {   return "failed";  } }}

后端的 API 現在有了,就差前端調用了。但是沒這么簡單,接下來就要解決我前面提到的問題。

實現 CORS

在這個 Demo 中前端占用的端口是8080,后端是 8088。這就存在跨域的問題,如果不解決的話后端就沒法接收前端的請求。

我參考了 這個例子 ,通過配置 Spring MVC 實現了 CORS:

@Configurationpublic class CORSConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) {  registry.addMapping("/**")    .allowedOrigins(ALL)    .allowedMethods(ALL)    .allowedHeaders(ALL)    .allowCredentials(true); }}

后端配置好了還不行,前端也要有一些配置,要用 axios 順利地發送請求并保證后端能接收到,需要對請求參數做處理。我參考 這個回答 用 qs 庫對請求參數做了處理:

qs.stringify({  'username': this.form.username,  'password': this.form.password  })

現在只需完善前端調用后端 API 的代碼:

// Login.vue<script>export default { data () { return {  form: {  username: '',  password: '',  checked: []  },  show: true } }, methods: { onSubmit (evt) {  evt.preventDefault();    // 關鍵就在于要對參數進行處理  axios.post('http://localhost:8088/api/login',qs.stringify({  'username': this.form.username,  'password': this.form.password  })).then((response) => {  var status = response.data;  if(status === 'successful') {   this.$router.push('/information');  } else {   alert(response.data.message);  }  console.log(response);  }).catch((error) => {  console.log(response);  }); } }}</script>

至此,終于實現了前后端的分離,并且保證前后端能夠順利交互。

題外話

讓 controller 能獲取請求參數

  controller 可能無法獲取請求參數, 這篇文章 提供了一種解決方案。我這個 Demo 中并沒有出現 controller 收不到請求參數的問題,但也把這個問題記錄下來,以后可能遇上也說不準。

axios 方法中的 this

我這個 Demo 中還試著用 axios 發 GET 請求,然后獲取后端響應的 JSON 數據。

// Information.vue<template> <div>  <h1>Welcome!</h1>  <div>   <b-button @click="getInfo()">Get your information</b-button>   <h2 v-if="username !== ''">Your username is: {{ username }}</h2>   <h2 v-if="email !== ''">Your email is: {{ email }}</h2>  </div> </div></template><script>
import axios from 'axios'export default { data () {  return {   username: '',   email: ''  }; }, methods: {  getInfo () {   axios.get('http://localhost:8088/api/information')   .then(function(response) {    this.username = response.data['username'];    this.email = response.data['email'];    console.log(response);   }).catch(function(error) {    console.log(error);   });  } }}</script>

一開始我是這么寫的,乍一看沒什么問題,但是 JavaScript 就一直報錯:

typeError: Cannot set property 'username' of undefined

搞了很久都沒有解決,直到看到 這篇文章 ,才明白原來是 this 作用域的問題(JavaScript 的 this 是真的復雜?。。。。?。改成下面這樣就沒問題了:

axios.get('http://localhost:8088/api/information')   .then((response) => {    this.username = response.data['username'];    this.email = response.data['email'];    console.log(response);   }).catch((error) => {    console.log(error);   });

后來 Stack Overflow 上有人說不用箭頭函數也行,只需提前把指向 Vue 實例的 this 保存在一個變量就行了:

var vue = this;   axios.get('http://localhost:8088/api/information')   .then(function (response) {    vue.username = response.data['username'];    vue.email = response.data['email'];    console.log(response);   }).catch((error) => {    console.log(error);   });

經實踐,這樣也是可以的。

Demo 完整源碼

總結

以上所述是小編給大家介紹的Spring Boot 與 Vue.js 整合流程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国自产精品手机在线观看视频| 亚洲欧美国产制服动漫| 一区二区在线免费视频| 国产精品v片在线观看不卡| 色综合久久天天综线观看| 精品一区二区三区三区| 亚洲影院高清在线| 国产午夜精品全部视频播放| 亚洲久久久久久久久久| 亚洲精品成人久久电影| 国产精品中文字幕在线| 欧美国产亚洲视频| 日韩视频中文字幕| 欧美亚洲视频在线观看| 欧美极品xxxx| 91色视频在线观看| 亚洲午夜未满十八勿入免费观看全集| 91产国在线观看动作片喷水| 国产精品女人网站| 国内精品视频一区| 欧美性生交xxxxx久久久| 国产精品视频男人的天堂| 青青久久aⅴ北条麻妃| 亚洲精品电影久久久| 日韩在线中文字| 色综合天天狠天天透天天伊人| 亚洲精品99久久久久| 日本亚洲欧美三级| 欧美性视频精品| 日韩欧美在线字幕| 亚洲激情视频在线| 欧美午夜视频在线观看| 亚洲精品理论电影| 欧美日韩国产中文精品字幕自在自线| 亚洲电影免费观看高清完整版在线观看| 亚洲一级片在线看| zzjj国产精品一区二区| 欧美男插女视频| 亚洲白虎美女被爆操| 国产成人精品一区二区三区| 69av在线视频| 亚洲国产高清高潮精品美女| 国产精品自产拍在线观看| 国产精品老女人精品视频| 国产精品久在线观看| 久久亚洲欧美日韩精品专区| 亚洲自拍av在线| 欧美性xxxxxxx| 国产精品视频一区国模私拍| 国产欧美精品日韩精品| 欧美黑人xxxx| 久久久久久久久综合| 51久久精品夜色国产麻豆| 亚洲性av网站| 久久久亚洲天堂| 国产精品久久久久久久久久99| 欧美影院成年免费版| 成人日韩在线电影| 久久青草福利网站| 亚洲性av在线| 国产精品美女久久久久久免费| 亚洲欧美激情四射在线日| 日韩欧美高清在线视频| 国产91色在线|| 91麻豆桃色免费看| 日韩有码视频在线| 欧洲s码亚洲m码精品一区| 97不卡在线视频| 欧美xxxx做受欧美.88| 日韩精品一二三四区| 色诱女教师一区二区三区| 97av在线视频免费播放| 国产精品久久久av| 81精品国产乱码久久久久久| 国产精品三级美女白浆呻吟| 欧美插天视频在线播放| 亚洲精品乱码久久久久久金桔影视| 国产一区二区三区在线| 久久精品国产一区二区电影| 91欧美精品成人综合在线观看| 欧美日韩免费看| 亚洲精品电影在线观看| 日韩av在线网| 国内精品久久久久久影视8| 欧美巨乳在线观看| 91精品视频在线| 亚洲一二三在线| 国产精品a久久久久久| 欧美日韩aaaa| 热re91久久精品国99热蜜臀| 国产成人极品视频| 亚洲欧美激情精品一区二区| 大荫蒂欧美视频另类xxxx| 日韩欧美综合在线视频| 欧美午夜激情在线| 日韩性生活视频| 久久久国产一区二区| 欧美一级免费视频| 日韩精品免费在线视频观看| 亚洲新声在线观看| 91精品在线观看视频| 精品偷拍各种wc美女嘘嘘| 成人免费视频a| 日韩中文字幕国产精品| 欧美限制级电影在线观看| 成人伊人精品色xxxx视频| 欧美精品久久久久久久免费观看| 国产欧美日韩中文| 欧美电影免费播放| 亚洲精品短视频| 91久久嫩草影院一区二区| 亚洲精品v天堂中文字幕| 性欧美长视频免费观看不卡| 亚洲成人免费网站| 欧美精品videosex极品1| 91精品国产91久久久久久吃药| 亚洲free性xxxx护士hd| 欧美超级免费视 在线| 欧美极品美女电影一区| 国产视频精品免费播放| 国产精品色婷婷视频| 亚洲国产成人精品久久久国产成人一区| 日韩欧美在线免费观看| 97av在线视频免费播放| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区三区18| 欧美日在线观看| 在线观看国产成人av片| 91免费精品国偷自产在线| 97久久精品国产| 奇米成人av国产一区二区三区| 中文在线资源观看视频网站免费不卡| 奇米影视亚洲狠狠色| 亚洲图片在区色| 欧美另类xxx| 国模极品一区二区三区| 亚洲国产精品久久| 中国日韩欧美久久久久久久久| 91在线视频九色| 色妞一区二区三区| 欧美裸体xxxx极品少妇| 中文字幕av一区中文字幕天堂| 国产精品久久久久久一区二区| 欧美日韩激情网| 久久久伊人欧美| 日韩高清中文字幕| 欧美成人在线免费视频| 日韩资源在线观看| 久久久精品2019中文字幕神马| 伊人久久免费视频| 在线观看视频亚洲| 国产97色在线|日韩| 国产亚洲精品一区二区| 97国产在线观看| 日韩视频在线免费观看| 国产成人jvid在线播放| 在线一区二区日韩| 国产精品高清在线观看| 国产精品日韩在线一区| 97视频在线观看网址| 精品福利樱桃av导航| 伦理中文字幕亚洲| 国产精品视频久久久久| 91精品久久久久久久久久久久久久|