Aplikasi CRUD Spring Boot dengan Thymeleaf

1. Gambaran keseluruhan

Pelaksanaan lapisan DAO yang menyediakan fungsi CRUD pada entiti JPA boleh menjadi tugas yang berulang-ulang dan memakan masa yang ingin kita hindari dalam kebanyakan kes. Nasib baik, Spring Boot menjadikannya mudah untuk membuat aplikasi CRUD melalui lapisan repositori CRUD berasaskan JPA standard.

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

2. Pergantungan Maven

Dalam kes ini, kami akan bergantung pada ibu bapa spring-boot-starter untuk pengurusan kebergantungan sederhana, versi, dan konfigurasi pemalam. Akibatnya, kami tidak perlu menentukan versi kebergantungan projek dalam fail pom.xml kami , kecuali untuk mengesampingkan 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 kebergantungan projek sudah ada, mari kita laksanakan lapisan domain naif.

Demi kesederhanaan, lapisan ini akan merangkumi satu kelas tunggal yang akan bertanggungjawab untuk memodelkan entiti 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 }

Perlu diingat bahawa kami telah memberi anotasi kelas dengan anotasi @Entity . Oleh itu, pelaksanaan JPA, yang Hibernate, dalam kes ini, akan dapat melakukan operasi CRUD pada entiti domain. Untuk panduan pengenalan Hibernate, lawati tutorial kami mengenai Hibernate 5 dengan Spring.

Di samping itu, kami telah mengekang bidang nama dan e - mel dengan kekangan @NotBlank . Ini menunjukkan bahawa kita dapat menggunakan Hibernate Validator untuk mengesahkan medan yang dibatasi sebelum meneruskan atau mengemas kini entiti dalam pangkalan data.

Untuk asasnya, lihat tutorial berkaitan kami mengenai Bean Validation.

4. Lapisan Repositori

Pada ketika ini, aplikasi web sampel kami tidak melakukan apa-apa. Tetapi itu akan berubah.

Spring Data JPA membolehkan kami melaksanakan repositori berasaskan JPA (nama yang menarik untuk pelaksanaan corak DAO) dengan sedikit keributan .

Spring Data JPA adalah komponen utama spring-boot-starter-data-jpa Spring Boot yang memudahkan untuk menambahkan fungsi CRUD melalui lapisan abstraksi yang kuat yang diletakkan di atas pelaksanaan JPA. Lapisan abstraksi ini membolehkan kita mengakses lapisan ketekunan tanpa perlu menyediakan pelaksanaan DAO kita sendiri dari awal.

Untuk menyediakan aplikasi kami dengan fungsi CRUD asas pada objek Pengguna, semua yang perlu kita lakukan adalah memperluaskan antara muka CrudRepository :

@Repository public interface UserRepository extends CrudRepository {}

Dan itu sahaja! Dengan hanya memperluaskan antara muka CrudRepository , Spring Data JPA akan menyediakan pelaksanaan kaedah CRUD repositori untuk kami.

5. Lapisan Pengawal

Terima kasih kepada lapisan abstraksi yang spring-boot-starter-data-jpa meletakkan di atas pelaksanaan JPA yang mendasari, kami dapat dengan mudah menambahkan beberapa fungsi CRUD ke aplikasi web kami melalui peringkat web asas .

Dalam kes kami, satu kelas pengawal akan mencukupi untuk menangani permintaan GET dan POST HTTP dan kemudian memetakannya ke panggilan ke pelaksanaan UserRepository kami .

Kelas pengawal bergantung pada beberapa ciri utama Spring MVC. Untuk panduan terperinci mengenai Spring MVC, lihat tutorial Spring MVC kami.

Mari kita mulakan dengan kaedah showSignUpForm () dan addUser () pengawal .

Yang pertama akan menampilkan borang pendaftaran pengguna, sementara yang kedua akan meneruskan entiti baru dalam pangkalan data setelah mengesahkan bidang yang dibatasi.

Sekiranya entiti tidak lulus pengesahan, borang pendaftaran akan dipaparkan semula. Jika tidak, setelah entiti disimpan, senarai entiti yang berterusan akan dikemas kini dalam paparan yang sesuai:

@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 memerlukan pemetaan untuk / index URL:

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

Di dalam UserController kami juga akan mempunyai kaedah showUpdateForm () yang bertanggungjawab untuk mengambil entiti Pengguna yang sesuai dengan id yang disediakan dari pangkalan data.

Sekiranya entiti itu ada, ia akan diteruskan sebagai atribut model ke tampilan borang kemas kini, oleh itu borang tersebut dapat diisi dengan nilai nama dan bidang e - mel :

@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"; } 

Akhirnya, kita mempunyai kaedah updateUser () dan deleteUser () dalam kelas UserController .

Yang pertama akan mengekalkan entiti yang dikemas kini dalam pangkalan data, sementara yang terakhir akan menghapus entiti yang diberikan.

Dalam kedua-dua kes, senarai entiti yang berterusan akan dikemas kini dengan sewajarnya:

@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 Pandangan

Pada ketika ini, kami telah melaksanakan kelas pengawal berfungsi yang menjalankan operasi CRUD pada entiti Pengguna . Walaupun begitu, masih ada komponen yang hilang dalam skema ini: lapisan pandangan.

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

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

Inilah bahagian yang berkaitan dengan fail add-user.html :

 Name   Email    

Perhatikan bagaimana kita menggunakan ungkapan URL @ {/ adduser} untuk menentukan atribut tindakan borang dan ungkapan pemboleh ubah $ {} untuk menyematkan kandungan dinamik dalam templat, seperti nilai nama dan bidang e - mel dan pasca pengesahan kesilapan .

Similar to add-user.html, here's how the update-user.html template looks:

 Name   Email    

Finally, we have the index.html file which displays the list of persisted entities along with the links for editing and removing existing ones:

No users yet!

Users

Name Email Edit Delete
Edit Delete

Add a new user

For simplicity's sake, the templates look rather skeletal and only provide the required functionality without adding unnecessary cosmetics .

To give the templates an improved, eye-catching look without spending too much time on HTML/CSS we can easily use a free Twitter Bootstrap UI kit, like Shards.

7. Running the Application

Finally, let's define the application's entry point. Like most Spring Boot applications, we can do this with a plain old main() method:

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

Sekarang, mari tekan "Run" di IDE kami, kemudian buka penyemak imbas kami dan arahkan ke // localhost: 8080 .

Sekiranya binaan berjaya disusun, kita akan melihat papan pemuka pengguna CRUD asas dengan pautan untuk menambah entiti baru dan untuk menyunting dan membuang yang sedia ada.

8. Kesimpulannya

Dalam tutorial ini, kami belajar bagaimana membina aplikasi web CRUD asas dengan Spring Boot dan Thymeleaf.

Seperti biasa, semua contoh kod yang ditunjukkan dalam artikel boleh didapati di GitHub.