ringkasan
SpringMVC menggunakan konverter pesan untuk mewujudkan konversi otomatis antara pesan permintaan dan objek, objek dan pesan respons.
Di SpringMVC, Anda dapat menggunakan dua anotasi @RequestBody dan @ResponseBody untuk menyelesaikan konversi pesan permintaan ke objek dan objek untuk masing -masing pesan respons. Mekanisme konversi pesan fleksibel yang mendasari adalah HTTPMessageConverter yang baru diperkenalkan, mekanisme konverter pesan, yang merupakan httpmessageConverter yang baru diperkenalkan di Spring 3.x.
Abstraksi permintaan #http masih untuk kembali ke respons permintaan, yaitu, untuk menguraikan badan permintaan, dan kemudian mengembalikan pesan respons. Ini adalah proses permintaan HTTP paling mendasar. Kita tahu bahwa dalam standar servlet, metode berikut di antarmuka javax.servlet.servletrequest dapat digunakan:
Public ServeTInputStream getInputStream () melempar ioException;
untuk mendapatkan servletInputStream. Dalam servletInputStream ini, semua konten dari pesan permintaan mentah dapat dibaca. Demikian pula, di antarmuka javax.servlet.servletresponse, metode berikut dapat digunakan:
Public ServeTeTutStream getOutputStream () melempar ioException;
Untuk mendapatkan serveTeTutputStream, serveTeTutSteam ini, diwarisi dari outputStream di java, memungkinkan Anda untuk meng -output konten paket respons HTTP.
Mari kita coba berpikir seperti perancang SpringMVC. Kita tahu bahwa paket permintaan dan respons HTTP pada dasarnya adalah string string. Ketika paket permintaan datang ke dunia Java, itu akan dienkapsulasi ke dalam aliran input servletInputStream bagi kita untuk membaca paket. Pesan respons adalah output melalui aliran output dari servletoutputStream.
Kami hanya dapat membaca pesan string asli dari aliran, dan juga, kami hanya dapat menulis karakter asli ke dalam aliran output. Di dunia Java, pemrosesan logika bisnis didasarkan pada objek khusus bisnis sebagai dimensi pemrosesan. Kemudian, ketika pesan tiba di SpringMVC dan keluar dari SpringMVC, ada masalah impedansi antara string dan objek Java. Proses ini tidak dapat dikonversi secara manual oleh pengembang. Kita tahu bahwa di Struts2, OGNL digunakan untuk menangani masalah ini, sedangkan di SpringMVC, itu adalah mekanisme httpmessageConverter. Mari kita lihat kedua antarmuka terlebih dahulu.
#HttpinputMessage kelas ini adalah abstraksi dari pesan permintaan HTTP dalam springmvc. Dalam metode read () dari httpmessageConverter, ada parameter formal httpinputMessage, yang merupakan abstraksi internal dari reseptor "pesan permintaan" yang digunakan oleh konverter pesan SpringMVC. Konverter pesan mengekstraksi pesan dari "pesan permintaan" sesuai dengan aturan dan mengubahnya menjadi objek yang dinyatakan dalam parameter formal metode.
Paket org.springframework.http; import java.io.ioException; import java.io.inputStream; antarmuka publik httpinputMessage memperluas httpmessage {inputStream getBody () melempar ioException;}#HttpoutputMessage kelas ini adalah abstraksi dari pesan respons HTTP dalam springmvc. Dalam metode write () dari httpmessageConverter, ada parameter formal httpoutputMessage, yang merupakan abstraksi internal dari reseptor "pesan respons" yang digunakan oleh konverter pesan SpringMVC. Konverter pesan menulis "pesan respons" ke dalam pesan respons sesuai dengan aturan tertentu.
Paket org.springframework.http; import java.io.ioException; import java.io.outputStream; antarmuka publik httpoutputMessage memperluas httpmessage {outputStream getBody () melempar ioException;}#HttpmessageConverter abstraksi antarmuka level tertinggi dari konverter pesan menjelaskan karakteristik umum konverter pesan. Kita dapat memahami proses pemikiran desainer Spring3.x tentang mekanisme ini dari metode yang ditentukan dalam antarmuka ini.
Paket org.springframework.http.converter; import java.io.ioexception; import java.util.list; impor org.springframework.http.httpinputMessage; impor org.spramework.http.httpoutputMessage orgramework.htp.htpoutputMessage; antarmuka httpmessageConverter <T> {boolean canread (kelas <?> clazz, mediatype mediatype); Boolean CanWrite (Class <?> Clazz, Mediatype Mediatype); Daftar <mediatype> getsupportedMediatypes (); T baca (class <? Extends t> clazz, httpinputMessage inputMessage) melempar ioException, httpmessagenotreadable exception; void write (tt, mediatype contentType, httpoutputMessage outputMessage) melempar ioException, httpmessagenotwritable exception;}Definisi antarmuka httpmessageConverter telah memasangkan metode canRead (), read (), dan canWrite (), write (). Mediatype adalah enkapsulasi atribut tipe media yang diminta. Misalnya, ketika kami mendeklarasikan metode pemrosesan berikut.
@RequestMapping (value = "/string", method = requestMethod.post) public @ResponseBody String readString (@RequestBody String String) {return "baca string '" + string + "';}Sebelum SpringMVC memasuki metode ReadString, ia akan memilih kelas implementasi HTTPMessageConverter yang sesuai sesuai dengan anotasi @RequestBody untuk menguraikan parameter permintaan ke dalam variabel string. Secara khusus, kelas StringHttpMessageConverter digunakan. Metode canRead () mengembalikan true, dan kemudian metode baca () akan membaca parameter permintaan dari permintaan dan mengikat ke variabel string dari metode readString ().
Ketika SpringMVC mengeksekusi metode ReadString, karena nilai pengembalian mengidentifikasi @ResponseBody, SpringMVC akan menggunakan metode Write () dari StringHttpMessageConverter dan tulis hasilnya sebagai nilai string ke pesan respons. Tentu saja, metode canWrite () mengembalikan true saat ini.
Kita dapat menggunakan angka berikut untuk menggambarkan secara singkat proses ini.
#RequestresponseBodyMethodProcessor kelas yang dijelaskan dalam set proses di atas adalah org.springframework.web.servlet.mvc.method.annotation.requestresponseBodyMethodprocessor. Kelas ini mengimplementasikan antarmuka HandlermethoDargumentResolver dan HandlermethodReturnValueHandler. Yang pertama adalah antarmuka kebijakan yang mengikat pesan permintaan ke parameter formal dari metode pemrosesan, dan yang terakhir adalah antarmuka kebijakan yang memproses nilai pengembalian metode pemrosesan. Kode sumber dari kedua antarmuka adalah sebagai berikut:
Paket org.springframework.web.method.support; impor org.springframework.core.methodparameter; impor org.springframework.web.bind.webdatabinder; impor org.springframework.web.bind.support.webdatabinder; org.springframework.web.context.request.nativeWebRequest; antarmuka publik HandlermethodargumentResolver {Boolean Supportsparameter (parameter MethodParameter); Objek resolveargument (parameter MethodParameter, ModelAndViewContainer Mavcontainer, NativeWebRequest WebRequest, WebDataBinderFactory BindFactory) melempar pengecualian;} paket org.springframework.web.method.support; impor org.spramram.core.web.method.support; impor org.spramram.core.core.method.support; impor org.spramram.core.core.method.support; org.springframework.web.context.request.nativeWebRequest; antarmuka publik HandlermethodReturnValueHandler {boolean mendukung retReturnType (MethodParameter returnType); void handlereturnValue (objek returnValue, methodparameter returnType, modelAndViewContainer Mavcontainer, NativeWebRequest WebRequest) Lempar Pengecualian;}Kelas RequestResponseBodyMethodProcessor juga berfungsi sebagai dua peran: analisis parameter metode dan pemrosesan nilai pengembalian. Dari kode sumbernya, kita dapat menemukan implementasi metode dari dua antarmuka di atas.
Implementasi Antarmuka HandlermethoDargumentResolver:
Public Boolean Supportsparameter (MethodParameter Parameter) {return parameter.hasparameterAnnotation (requestBody.class);} Public Object ResolVeARGument (MethodParameter Parameter, ModelAndViewContainer MavContainer, NativeWebRequest WebReQuest, WebdatabinderErgererer Bindfacoryer, NativeWequest) WebRequest, WebdatabinderEfactory Bindfacoryer, NativeWequest) WebReQuest, WebdatabinderEfactory Bindfacoryer, NativeWeQuest WebReQuest, WebdatabinderEfacory Bindfacory ReadWithMessageConVerters (WebRequest, Parameter, Parameter.GetGenericParameterType ()); String name = conventions.getVariablenameforparameter (parameter); Binder webdatabinder = bindfactory.createBinder (webRequest, argumen, nama); if (argumen! = null) {validate (binder, parameter); } mavcontainer.addattribute (bindingResult.model_key_prefix + name, binder.getBindingResult ()); mengembalikan argumen;}Implementasi antarmuka HandlermethodReturnValueHandler
public boolean supportsReturnType(MethodParameter returnType) { return returnType.getMethodAnnotation(ResponseBody.class) != null;} public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpmediatypeNotacceptableException {mavcontainer.setRequestHandled (true); if (returnValue! = null) {writeWithMessageConVerters (returnValue, returnType, webRequest); }}Setelah membaca kode di atas, seluruh konteks konversi pesan HTTPMessageConverter sudah sangat jelas. Karena implementasi kedua antarmuka didasarkan pada apakah ada @RequestBody dan @ResponseBody sebagai kondisinya, dan kemudian HTTPMessageConverter masing -masing dipanggil untuk membaca dan menulis pesan.
Jika Anda ingin bertanya cara melacak RequestResponseBodyMethodProcessor, silakan ikuti ide-ide posting blog sebelumnya, dan kemudian pergi ke Spring-MVC-Showcase untuk mengunduh kode sumber dan men-debug contoh terkait HTTPMessageConverter. Selama Anda bersedia bekerja keras, saya yakin Anda pasti akan mendapatkannya sendiri.
#Watching Zhang Xiaoloong Ketika berbicara tentang esensi WeChat, dia berkata: "WeChat hanyalah sebuah platform, dan pesan beredar di dalamnya." Dalam proses menganalisis kode sumber SpringMVC kami, kami dapat memahami kebenaran serupa dari mekanisme httpmessageConverter. Di mata desainer SpringMVC, pesan permintaan dan pesan respons diabstraksi ke dalam pesan permintaan httpinputMessage dan pesan respons httpoutputMessage, masing -masing.
Saat memproses permintaan, konverter pesan yang sesuai mengikat pesan permintaan ke objek parameter formal dalam metode. Di sini, mungkin ada beberapa formulir pesan yang berbeda untuk objek yang sama, seperti JSON dan XML. Demikian pula, ketika menanggapi permintaan, nilai pengembalian metode ini juga dapat dikembalikan ke formulir pesan yang berbeda, seperti JSON dan XML.
Di SpringMVC, kami memiliki kelas implementasi HTTPMessageConverter yang berbeda untuk menangani berbagai formulir pesan untuk formulir pesan yang berbeda. Namun, selama "informasi yang valid" yang terkandung dalam pesan -pesan ini konsisten, berbagai konverter pesan akan menghasilkan hasil konversi yang sama. Adapun perbedaan dalam detail penguraian antara berbagai pesan, mereka diblokir di kelas implementasi httpmessageConverter yang berbeda.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.