SpringBoot + Vue + 模板引擎整合实践 - 指南

目录

一、项目结构与依赖

1.1 项目结构

1.2 Maven核心依赖

1.3 配置文件

二、SpringBoot + Thymeleaf

2.1 控制器代码(StuController.java)

2.2 Thymeleaf 模板(demo1.html)

2.3 访问效果

三、SpringBoot + Freemarker

3.1 控制器代码(EmpController.java)

3.2 Freemarker 模板(chapter1.ftl)

3.3 访问效果

四、SpringBoot + Vue 与 MVVM、axios

4.1 MVVM 思想

4.2 Vue 页面(view1.html)

4.3 控制器代码(DataController.java)

4.4 axios 与 this 指向

五、项目总结


        在 Java 后端开发中,SpringBoot 凭借其便捷性成为主流框架,同时它支持多种视图技术(如 Thymeleaf、Freemarker),还能与 Vue 这类前端框架无缝整合。本篇博客将围绕 SpringBoot + ThymeleafSpringBoot + Freemarker 以及 SpringBoot + Vue 这几种技术组合展开,同时深入探讨 MVVM 思想axios 以及 JavaScript 中 this 指向等关键知识点。

一、项目结构与依赖

1.1 项目结构

项目采用典型的 SpringBoot 项目结构:

  • src/main/java:存放 Java 代码,包含多个控制器类(如 DataControllerEmpController 等)以及启动类 SpringBootVueApplication

  • src/main/resources

  • static:存放静态资源,如图片 a1.jpg

  • templates:存放视图模板,包含 Thymeleaf 模板(如 demo1.html)和 Freemarker 模板(如 chapter1.ftl)。

  • application.properties:SpringBoot 配置文件。

  • pom.xml:管理项目依赖。

1.2 Maven核心依赖

在 pom.xml 中,引入了关键依赖:

  • spring-boot-starter-web:SpringBoot Web 开发核心依赖。

  • spring-boot-starter-thymeleaf:Thymeleaf 视图模板依赖。

  • spring-boot-starter-freemarker:Freemarker 视图模板依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
</dependencies>

1.3 配置文件

application.properties中:

        配置Web访问端口和 Freemarker 模板的缓存、字符集、后缀以及模板加载路径等信息,让 SpringBoot 能正确识别和加载 Freemarker 模板。

# 应用服务 WEB 访问端口
server.port=8050
spring.application.name=springbootvue

# Freemarker 配置
#是否开启缓存
spring.freemarker.cache=false
#模板文件编码
spring.freemarker.charset=UTF-8
#是否检查模板位置
spring.freemarker.check-template-location=true
#Content-Type的值
spring.freemarker.content-type=text/html
#模板文件后缀
spring.freemarker.suffix=.ftl
#模板文件位置
spring.freemarker.template-loader-path=classpath:/templates/

二、SpringBoot + Thymeleaf

2.1 控制器代码(StuController.java)

  • @Controller标识该类为控制器处理 Web 请求

  • @RequestMapping("/stus")定义控制器的基础访问路径

  • loadData1 方法处理 /stus/loaddata1 请求,创建 ModelAndView 对象,设置视图名为 demo1(Thymeleaf 模板),并添加数据(msglistkeyimgpath)供模板渲染。

package com.pp.springbootvue.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.List;
@Controller
@RequestMapping("/stus")
public class StuController {
    @RequestMapping("/loaddata1")
    public ModelAndView  loadData1()
    {
        System.out.println("StuController  is loadData1  start... ");
        // 创建 ModelAndView 对象
        ModelAndView  mav   = new ModelAndView();
        mav.setViewName("demo1");   // 对应demo1.html,设置视图名为 demo1(Thymeleaf 模板)
        mav.addObject("msg","喵喵咪");
        List lists  = new ArrayList();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        mav.addObject("listkey",lists);
        mav.addObject("imgpath","https://tse3-mm.cn.bing.net/th/id/OIP-C.tZUyXnE2DA_qqCkDAZZJgQAAAA?w=208&h=367&c=7&r=0&o=7&cb=12&dpr=1.3&pid=1.7&rm=3");
        return mav;
    }
}

2.2 Thymeleaf 模板(demo1.html)

  • th:text="${msg}":使用 Thymeleaf 表达式,将控制器传递的 msg 数据渲染到 <div> 标签中。

  • th:each="item:${listkey}":遍历 listkey 集合,th:text="${item}"将集合中的每个元素渲染到 <td> 标签。

  • th:src="${imgpath}":设置图片的 src 属性为控制器传递的 imgpath 地址。




  
  Title


2.3 访问效果

        访问 http://localhost:8050/stus/loaddata1,Thymeleaf 模板会将控制器传递的数据渲染成 HTML 页面,展示文本、表格和图片内容。

三、SpringBoot + Freemarker

3.1 控制器代码(EmpController.java)

  • 类似 Thymeleaf 控制器,load1 方法处理请求,设置 Freemarker 视图 chapter1,并传递数据 name

