最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 與 Vue.js 整合流程

 更新時(shí)間:2018年09月17日 17:05:23   作者:臨江聽(tīng)雨客  
本文重點(diǎn)介紹我在Spring Boot 與 Vue.js 整合實(shí)踐過(guò)程中的基本流程,以及遇到的問(wèn)題,感興趣的朋友跟隨小編一起看看吧

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

本文重點(diǎn)介紹我在實(shí)踐過(guò)程中的基本流程,以及我遇到的一個(gè)困擾了我好久的問(wèn)題,就是如何 CORS。

框架版本

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

基本流程

前端:編寫 Vue 組件

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

  • axios:負(fù)責(zé) HTTP 請(qǐng)求
  • bootstrap-vue:Bootstrap 和 Vue.js 的整合,方便設(shè)計(jì)頁(yè)面
  • vue-router:管理路由
  • qs:實(shí)現(xiàn) CORS

然后寫一個(gè)登錄組件:

<!-- 下面是我直接從 bootstrap-vue 文檔抄下來(lái)的模板 -->
<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>

我現(xiàn)在想實(shí)現(xiàn)的就是用戶登錄成功之后導(dǎo)航到另一個(gè)組件,所以我就又寫了一個(gè)歡迎組件:

<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

因?yàn)橹挥泻蠖颂峁┝私涌?,前端才能調(diào)用,所以現(xiàn)在要進(jìn)行后端開發(fā)。RESTful 是現(xiàn)在很流行的 API 設(shè)計(jì)風(fēng)格,所以我這里也實(shí)踐了一下。下面是 controller 的代碼,完整源碼地址附在文末。

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

后端的 API 現(xiàn)在有了,就差前端調(diào)用了。但是沒(méi)這么簡(jiǎn)單,接下來(lái)就要解決我前面提到的問(wèn)題。

實(shí)現(xiàn) CORS

在這個(gè) Demo 中前端占用的端口是8080,后端是 8088。這就存在跨域的問(wèn)題,如果不解決的話后端就沒(méi)法接收前端的請(qǐng)求。

我參考了 這個(gè)例子 ,通過(guò)配置 Spring MVC 實(shí)現(xiàn)了 CORS:

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

后端配置好了還不行,前端也要有一些配置,要用 axios 順利地發(fā)送請(qǐng)求并保證后端能接收到,需要對(duì)請(qǐng)求參數(shù)做處理。我參考 這個(gè)回答 用 qs 庫(kù)對(duì)請(qǐng)求參數(shù)做了處理:

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

現(xiàn)在只需完善前端調(diào)用后端 API 的代碼:

// Login.vue
<script>
export default {
 data () {
 return {
  form: {
  username: '',
  password: '',
  checked: []
  },
  show: true
 }
 },
 methods: {
 onSubmit (evt) {
  evt.preventDefault();
  
  // 關(guān)鍵就在于要對(duì)參數(shù)進(jìn)行處理
  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>

至此,終于實(shí)現(xiàn)了前后端的分離,并且保證前后端能夠順利交互。

題外話

讓 controller 能獲取請(qǐng)求參數(shù)

  controller 可能無(wú)法獲取請(qǐng)求參數(shù), 這篇文章 提供了一種解決方案。我這個(gè) Demo 中并沒(méi)有出現(xiàn) controller 收不到請(qǐng)求參數(shù)的問(wèn)題,但也把這個(gè)問(wèn)題記錄下來(lái),以后可能遇上也說(shuō)不準(zhǔn)。

axios 方法中的 this

我這個(gè) Demo 中還試著用 axios 發(fā) GET 請(qǐng)求,然后獲取后端響應(yīng)的 JSON 數(shù)據(jù)。

// 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>

一開始我是這么寫的,乍一看沒(méi)什么問(wèn)題,但是 JavaScript 就一直報(bào)錯(cuò):

typeError: Cannot set property 'username' of undefined

搞了很久都沒(méi)有解決,直到看到 這篇文章 ,才明白原來(lái)是 this 作用域的問(wèn)題(JavaScript 的 this 是真的復(fù)雜?。。。。8某上旅孢@樣就沒(méi)問(wèn)題了:

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);
   });

后來(lái) Stack Overflow 上有人說(shuō)不用箭頭函數(shù)也行,只需提前把指向 Vue 實(shí)例的 this 保存在一個(gè)變量就行了:

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);
   });

經(jīng)實(shí)踐,這樣也是可以的。

Demo 完整源碼

總結(jié)

