扣丁学堂Java开发培训之SpringBoot与Vue.js整合流程及问题答疑

2018-09-18 13:28:21 631浏览

今天扣丁学堂Java培训老师给大家介绍一下关于SpringBoot与Vue.js整合实践过程中的基本流程及遇到问题解答,Java开发SpringBoot后端;前端使用Vue.js这个轻量、易上手的框架。下面我们一起来看一下吧。



框架版本

SpringBoot: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>

记得配置路由:

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

后端:提供RESTfulAPI

因为只有后端提供了接口,前端才能调用,所以现在要进行后端开发。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。这就存在跨域的问题,如果不解决的话后端就没法接收前端的请求。

我参考了这个例子,通过配置SpringMVC实现了CORS:

@Configuration
public 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);
   });

后来StackOverflow上有人说不用箭头函数也行,只需提前把指向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);
   });

以上所述是扣丁学堂Java开发SpringBoot与Vue.js整合基本流程及遇到问题答疑的详细介绍,希望对大家有所帮助,扣丁学堂不仅有专业的Java培训班供大家学习,还有与时俱进的课程体系和大量的Java视频教程让学员免费观看学习,想要学好Java开发的小伙伴快到扣丁学堂来了解详情吧。扣丁学堂Java技术交流群:670348138。

扣丁学堂微信公众号

【关注微信公众号获取更多学习资料】



查看更多关于“Java开发资讯”的相关文章>>

标签: Java培训 Java视频教程 Java多线程 Java面试题 Java学习视频 Java开发

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号