Spring MVC dan Anotasi @ModelAttribute

1. Gambaran keseluruhan

Salah satu anotasi Spring-MVC yang paling penting ialah anotasi @ModelAttribute.

The @ModelAttribute adalah penjelasan yang mengikat kaedah parameter atau nilai kaedah kembali kepada sifat model dinamakan dan kemudian mendedahkan ia kepada paparan web.

Dalam contoh berikut, kami akan menunjukkan kebolehgunaan dan fungsi anotasi, melalui konsep umum: borang yang dihantar dari pekerja syarikat.

2. The @ModelAttribute dalam Kedalaman

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

2.1 Pada Tahap Kaedah

Apabila anotasi digunakan pada tahap kaedah ini menunjukkan tujuan kaedah itu adalah untuk menambahkan satu atau lebih atribut model. Kaedah sedemikian menyokong jenis argumen yang sama dengan kaedah @RequestMapping tetapi tidak dapat dipetakan secara langsung ke permintaan.

Mari kita lihat contoh ringkas di sini untuk mula memahami cara kerjanya:

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

Dalam contoh tersebut, kami menunjukkan kaedah yang menambahkan atribut bernama msg ke semua model yang ditentukan dalam kelas pengawal.

Sudah tentu kita akan melihatnya dalam tindakan di kemudian hari dalam artikel.

Secara umum, Spring-MVC akan selalu membuat panggilan pertama ke kaedah itu, sebelum memanggil kaedah pengendali permintaan. Maksudnya, kaedah @ModelAttribute dipanggil sebelum kaedah pengawal yang diberi penjelasan dengan @RequestMapping dipanggil. Logik di sebalik urutannya ialah, objek model harus dibuat sebelum proses dimulakan di dalam kaedah pengawal.

Anda juga mesti memberi komen kepada kelas masing-masing sebagai @ControllerAdvice. Oleh itu, anda boleh menambah nilai dalam Model yang akan dikenali sebagai global. Ini sebenarnya bermaksud bahawa untuk setiap permintaan ada nilai default, untuk setiap kaedah di bahagian respons.

2.2 Sebagai Hujah Kaedah

Apabila digunakan sebagai argumen kaedah, ini menunjukkan argumen harus diambil dari model. Apabila tidak hadir, harus disertakan terlebih dahulu dan kemudian ditambahkan ke model dan setelah hadir dalam model, bidang argumen harus diisi dari semua parameter permintaan yang memiliki nama yang sesuai.

Dalam coretan kod yang mengikuti atribut model pekerja diisi dengan data dari borang yang dikirimkan ke titik akhir addEm Employee . Spring MVC melakukan ini di belakang tabir sebelum menggunakan kaedah menghantar:

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

Nanti dalam artikel ini kita akan melihat contoh lengkap bagaimana menggunakan objek pekerja untuk mengisi templat pekerja .

Jadi, ia mengikat data bentuk dengan kacang. Pengawal yang dianotasi dengan @RequestMapping boleh mempunyai argumen kelas tersuai yang dianotasi dengan @ModelAttribute .

Inilah yang biasanya dikenali sebagai pengikatan data di Spring-MVC, mekanisme umum yang menyelamatkan anda daripada harus menguraikan setiap bidang borang secara individu.

3. Contoh Bentuk

Dalam bahagian ini kami akan memberikan contoh yang disebut dalam bahagian gambaran umum: bentuk yang sangat asas yang mendorong pengguna (pekerja syarikat, dalam contoh khusus kami), untuk memasukkan beberapa maklumat peribadi (khususnya nama dan id). Setelah penyerahan selesai dan tanpa kesalahan, pengguna mengharapkan untuk melihat data yang dikirimkan sebelumnya, dipaparkan di layar lain.

3.1 Pandangan

Mari buat dahulu borang ringkas dengan medan id dan nama:

 Name  Id    

3.2 Pengawal

Berikut adalah kelas pengawal, di mana logik untuk pandangan yang disebutkan di atas dilaksanakan:

@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 (), kami memiliki objek Karyawan yang terikat dengan View kami . Bolehkah anda melihat kehebatan anotasi ini? Anda dapat memetakan medan borang anda ke model objek sesederhana itu. Dalam kaedah ini, kita mengambil nilai dari bentuk dan menetapkannya ke ModelMap .

Pada akhirnya kami mengembalikan pekerjaView , yang bermaksud bahawa fail JSP masing-masing akan dipanggil sebagai wakil View .

Selanjutnya, terdapat juga kaedah addAttributes () . Tujuannya adalah untuk menambah nilai dalam Model yang akan dikenal pasti di peringkat global. Iaitu, nilai lalai akan dikembalikan sebagai tindak balas untuk setiap permintaan ke setiap kaedah pengawal. Kita juga mesti memberi penjelasan untuk kelas tertentu sebagai @ControllerAdvice .

3.3 Model

Seperti disebutkan sebelumnya, objek Model sangat sederhana dan berisi semua yang diperlukan 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 Kemaskan

The @ControllerAdvice membantu pengawal dan khususnya, @ModelAttribute kaedah yang terpakai bagi semua @RequestMapping kaedah. Sudah tentu, kaedah addAttributes () kami akan menjadi yang pertama dijalankan, sebelum kaedah @RequestMapping yang lain.

Mengingatnya dan setelah kedua-dua submit () dan addAttributes () dijalankan, kita hanya boleh merujuknya pada View yang dikembalikan dari kelas Controller , dengan menyebut nama mereka di dalam duo pendakap kurung, seperti misalnya $ {nama} .

3.5 Paparan Hasil

Mari sekarang mencetak apa yang kami terima dari borang:

${msg}

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

4. Kesimpulan

Dalam tutorial ini kami menyiasat penggunaan anotasi @ModelAttribute , untuk kedua-dua argumen kaedah dan kes penggunaan tahap kaedah .

Pelaksanaan tutorial sederhana ini boleh didapati di projek github.