Spring Boot + Vue先后端分离(四)前端路由

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

本篇文章接着上篇内容继续为你们介绍 前端路由和先后端合并启动,固然先后端合并这种方式不建议在正式部署的时候使用,通常先后端分开部署不一样的服务器,除非非要使用这种方式。php

本文是Spring Boot + Vue先后端分离 系列的第四篇,了解前面的文章有助于更好的理解本文:html


 


 

目录前端

(一).前端路由简介vue

(二).History路由模式
(三).先后端合并启动web

 

前言spring

上一篇你们都学习到了 先后端分离实现 登陆功能,相信对于小伙伴来讲都知道了先后分离的原理,细心的小伙伴可能发现, 上篇文章中的一个 # 号问题,咱们不可能每次浏览器访问打一个#号的,因此本节主要说一下访问#号的处理 和 先后端合并启动,有些小伙伴就说了,不是先后端分离吗?为何还要合并启动呢?这也是让你们明白一下,须要的时候怎么作。vue-router

 

好了,多说无益,咱们开始今天的知识吧!!!npm

 

(一).前端路由简介后端

 

上一章一直有一个bug,不知道小伙伴发现没有,咱们作的页面的 URL 里有一个 # 号,咱们若是不带这个#号访问不正确,这个 # 号有什么含义呢?浏览器

 

 

在使用Vue开发时,通常会用到vue-router来做为前端路由,实现单页应用。vue-router提供了两种模式模拟一个完整的 URL: 

(1)hash模式

(2)history模式。

 

1、hash模式:使用 URL 的 hash 来模拟一个完整的 URL,因而当 URL 改变时,页面不会从新加载。

//例如:查看id为1的文章

 

2、history模式:URL 就像正常的 url,比较好看。

//查看id为1的文章

 

那么 vue-router默认是使用hash模式的,不须要额外的配置,因此在上一章中咱们访问必须带#号才能正常访问,若是咱们想去掉#号须要怎么作呢?

咱们只须要 使用history模式就能够了

 

Vue 已经为咱们提供了两种模式的前端路由,无需咱们本身去实现。

 

实现方式以下:

前端:vue-router的mode: ‘history’

 

(二).History路由模式


若是要去掉#号,首先咱们把 Vue 中配置的路由从默认的 hash 模式切换为 histroy 模式。打开咱们的前端项目,修改文件 router\index.js,加入 mode: 'history 这句话。总体代码以下:

 

  •  
import Vue from 'vue'import Router from 'vue-router'// 导入刚才编写的组件import HomePage from '@/components/home/HomePage'import Login from '@/components/Login'
Vue.use(Router)
export default new Router({mode: 'history',routes: [// 下面都是固定的写法{path: '/login',name: 'Login',component: Login},{path: '/index',name: 'HomePage',component: HomePage}]})

很简单,就是添加一行代码:mode: 'history',

添加后运行项目,这时候访问就不用添加 # 号了  http://localhost:8080/login ,好了,成功加载页面。

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

(三).先后端合并启动

 

这里再说一下,咱们的项目是先后端分离,这是肯定的,可是咱们本身在使用的时候能够合并在一块儿启动,部署,可是正式使用须要部署不一样的服务。

 

那么怎么操做呢?

首先咱们要把前端打包后的资源文件 放在后端。这不是先后端分离项目推荐的作法,应该把先后端分别部署在不一样的服务器中,但实际上仍有很多项目会选择把先后端整合在一块儿,只使用一个服务器,因此这里咱们也说起一下这种方式,但在以后的开发中不会这样部署。

 

执行命令行:
cnpm run build

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

成功后会显示以下效果:

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

成功后查看项目 会多一个 dist的目录

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

dist 文件夹下生成了两个文件 static 文件夹和 index.html 文件,把这两个文件,拷贝到咱们后端项目的 \src\main\resources\static 文件夹下,必定要注意这个位置,这时后端配置的静态文件的 path,这里通常都不做修改。

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

添加好之后咱们开心的去运行项目,浏览器访问项目,结果仍是不行

在咱们访问 http://localhost:8082/index.html ,(注意输入后缀 .html)发现页面是空白的,但确实取到了这个页面,再访问 http://localhost:8082/login ,发现跳转到了错误页面(White Error Page)。

 

为何会进入错误页面呢?明明有登陆这个操做的。这个错误是找不到的错误页面.

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

回顾一下单页面应用的概念,在咱们这个项目中,其实只有 index.html 这一个页面,全部的其它内容都是在这个页面里动态渲染的。当咱们直接在后端访问 /login 路径时,服务器后端并无这个路径对应的内容,因此返回了 Error Page。

 

为了获取到咱们须要的内容,咱们要想办法触发前端路由,即在后端添加处理内容,把 经过这个 URL 渲染出的 index.html 返回到浏览器。

 

功能实现以下:

在后端项目中新建一个 包名为 error 的目录,添加实现 ErrorPageRegistrar 接口的类 ErrorConfig,把默认的错误页面设置为 /index.html

 

  •  
package com.cxzc.mycxzc.demo.error;
import org.springframework.boot.web.server.ErrorPageRegistrar;import org.springframework.boot.web.server.ErrorPage;import org.springframework.boot.web.server.ErrorPageRegistry;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;
@Componentpublic class ErrorConfig implements ErrorPageRegistrar {
@Overridepublic void registerErrorPages(ErrorPageRegistry registry) {ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");registry.addErrorPages(error404Page);}
}

 

 

这时,再次访问路径 :http://localhost:8082/login  成功进入登陆页面。

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

 

好了,经过合并先后端启动项目 到这里就ok了,敬请期待下篇。。。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=                                                                              
相关文章
相关标签/搜索