Memulai Formulir di Spring MVC

1. Ikhtisar

Pada artikel ini, kita akan membahas formulir Spring dan data binding ke pengontrol. Juga, kita akan melihat salah satu anotasi utama di Spring MVC yaitu @ModelAttribute .

Tentu saja, Spring MVC adalah topik yang kompleks dengan banyak hal yang perlu Anda pahami untuk menggunakannya secara maksimal, jadi pasti gali lebih dalam kerangka di sini.

2. Model

Pertama - mari kita tentukan entitas sederhana yang akan kita tampilkan dan ikat ke formulir:

public class Employee { private String name; private long id; private String contactNumber; // standard getters and setters }

Ini akan menjadi objek pendukung formulir kami.

3. Tampilan

Selanjutnya - mari kita tentukan bentuk sebenarnya , dan tentu saja, file HTML yang berisi itu. Kami akan menggunakan halaman tempat karyawan baru dibuat / terdaftar:

Welcome, Enter The Employee Details

Name
Id
Contact Number

Pertama - perhatikan bahwa kami menyertakan pustaka tag ke halaman JSP kami - formulir taglib - untuk membantu mendefinisikan formulir kami.

Selanjutnya - tag memainkan peran penting di sini; ini sangat mirip dengan HTLM biasatag tetapi atribut modelAttribute adalah kunci yang menentukan nama objek model yang mendukung formulir ini:

Ini akan sesuai dengan @ModelAttribute nanti di controller.

Berikutnya - setiap bidang masukan menggunakan tag berguna lainnya dari taglib Formulir Musim Semi - bentuk: awalan . Masing-masing bidang menentukan sebuah path atribut - ini harus sesuai dengan rajin dan giat / setter dari atribut model (dalam hal ini, kelas karyawan). Saat halaman dimuat, bidang input diisi oleh Spring, yang memanggil pengambil setiap bidang yang terikat ke bidang input. Saat formulir dikirim, penyetel dipanggil untuk menyimpan nilai formulir ke objek.

Akhirnya - ketika formulir dikirim , pengendali POST di pengontrol dipanggil dan formulir secara otomatis terikat ke argumen karyawan yang kami berikan.

4. Pengendali

Sekarang, mari kita lihat Controller yang akan menangani bagian belakang:

@Controller public class EmployeeController { @RequestMapping(value = "/employee", method = RequestMethod.GET) public ModelAndView showForm() { return new ModelAndView("employeeHome", "employee", new Employee()); } @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("contactNumber", employee.getContactNumber()); model.addAttribute("id", employee.getId()); return "employeeView"; } }

Controller mendefinisikan dua operasi sederhana - GET untuk menampilkan data dalam formulir, dan POST untuk operasi create, melalui pengiriman formulir.

Perhatikan juga bahwa jika objek bernama "karyawan" tidak ditambahkan ke model, Spring akan mengeluh saat kami mencoba mengakses JSP karena JSP akan disiapkan untuk mengikat formulir ke atribut model "karyawan":

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'employee' available as request attribute at o.s.w.s.s.BindStatus.(BindStatus.java:141) 

Untuk mengakses objek dukungan formulir kita, kita perlu memasukkannya melalui anotasi @ModelAttribute .

Sebuah @ModelAttribute pada metode argumen menunjukkan argumen akan diambil dari model. Jika tidak ada dalam model, argumen akan dibuat instance-nya terlebih dahulu dan kemudian ditambahkan ke model.

5. Menangani Error Bind

Secara default, Spring MVC menampilkan pengecualian saat terjadi kesalahan selama pengikatan permintaan. Ini biasanya bukan yang kita inginkan, sebaliknya, kita harus menampilkan kesalahan ini kepada pengguna. Kami akan menggunakan BindingResult dengan menambahkan satu sebagai argumen ke metode pengontrol kami:

public String submit( @Valid @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model)

The BindingResult kebutuhan argumen untuk diposisikan tepat setelah bentuk dukungan objek kami - itu salah satu kasus yang jarang terjadi di mana urutan hal-hal metode argumen. Jika tidak, kita akan mengalami pengecualian berikut:

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

Sekarang - pengecualian tidak lagi dilemparkan; sebaliknya, kesalahan akan didaftarkan di BindingResult yang diteruskan ke metode pengiriman . Pada titik ini, kami dapat menangani kesalahan ini dengan berbagai cara - misalnya, operasi dapat dibatalkan:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } //Do Something return "employeeView"; }

Perhatikan bagaimana, jika hasil mengandung kesalahan, kami mengembalikan tampilan lain kepada pengguna untuk menampilkan kesalahan ini dengan benar. Mari kita lihat tampilan itu - error.jsp :

Please enter the correct details

Retry

6. Menampilkan Karyawan

Terakhir, selain membuat karyawan baru, kita juga dapat dengan mudah menampilkannya - berikut kode tampilan singkatnya:

Submitted Employee Information

Name : ${name}
ID : ${id}
Contact Number : ${contactNumber}

Halaman JSP hanya menggunakan ekspresi EL untuk menampilkan nilai properti dari objek Karyawan dalam model.

7. Menguji Aplikasi

Aplikasi sederhana dapat digunakan - misalnya di server Tomcat - dan diakses secara lokal:

// localhost: 8080 / spring-mvc-xml / karyawan

Ini adalah tampilan yang berisi formulir utama - sebelum operasi pengiriman:

Contoh Formulir MVC Musim Semi - Kirim

Setelah di submit, datanya ditampilkan:

Contoh Formulir Spring MVC - Lihat

Dan hanya itu - contoh kerja formulir sederhana dengan Spring MVC, dengan validasi .

Penerapan tutorial MVC Musim Semi ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.

Akhirnya, seperti yang saya katakan tepat di awal artikel, Anda pasti harus menggali lebih dalam MVC Spring.