Aplikasi Spring Boot CRUD dengan Thymeleaf

1. Ikhtisar

Implementasi lapisan DAO yang menyediakan fungsionalitas CRUD pada entitas JPA dapat menjadi tugas berulang dan memakan waktu yang ingin kami hindari dalam banyak kasus. Untungnya, Spring Boot memudahkan pembuatan aplikasi CRUD melalui lapisan repositori CRUD berbasis JPA standar.

Dalam tutorial ini, kita akan belajar bagaimana mengembangkan aplikasi web CRUD dengan Spring Boot dan Thymeleaf .

2. Dependensi Maven

Dalam kasus ini, kami akan mengandalkan spring-boot-starter-parent untuk pengelolaan dependensi sederhana, pembuatan versi, dan konfigurasi plug-in. Akibatnya, kami tidak perlu menentukan versi dependensi proyek di file pom.xml kami , kecuali untuk menimpa versi Java:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE    org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-thymeleaf   org.springframework.boot spring-boot-starter-data-jpa   com.h2database h2   

3. Lapisan Domain

Dengan semua dependensi proyek yang sudah ada, sekarang mari mengimplementasikan lapisan domain naif.

Demi kesederhanaan, lapisan ini akan menyertakan satu kelas yang akan bertanggung jawab untuk memodelkan entitas Pengguna :

@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @NotBlank(message = "Name is mandatory") private String name; @NotBlank(message = "Email is mandatory") private String email; // standard constructors / setters / getters / toString }

Mari Perlu diingat bahwa kita sudah dijelaskan kelas dengan @ Entity penjelasan. Oleh karena itu, implementasi JPA, yaitu Hibernate, dalam hal ini, akan dapat melakukan operasi CRUD pada entitas domain. Untuk panduan pengantar tentang Hibernate, kunjungi tutorial kami tentang Hibernate 5 dengan Spring.

Selain itu, kami telah membatasi kolom nama dan email dengan batasan @NotBlank . Ini menyiratkan bahwa kita dapat menggunakan Hibernate Validator untuk memvalidasi bidang yang dibatasi sebelum mempertahankan atau memperbarui entitas dalam database.

Untuk dasar-dasar ini, lihat tutorial terkait kami tentang Validasi Bean.

4. Lapisan Repositori

Pada titik ini, aplikasi web contoh kami tidak melakukan apa pun. Tapi itu akan berubah.

Spring Data JPA memungkinkan kita untuk mengimplementasikan repositori berbasis JPA (nama mewah untuk implementasi pola DAO) dengan sedikit keributan .

Spring Data JPA adalah komponen kunci dari spring-boot-starter-data-jpa Spring Boot yang memudahkan untuk menambahkan fungsionalitas CRUD melalui lapisan abstraksi yang kuat yang ditempatkan di atas implementasi JPA. Lapisan abstraksi ini memungkinkan kita mengakses lapisan persistensi tanpa harus menyediakan implementasi DAO sendiri dari awal.

Untuk menyediakan aplikasi kita dengan fungsionalitas CRUD dasar pada objek User, yang perlu kita lakukan adalah memperluas antarmuka CrudRepository :

@Repository public interface UserRepository extends CrudRepository {}

Dan itu dia! Dengan hanya memperluas antarmuka CrudRepository , Spring Data JPA akan menyediakan implementasi metode CRUD repositori untuk kita.

5. Lapisan Pengontrol

Berkat lapisan abstraksi yang ditempatkan spring-boot-starter-data-jpa di atas implementasi JPA yang mendasarinya, kita dapat dengan mudah menambahkan beberapa fungsionalitas CRUD ke aplikasi web kita melalui tingkat web dasar .

Dalam kasus kami, satu kelas pengontrol akan cukup untuk menangani permintaan HTTP GET dan POST dan kemudian memetakannya ke panggilan ke implementasi UserRepository kami .

Kelas pengontrol bergantung pada beberapa fitur utama Spring MVC. Untuk panduan terperinci tentang Spring MVC, lihat tutorial Spring MVC kami.

Mari kita mulai dengan metode showSignUpForm () dan addUser () pengontrol .

Yang pertama akan menampilkan formulir pendaftaran pengguna, sedangkan yang terakhir akan mempertahankan entitas baru dalam database setelah memvalidasi bidang yang dibatasi.

