Vue.js is one of the most widely used JavaScript frames for creating web interfaces and single page applications. This guide covers a basic example of a Spring Boot application which uses Vue.js as front-end
Start by creating a new project which includes the web dependencies:
$ spring init -dweb,thymeleaf demo-vue
The following dependencies will be included:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
Our basic REST Application composed of the following components:
An application class:
package com.example.testrest; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
A Controller Class:
package com.example.testrest; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class CustomerController { @Autowired CustomerRepository repository; @RequestMapping("/list") public List<Customer> findAll() { return repository.getData(); } @RequestMapping("/one/{id}") public Customer findOne(@PathVariable int id) { return repository.getData().get(id); } }
A Repository Class:
package com.example.testrest; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; @Component public class CustomerRepository { List<Customer> customerList = new ArrayList<Customer>(); @PostConstruct public void init() { customerList.add(new Customer(1, "Fred", "Flinstone")); customerList.add(new Customer(2, "Barney", "Rubble")); customerList.add(new Customer(2, "Wilma", "Flinstone")); customerList.add(new Customer(2, "Bettey", "Rubble")); customerList.add(new Customer(2, "Bamm", "Bamm")); } public List<Customer> getData() { return customerList; } }
And a POJO:
package com.example.testrest; public class Customer { private int id; private String name; private String surname; public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public Customer(int id, String name, String surname) { super(); this.id = id; this.name = name; this.surname = surname; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
And this is our index.html pages, which is placed under resources/templates and creates dynamically a Table from the JSON Data of our Spring Boot Service:
<div id="app"> <div v-html="userTable"></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <script> // register the grid component new Vue({ el: '#app', data: { users: [] }, computed: { userTable() { // actually inserting the HTML in the template return this.createTable(this.users) } }, methods: { getUsers() { // getting JSON data from API return new Promise((resolve, reject) => { const users = fetch('http://localhost:8080/list') .then(response => response.json()) .then(json => { resolve(json) }) }) }, userRowHtml(user) { // creating a single table row of user data if (user) { let html = '' Object.entries(user).forEach(e => { html += ` <td>${e[1]}</td>` }) return html } return '' }, userRows(users) { // creating the table rows for user data if (users && users.length) { let html = '' users.forEach(e => { html += ` <tr>${this.userRowHtml(e)}</tr>` }) return html } return '' }, createTable(users) { // creating the table to insert if (users && users.length) { const headers = Object.keys(this.users[0]) let html = '' html += ' <table class="blueTable"> <thead> <tr>' headers.forEach(e => { html += ` <th>${e}</th>` }) html += ' </tr> </thead>' html += ' <tbody>' html += this.userRows(users) html += '</tbody> </table>' return html } return '' } }, async mounted() { this.users = await this.getUsers() } }) </script>undefined</body>
Build and run the application with:
$ mvn install spring-boot:run
Here is our first Vue.js application running with a Spring Boot Service:
Found the article helpful? if so please follow us on Socials