美文网首页Java 杂谈扣丁学堂Java培训
扣丁学堂Java开发SpringBoot与Vue.js整合基本流

扣丁学堂Java开发SpringBoot与Vue.js整合基本流

作者: 994d14631d16 | 来源:发表于2018-09-18 13:23 被阅读0次

      今天扣丁学堂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-groupid="exampleInputGroup1"

      label="Username:"

      label-for="exampleInput1">

      <b-form-inputid="exampleInput1"

      type="text"

      v-model="form.username"

      required

      placeholder="Enterusername">

      </b-form-input>

      </b-form-group>

      <b-form-groupid="exampleInputGroup2"

      label="Password:"

      label-for="exampleInput2">

      <b-form-inputid="exampleInput2"

      type="text"

      v-model="form.password"

      required

      placeholder="Enterpassword">

      </b-form-input>

      </b-form-group>

      <b-form-groupid="exampleGroup4">

      <b-form-checkbox-groupv-model="form.checked"id="exampleChecks">

      <b-form-checkboxvalue="me">Checkmeout</b-form-checkbox>

      <b-form-checkboxvalue="that">Checkthatout</b-form-checkbox>

      </b-form-checkbox-group>

      </b-form-group>

      <b-buttontype="submit"variant="primary">Submit</b-button>

      <b-buttontype="reset"variant="danger">Reset</b-button>

      </b-form>

      </div>

      </template>

      <script>

      //...

      </script>

      我现在想实现的就是用户登录成功之后导航到另一个组件,所以我就又写了一个欢迎组件:

      <template>

      <div>

      <h1>Welcome!</h1>

      </div>

      </template>

      记得配置路由:

      //src/router/index.js

      importVuefrom'vue'

      importRouterfrom'vue-router'

      importLoginfrom'@/components/Login.vue'

      importInformationfrom'@/components/Information.vue'

      Vue.use(Router)

      exportdefaultnewRouter({

      routes:[

      {

      path:'/',

      name:'Login',

      component:Login

      },

      {

      path:'/information',

      name:'Information',

      component:Information

      }

      ]

      })

      后端:提供RESTfulAPI

      因为只有后端提供了接口,前端才能调用,所以现在要进行后端开发。RESTful是现在很流行的API设计风格,所以我这里也实践了一下。下面是controller的代码,完整源码地址附在文末。

      @RestController

      @RequestMapping("/api")

      publicclassLoginController{

      @RequestMapping(path="/login",method=RequestMethod.POST)

      @ResponseBody

      publicStringlogin(@RequestParamStringusername,

      @RequestParamStringpassword){

      //简单处理一下,实际开发中肯定是要用到数据库的

      if(username.equals("123")&&password.equals("123")){

      return"successful";

      }else{

      return"failed";

      }

      }

      }

      后端的API现在有了,就差前端调用了。但是没这么简单,接下来就要解决我前面提到的问题。

      实现CORS

      在这个Demo中前端占用的端口是8080,后端是8088。这就存在跨域的问题,如果不解决的话后端就没法接收前端的请求。

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

      @Configuration

      publicclassCORSConfigimplementsWebMvcConfigurer{

      @Override

      publicvoidaddCorsMappings(CorsRegistryregistry){

      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>

      exportdefault{

      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)=>{

      varstatus=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()">Getyourinformation</b-button>

      <h2v-if="username!==''">Yourusernameis:{{username}}</h2>

      <h2v-if="email!==''">Youremailis:{{email}}</h2>

      </div>

      </div>

      </template>

      <script>

      importaxiosfrom'axios'

      exportdefault{

      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:Cannotsetproperty'username'ofundefined

      搞了很久都没有解决,直到看到这篇文章,才明白原来是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保存在一个变量就行了:

      varvue=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开发SpringBoot与Vue.js整合基本流

        本文链接:https://www.haomeiwen.com/subject/pwuunftx.html