Jika entitas tidak lolos validasi, formulir pendaftaran akan ditampilkan kembali. Jika tidak, setelah entitas disimpan, daftar entitas yang ada akan diperbarui dalam tampilan terkait:

@Controller public class UserController { @GetMapping("/signup") public String showSignUpForm(User user) { return "add-user"; } @PostMapping("/adduser") public String addUser(@Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { return "add-user"; } userRepository.save(user); return "redirect:/index"; } // additional CRUD methods }

Kami juga membutuhkan pemetaan untuk / index URL:

@GetMapping("/index") public String showUserList(Model model) { model.addAttribute("users", userRepository.findAll()); return "index"; }

Dalam UserController kita juga akan memiliki metode showUpdateForm () yang bertanggung jawab untuk mengambil entitas Pengguna yang cocok dengan id yang disediakan dari database.

Jika entitas ada, itu akan diteruskan sebagai atribut model ke tampilan formulir pembaruan, maka formulir dapat diisi dengan nilai bidang nama dan email :

@GetMapping("/edit/{id}") public String showUpdateForm(@PathVariable("id") long id, Model model) { User user = userRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); model.addAttribute("user", user); return "update-user"; } 

Terakhir, kami memiliki metode updateUser () dan deleteUser () dalam kelas UserController .

Yang pertama akan mempertahankan entitas yang diperbarui dalam database, sedangkan yang terakhir akan menghapus entitas yang diberikan.

Dalam kedua kasus tersebut, daftar entitas yang bertahan akan diperbarui sesuai:

@PostMapping("/update/{id}") public String updateUser(@PathVariable("id") long id, @Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { user.setId(id); return "update-user"; } userRepository.save(user); return "redirect:/index"; } @GetMapping("/delete/{id}") public String deleteUser(@PathVariable("id") long id, Model model) { User user = userRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); userRepository.delete(user); return "redirect:/index"; }

6. Lapisan Tampilan

Pada titik ini, kami telah menerapkan kelas pengontrol fungsional yang melakukan operasi CRUD pada entitas Pengguna . Meski begitu, masih ada komponen yang hilang dalam skema ini: lapisan tampilan.

Di bawah folder src / main / resources / templates kita perlu membuat template HTML yang diperlukan untuk menampilkan formulir pendaftaran, formulir pembaruan, dan menampilkan daftar entitas Pengguna yang ada,

Seperti yang dinyatakan dalam pendahuluan, kami akan menggunakan Thymeleaf sebagai mesin templat yang mendasari untuk mengurai file templat.

Berikut bagian yang relevan dari file add-user.html :

 Name   Email    

Perhatikan bagaimana kita menggunakan ekspresi URL @ {/ adduser} untuk menentukan atribut tindakan formulir dan ekspresi variabel $ {} untuk menyematkan konten dinamis dalam template, seperti nilai bidang nama dan email serta post-validasi kesalahan .

Mirip dengan add-user.html , berikut tampilan template update-user.html :

 Name   Email    

Terakhir, kami memiliki file index.html yang menampilkan daftar entitas yang ada bersama dengan tautan untuk mengedit dan menghapus yang sudah ada:

No users yet!

Users

Name Email Edit Delete
Edit Delete

Add a new user

Demi kesederhanaan, templatnya terlihat seperti kerangka dan hanya menyediakan fungsionalitas yang diperlukan tanpa menambahkan kosmetik yang tidak perlu.

Untuk memberikan template tampilan yang lebih baik dan menarik tanpa menghabiskan terlalu banyak waktu pada HTML / CSS, kita dapat dengan mudah menggunakan kit UI Bootstrap Twitter gratis, seperti Shards.

7. Menjalankan Aplikasi

Terakhir, mari tentukan titik masuk aplikasi. Seperti kebanyakan aplikasi Spring Boot, kita dapat melakukan ini dengan metode main () lama biasa :

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

Sekarang, tekan "Run" di IDE kita, lalu buka browser kita dan arahkan ke // localhost: 8080 .

Jika build berhasil dikompilasi, kita akan melihat dasbor pengguna CRUD dasar dengan tautan untuk menambahkan entitas baru dan untuk mengedit serta menghapus yang sudah ada.

8. Kesimpulan

Dalam tutorial ini, kita belajar bagaimana membangun aplikasi web CRUD dasar dengan Spring Boot dan Thymeleaf.

Seperti biasa, semua contoh kode yang ditampilkan dalam artikel tersedia di GitHub.