MVC musim semi dan Anotasi @ModelAttribute

1. Ikhtisar

Salah satu anotasi Spring-MVC terpenting adalah anotasi @ModelAttribute.

The @ModelAttribute adalah penjelasan yang mengikat parameter metode atau nilai metode kembali ke atribut model bernama dan kemudian menghadapkan ke tampilan web.

Dalam contoh berikut, kami akan mendemonstrasikan kegunaan dan fungsionalitas anotasi, melalui konsep umum: formulir yang dikirimkan dari karyawan perusahaan.

2. The @ModelAttribute in Depth

Seperti yang diungkapkan paragraf pengantar, @ModelAttribute dapat digunakan baik sebagai parameter metode atau pada tingkat metode.

2.1 Di Tingkat Metode

Jika anotasi digunakan pada tingkat metode, hal itu menunjukkan tujuan metode tersebut untuk menambahkan satu atau lebih atribut model. Metode tersebut mendukung tipe argumen yang sama seperti metode @RequestMapping tetapi tidak dapat dipetakan secara langsung ke permintaan.

Mari kita lihat contoh singkat di sini untuk mulai memahami cara kerjanya:

@ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "Welcome to the Netherlands!"); } 

Dalam contoh, kami menunjukkan metode yang menambahkan atribut bernama msg ke semua model yang ditentukan di kelas kontroler.

Tentu saja kita akan melihat ini beraksi nanti di artikel.

Secara umum, Spring-MVC akan selalu melakukan panggilan ke metode tersebut terlebih dahulu, sebelum memanggil metode penangan permintaan. Artinya, metode @ModelAttribute dipanggil sebelum metode pengontrol yang dianotasi dengan @RequestMapping dipanggil. Logika di balik urutan tersebut adalah, objek model harus dibuat sebelum pemrosesan apa pun dimulai di dalam metode pengontrol.

Anda juga harus menganotasi kelas terkait sebagai @ControllerAdvice. Dengan demikian, Anda dapat menambahkan nilai dalam Model yang akan diidentifikasi sebagai global. Ini sebenarnya berarti bahwa untuk setiap permintaan ada nilai default, untuk setiap metode di bagian respons.

2.2 Sebagai Metode Argumen

Saat digunakan sebagai argumen metode, ini menunjukkan argumen harus diambil dari model. Jika tidak ada, itu harus dibuat terlebih dahulu lalu ditambahkan ke model dan setelah ada dalam model, bidang argumen harus diisi dari semua parameter permintaan yang memiliki nama yang cocok.

Dalam cuplikan kode yang mengikuti atribut model karyawan diisi dengan data dari formulir yang dikirimkan ke titik akhir addEmployee . Spring MVC melakukan ini di belakang layar sebelum menjalankan metode kirim:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@ModelAttribute("employee") Employee employee) { // Code that uses the employee object return "employeeView"; }

Nanti di artikel ini kita akan melihat contoh lengkap bagaimana menggunakan objek karyawan untuk mengisi template employeeView .

Jadi, itu mengikat data formulir dengan kacang. Kontroler yang dianotasi dengan @RequestMapping dapat memiliki argumen kelas kustom yang dianotasi dengan @ModelAttribute .

Inilah yang umumnya dikenal sebagai pengikatan data di Spring-MVC, mekanisme umum yang menyelamatkan Anda dari keharusan mengurai setiap kolom formulir satu per satu.

3. Contoh Formulir

Di bagian ini kami akan memberikan contoh yang dirujuk di bagian ikhtisar: formulir yang sangat dasar yang meminta pengguna (karyawan perusahaan, dalam contoh khusus kami), untuk memasukkan beberapa informasi pribadi (khususnya nama dan id). Setelah pengiriman selesai dan tanpa kesalahan, pengguna berharap untuk melihat data yang dikirimkan sebelumnya, ditampilkan di layar lain.

3.1 Pandangan

Mari pertama-tama buat formulir sederhana dengan bidang id dan nama:

 Name  Id    

3.2 Pengontrol

Berikut adalah kelas pengontrol, di mana logika untuk tampilan yang disebutkan sebelumnya sedang diimplementasikan:

@Controller @ControllerAdvice public class EmployeeController { private Map employeeMap = new HashMap(); @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit( @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("id", employee.getId()); employeeMap.put(employee.getId(), employee); return "employeeView"; } @ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "Welcome to the Netherlands!"); } }

Dalam metode submit () kita memiliki objek Employee yang terikat ke View kita . Dapatkah Anda melihat kekuatan anotasi ini? Anda dapat memetakan bidang formulir Anda ke model objek sesederhana itu. Dalam metode ini kami mengambil nilai dari formulir dan menyetelnya ke ModelMap .

Pada akhirnya kami mengembalikan employeeView , yang berarti file JSP masing-masing akan dipanggil sebagai perwakilan View .

Selain itu, ada juga metode addAttributes () . Tujuannya adalah untuk menambah nilai dalam Model yang akan diidentifikasi secara global. Artinya, nilai default akan dikembalikan sebagai respons untuk setiap permintaan ke setiap metode pengontrol. Kita juga harus memberi anotasi pada kelas tertentu sebagai @ControllerAdvice .

3.3 Model

Seperti disebutkan sebelumnya, objek Model sangat sederhana dan berisi semua yang dibutuhkan oleh atribut "front-end". Sekarang, mari kita lihat contohnya:

@XmlRootElement public class Employee { private long id; private String name; public Employee(long id, String name) { this.id = id; this.name = name; } // standard getters and setters removed }

3.4 Selesai

The @ControllerAdvice membantu controller dan, khususnya @ModelAttribute metode yang berlaku untuk semua @RequestMapping metode. Tentu saja, metode addAttributes () kami akan menjadi yang pertama dijalankan, sebelum metode @RequestMapping lainnya .

Dengan mengingat hal itu dan setelah kedua submit () dan addAttributes () dijalankan, kita bisa merujuk ke mereka di View yang dikembalikan dari kelas Controller , dengan menyebutkan nama mereka di dalam duo kurung kurawal yang di-dollarized, seperti misalnya $ {nama} .

3.5 Tampilan Hasil

Sekarang mari kita cetak apa yang kita terima dari formulir:

${msg}

Name : ${name} ID : ${id}

4. Kesimpulan

Dalam tutorial ini kita menyelidiki penggunaan anotasi @ModelAttribute , untuk argumen metode dan kasus penggunaan tingkat metode .

Penerapan tutorial sederhana ini dapat ditemukan di proyek github.