以上所述是小編給大家介紹的Spring Boot 與 Vue.js 整合流程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java橋梁設(shè)計(jì)模式優(yōu)雅地將抽象與實(shí)現(xiàn)分離

    Java橋梁設(shè)計(jì)模式優(yōu)雅地將抽象與實(shí)現(xiàn)分離

    Java橋接設(shè)計(jì)模式通過(guò)將抽象和實(shí)現(xiàn)分離,使得它們可以獨(dú)立地變化,從而實(shí)現(xiàn)更靈活的代碼結(jié)構(gòu)。它是一種優(yōu)雅的設(shè)計(jì)模式,適用于需要處理多個(gè)變化因素的復(fù)雜應(yīng)用程序
    2023-04-04
  • Java中自定義類的實(shí)現(xiàn)詳解

    Java中自定義類的實(shí)現(xiàn)詳解

    自定義類是Java中最基本、也是最重要的組成部分之一,使用者可以根據(jù)需求創(chuàng)建自己的數(shù)據(jù)類型,從而更加高效地構(gòu)建程序,本文就來(lái)為大家詳細(xì)講講Java中自定義類的實(shí)現(xiàn)與使用吧
    2023-05-05
  • IDEA不能生成SerialVersionUID,alt+enter不提示沒(méi)有效果問(wèn)題

    IDEA不能生成SerialVersionUID,alt+enter不提示沒(méi)有效果問(wèn)題

    文章介紹了在使用IntelliJ IDEA時(shí),通過(guò)安裝AutoFillingJavaCallArguments插件并導(dǎo)入Serializable接口后,遇到無(wú)法自動(dòng)生成序列ID的問(wèn)題,解決方法是在設(shè)置中搜索serial,勾選“不帶'serialVersionUID'的可序列化類”選項(xiàng)
    2025-01-01
  • jenkins如何通過(guò)pipeline部署springboot項(xiàng)目

    jenkins如何通過(guò)pipeline部署springboot項(xiàng)目

    為了提高SpringBoot項(xiàng)目的部署效率和規(guī)范性,建議將項(xiàng)目代碼和部署腳本分離,項(xiàng)目代碼倉(cāng)庫(kù)專注業(yè)務(wù)邏輯,構(gòu)建為jar包;另外設(shè)立獨(dú)立代碼倉(cāng)庫(kù)存放Jenkinsfile等部署配置文件,在Jenkins中配置pipeline,自動(dòng)拉取項(xiàng)目代碼進(jìn)行構(gòu)建和部署
    2024-09-09
  • 詳解Java中類與對(duì)象的關(guān)系

    詳解Java中類與對(duì)象的關(guān)系

    這篇文章主要介紹了詳解Java中類與對(duì)象的關(guān)系,類的關(guān)鍵字是class,在Java編程里,類的作用相當(dāng)于機(jī)械師手中的構(gòu)造圖,如果沒(méi)有構(gòu)造圖,就無(wú)法打造武器,同樣如果沒(méi)有類,就無(wú)法實(shí)例化,需要的朋友可以參考下
    2023-05-05
  • Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實(shí)現(xiàn)

    Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實(shí)現(xiàn)

    這篇文章主要介紹了Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java基礎(chǔ)之初識(shí)Maven

    Java基礎(chǔ)之初識(shí)Maven

    這篇文章主要介紹了Java基礎(chǔ)之初識(shí)Maven,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    在現(xiàn)代信息化的社會(huì)中,PDF文件已經(jīng)成為一種非常常見(jiàn)的文檔格式,本文將詳細(xì)介紹如何使用Java實(shí)現(xiàn)PDF文字識(shí)別,包括所需的工具、庫(kù)、代碼實(shí)現(xiàn)以及實(shí)際應(yīng)用中的注意事項(xiàng),需要的朋友可以參考下
    2025-02-02
  • Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展史

    Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展史

    這篇文章主要介紹了Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展簡(jiǎn)史,Java源自Sun公司的一個(gè)叫Green的項(xiàng)目,其原先的目的是為家用電子消費(fèi)產(chǎn)品開發(fā)一個(gè)分布式代碼系統(tǒng),這樣就可以將通信和控制信息發(fā)給電冰箱、電視機(jī)、烤面包機(jī)等家用電器,對(duì)它們進(jìn)行控制和信息交流,需要的朋友可以參考一下
    2022-01-01
  • Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    這篇文章主要介紹了Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例,PriorityQueue是一種特殊的隊(duì)列,滿足隊(duì)列的“隊(duì)尾進(jìn)、隊(duì)頭出”條件,但是每次插入或刪除元素后,都對(duì)隊(duì)列進(jìn)行調(diào)整,使得隊(duì)列始終構(gòu)成最小堆(或最大堆),需要的朋友可以參考下
    2023-09-09

最新評(píng)論

宜春市| 景德镇市| 浦东新区| 南郑县| 郴州市| 天台县| 石城县| 抚松县| 满城县| 壤塘县| 衡山县| 大连市| 新干县| 京山县| 新乡县| 工布江达县| 遵义市| 丹东市| 左权县| 贵溪市| 霍邱县| 武冈市| 舒兰市| 淮安市| 瑞金市| 桦川县| 张北县| 铜川市| 苍南县| 浦城县| 特克斯县| 桐庐县| 黄陵县| 都安| 鹰潭市| 潞城市| 三穗县| 宾阳县| 炎陵县| 博爱县| 岑巩县|