Kata pengantar
Saya mengalami masalah seperti itu dalam pekerjaan saya sehari sebelum kemarin. Saya merangkum POJO di parameter antarmuka. Ini sangat umum. Ketika ada banyak parameter, pemikiran inersia adalah merangkum pojo. Lalu ada banyak anotasi untuk ditambahkan sebelum parameter, seperti: @RequestParam, @RequestBody, @pathvariable, dll. Pemahaman saya seperti ini. Pertama -tama, saya akan menyatakan bahwa saya belum pernah membaca kode sumber, tetapi saya hanya memahaminya berdasarkan pengalaman. @RequestParam dicoba digunakan untuk mendapatkan permintaan. Parameter ada di URL di header HTTP. Apa tempat spesifiknya? Berikut ini ada dalam bentuk kunci = nilai. @RequestBody berlaku untuk parameter permintaan pasca di badan http. @PathVariable lebih khusus lagi metode penulisan RESTful. Letakkan parameter pada URL tanpa tanda tanya untuk membedakan apakah itu parameter atau URL. Mungkin saya tidak terlalu akurat untuk mengatakan ini. Tapi saya biasanya menggunakannya dengan cara ini. Pada saat yang sama, ada juga cara umum untuk menulis parameter, yaitu tidak menambahkan anotasi sebelum parameter. Misalnya, jika parameternya adalah tipe dasar, jangan tambahkan @RequestParam, dan jika parameternya adalah kacang, jangan tambahkan permintaan, mereka juga dapat diuraikan oleh springmvc. Setelah antarmuka saya terlihat oleh pemimpin tim, dia meminta saya untuk menghapus @RequestBody, karena setelah menambahkan ini ke backend, permintaan AJAX di ujung depan perlu menampilkan tipe konten pernyataan: "Aplikasi/JSON" untuk diuraikan oleh SpringMVC, yang tampaknya telah melakukan sesuatu yang tidak perlu. Meskipun saya menghapusnya sesuai dengan persyaratannya, saya pikir saya harus mencari tahu apa yang sedang terjadi, apa perbedaan antara menambahkan atau tidak menambahkan, dampak apa yang terjadi pada kinerja, atau skenario terbaik yang berlaku untuk masing -masing. Selain Baidu, saya juga harus bertanya kepada Masters.
Proses Analisis Parameter Antarmuka Spring MVC
Pertama, saya perlahan mempelajari kode sumber melalui debugging. Tanpa menambahkan anotasi apa pun:
Selama proses pengembangan, konsumsi dan produksi umumnya tidak ditambahkan. Itu harus ditambahkan sesuai, karena dapat mengurangi rentang pencarian antarmuka. Ini adalah demo sederhana, saya hanya perlu dia memeriksa proses permintaan penerima SpringMVC.
Pertama, setelah Tomcat dimulai, jalur permintaan di semua kelas pengontrol adalah @Requestmapping dan kacang pengontrol dimuat ke dalam wadah pegas. Setelah permintaan halaman datang, servlet DispatcherServlet ditemukan. Setelah permintaan datang ke Servlet, semua orang tahu bahwa ada dua metode inisialisasi Servlet. Salah satunya adalah memuat segera, dan yang lainnya adalah memuat tertunda. Namun, apa pun yang terjadi, metode init hanya dipanggil sekali, dan kemudian metode layanan akan dipanggil langsung setiap saat. Saat Tomcat ditutup, metode hancur dari servlet berakhir. Oleh karena itu, enkapsulasi springmvc dari servlet harus mewarisi metode layanan, dan DispatcherServlet juga merupakan metode Dodispatch. Dalam metode ini, jalur permintaan diperoleh dengan menggunakan objek httpservletRequest, yang /notjson, dan kemudian membandingkannya dengan semua URL dalam wadah untuk akhirnya mendapatkan antarmuka di pengontrol. Setelah menemukan antarmuka, Anda secara alami akan mengetahui parameter antarmuka. Di sini saya tampil. Untuk kenyamanan dan kesederhanaan, hanya ada dua parameter dalam tampilan, yang merupakan dua dalam permintaan AJAX di bawah ini.
SpringMVC akan mendapatkan properti di PoJo melalui refleksi. Dalam proses ini, SpringMVC pertama -tama akan mendeklarasikan array. Ukuran array ini adalah jumlah parameter. Saya hanya punya satu di sini. Bahkan, saya percaya banyak orang akan mengalami masalah yang sama dengan saya. Ketika parameter kacang dan tipe dasar ada pada saat yang sama, bagaimana SpringMVC akan menguraikan ini? Saya telah menemukan ini beberapa kali. Tanpa melihat kode sumber, tipe dasar juga dienkapsulasi ke dalam kacang, dan front-end juga akan menulis atribut dalam suatu objek. Tentu saja saya percaya ini adalah sesuatu yang tidak bisa diterima semua orang. Kita semua berharap untuk mencari tahu bagaimana itu menganalisisnya, sehingga kita dapat mengutak -atiknya pada waktu itu. Berikut ini adalah proses refleksi. Setelah mencerminkan pojo saya, saya mendapatkan properti dan metode di dalam. Setelah parsing parameter, tetapkan nilai ke parameter. Ini mungkin tempat terpenting. Bagaimana tepatnya ditugaskan?
Dari metode ini Debug, saya belajar bahwa nama adalah Display, yang merupakan huruf kecil dari nama kelas Pojo. Saya tidak tahu mengapa SpringMVC melakukan pemrosesan ini (lihat nanti). Atribut adalah objek dengan usia dan nama. Tapi itu semua nol saat ini. WebDataBinding adalah databinder khusus yang digunakan untuk pengikatan data dari parameter permintaan web ke objek Javabean. Menindaklanjuti metode BindRequestParameters, Anda akan menemukan tempat yang sangat akrab ketika mengikutinya adalah gambar berikut. Nama parameter diperoleh dengan menggunakan String[] values = request.getParameterValues(paramName); Ini adalah metode untuk mendapatkan parameter servlet, sehingga Anda dapat mengetahui nama atribut dan nilai atribut dari parameter yang diminta.
Selanjutnya, dapat dibayangkan bahwa nama parameter ini diganti dengan nama atribut kacang, dan usia parameter usia diganti dengan usia nama atribut. Ikuti tempat ini, Oragina adalah pasangan nilai nama properti yang diperoleh oleh serclet di atas, mengubah peta ini menjadi nilai properti di sini. (PropertyValue adalah objek yang menyimpan informasi dan nilai properti kacang tunggal. Menggunakan objek di sini alih -alih hanya menyimpan semua properti dalam peta yang diketik dengan nama properti memungkinkan lebih banyak fleksibilitas dan kemampuan untuk menangani properti yang diindeks, dll. Dengan cara yang dioptimalkan . objek.
Saat mengkonversi, Anda akan mengabaikan atribut yang tidak diketahui
Gambar di atas menunjukkan metode konversi spesifik, yang relatif panjang. Kalimat berikut secara langsung memberikan nilai pada kacang. Dari proses ini. Selama sifat-sifat objek JSON front-end sama dengan properti kacang dari back-end, Ajax tidak menulis tipe konten, dan menggunakan application/x-www-form-urlencoded; charset=UTF-8 , Anda dapat langsung menetapkan nilai.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.