package com.pp.springbootvue.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/emps")
public class EmpController {
    @RequestMapping("/load1")
    public ModelAndView  load1()
    {
        System.out.println("EmpController  is load1  start... ");
        ModelAndView  mav  =  new ModelAndView();
        mav.setViewName("chapter1"); // 对应chapter1.ftl
        mav.addObject("name","相信相信的力量");
        return mav;
    }
}

3.2 Freemarker 模板(chapter1.ftl)

  • 使用 Freemarker 简单的${name} 表达式,将控制器传递的 name 数据渲染到页面。




    
    Title


${name}欢迎访问

3.3 访问效果

        访问 http://localhost:8050/emps/load1,Freemarker 模板会渲染出“相信相信的力量”的文本内容。

四、SpringBoot + Vue 与 MVVM、axios

4.1 MVVM 思想

MVVM(Model-View-ViewModel)是一种软件架构模式。在 Vue 中:

  • Model数据模型,对应 Vue 实例的data 属性,如 messageimgpath 等数据。

  • View视图,即 HTML 页面,包含各种标签和 Vue 指令(如 v-bindv-for 等)。

  • ViewModel视图模型,是 Vue 实例本身,它是连接 Model 和 View的桥梁,实现数据的双向绑定。当 Model 数据变化时,View 会自动更新;反之,View 上的操作也会同步到 Model 中。

4.2 Vue 页面(view1.html)

  • 通过<script> 引入 Vue 库,创建 Vue 实例,el 指定挂载的 DOM 元素#app)。

  • data 中定义数据模型{{item}}v-on 等实现数据到视图的绑定。




  
  Title
  <script  type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  <script  type="text/javascript" src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>


这是Vue的初始化的页面

  • {{item}}
<script type="text/javascript"> //MVVM: M:data:{},V:html视图+Vue指令 VM:虚拟DOM,基于面向对象底层解析 let vue =new Vue({ el:"#app", data:{ lists:[] }, methods:{ // clickdata:function(){ // console.log("按钮被点击"); // let that = this; // axios.get("/loaddataone").then(function(resp){ 匿名函数的“this"指的是window窗口对象,“that"指的是vue对象 // // console.log(JSON.stringify(resp)); // let resultData = resp.data; // console.log(resultData); // console.log(this); // console.log(that); // that.lists = resultData; // // }); //} clickdata:function() { console.log(this); axios.get("/loaddataone").then((resp)=>{ // 箭头函数的“this"指的是vue对象 console.log(JSON.stringify(resp)); console.log(this); this.lists = resp.data; }); } } }); </script>

4.3 控制器代码(DataController.java)

  • @ResponseBody注解表示将方法返回的对象直接作为响应体返回(通常转为 JSON 格式),这里返回一个字符串列表,供前端 Vue 页面通过 axios 获取。

package com.pp.springbootvue.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.List;
@Controller
public class DataController {
    @RequestMapping("/loadview")
    public ModelAndView   LoadViewOne()
    {
        System.out.println("DataController  is   LoadViewOne  start....");
        ModelAndView  mav  = new ModelAndView();
        mav.setViewName("view1");
        return  mav;
    }
    @RequestMapping("/loaddataone")
    @ResponseBody
    public List   LoadDataOne()
    {
        System.out.println("DataController  is   LoadDataOne  start....");
        List lists   =new ArrayList();
        lists.add("张1");
        lists.add("张2");
        lists.add("张3");
        return   lists;
    }
}

4.4 axios 与 this 指向

  • axios:是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中发送 HTTP 请求。这里通过 axios.get("/loaddataone") 向 SpringBoot 后端发送 GET 请求,获取数据。

  • this 指向

    • 普通匿名函数(如原来注释掉的代码中 then 里的普通函数)中,this 指向的是this指向调用该函数的对象 (浏览器环境下是window 对象)。为了能在回调中操作 Vue 实例的数据,需要用 that = this 来保存 Vue 实例的引用。

    • 箭头函数没有自己的 this,它的 this 继承自外层作用域。在 then 的箭头函数中(存在于Vue方法中),this 指向的是 Vue 实例,所以可以直接通过 this.lists = resp.data 来更新 Vue 实例的数据,进而更新视图。

五、项目总结

        SpringBoot 作为后端框架,能灵活整合 Thymeleaf、Freemarker 等服务端视图技术,也能与 Vue 这类前端框架结合,发挥各自优势。Thymeleaf 和 Freemarker 适合服务端渲染场景,而 Vue 结合 MVVM 思想和 axios,能实现更灵活的前后端分离开发。同时,JavaScript 中 this 指向在不同函数类型(普通匿名函数、箭头函数)下的差异,也是前端开发中需要重点关注的知识点,需要合理利用箭头函数能简化代码,避免 this 指向问题带来的困扰。

posted on 2025-11-04 20:37  wgwyanfs  阅读(0)  评论(0)    收藏  举报

导航