まとめ
SpringMVCはメッセージコンバーターを使用して、リクエストメッセージとオブジェクト、オブジェクト、応答メッセージの間の自動変換を実現します。
SpringMVCでは、2つのAnnotations @RequestBodyと@ResponseBodyを使用して、リクエストメッセージのオブジェクトとオブジェクトへのコンバージョンをそれぞれ回答することができます。基礎となる柔軟なメッセージ変換メカニズムは、新しく導入されたhttpmessageconverterであるメッセージコンバーターメカニズムであり、これは春3.xで新しく導入されたhttpmessageConverterです。
#HTTPリクエストの抽象化は、リクエスト応答、つまりリクエスト本体を解析してから応答メッセージを返すために、まだリクエスト応答に戻ることです。これは、最も基本的なHTTPリクエストプロセスです。サーブレットの標準では、javax.servlet.servletrequestインターフェイスの次の方法を使用できることがわかっています。
public servletinputStream getInputStream()はiOExceptionをスローします。
servletinputStreamを取得します。このservletinputStreamでは、生リクエストメッセージのすべての内容を読むことができます。同様に、javax.servlet.servletResponseインターフェイスでは、次の方法を使用できます。
public servletoutputStream getOutputStream()はiOExceptionをスローします。
ServletOutputStreamを取得するには、JavaのOutputStreamから継承されたこのサーブレットプットスティームを使用すると、HTTP応答パケットコンテンツを出力できます。
SpringMVCのデザイナーのように考えてみましょう。 HTTPリクエストと応答パケットは、本質的に一連の文字列であることがわかっています。リクエストパケットがJavaの世界に来ると、パケットを読むためにServletinputStream入力ストリームにカプセル化されます。応答メッセージは、ServletOutputStreamの出力ストリームを介して出力されます。
ストリームからの元の文字列メッセージのみを読むことができ、同様に、元の文字を出力ストリームにのみ書き込むことができます。 Javaの世界では、ビジネスロジックの処理は、処理の次元としてのビジネス固有のオブジェクトに基づいています。次に、メッセージがSpringMVCに到着し、SpringMVCから出ると、文字列とJavaオブジェクトの間にインピーダンスの問題があります。このプロセスは、開発者が手動で変換することはできません。 Struts2では、OGNLがこの問題に対処するために使用され、SpringMVCではHTTPMessageConverterメカニズムであることがわかります。最初に2つのインターフェイスを見てみましょう。
#HTTPINPUTMESSAGEこのクラスは、SpringMVC内のHTTP要求メッセージの抽象化です。 httpmessageConverterのread()メソッドには、springMVCのメッセージコンバーターが使用する受容体「リクエストメッセージ」の内部抽象化であるhttpinputmessageの正式なパラメーターがあります。メッセージコンバーターは、ルールに従って「要求メッセージ」からメッセージを抽出し、メソッドフォーマルパラメーターで宣言されたオブジェクトに変換します。
Package org.springframework.http; import java.io.ioexception; import java.io.inputstream; public interface httpinputmessage extends httpmessage {inputstream getbody()throws ioexception;}#HTTPOUTPUTMESSAGEこのクラスは、SpringMVC内のHTTP応答メッセージの抽象化です。 httpmessageConverterの書き込み()メソッドには、springMVCのメッセージコンバーターが使用する受容体「応答メッセージ」の内部抽象化であるHTTPOUTPUTMESSAGEの正式なパラメーターがあります。メッセージコンバーターは、特定のルールに従って「応答メッセージ」を応答メッセージに書き込みます。
パッケージorg.springframework.http; Import java.io.ioexception; Import java.io.outputStream; public interface httpoutputmessage extends httpmessage {outputStream getBody()Throws IOException;}#HTTPMESSAGECONVERTERメッセージコンバーターの最高レベルのインターフェイス抽象化は、メッセージコンバーターの一般的な特性を説明します。このインターフェイスで定義されている方法から、このメカニズムに関するspring3.xデザイナーの思考プロセスを理解できます。
Package org.springframework.http.converter; import java.io.ioexception; Import java.util.list; import org.springframework.httpinputmessage; Import org.springframework.http.httpotputmessage; import cubring.springframework;インターフェイスhttpmessageconverter <t> {boolean canread(class <?> clazz、mediatype mediatype); Boolean Canwrite(class <?> clazz、mediatype mediatype);リスト<Mediatype> getSupportedmediatypes(); t read(class <?clazz、httpinputmessage inputmessage)は、ioexception、httpmessagenotreadableexceptionをスローします。 void write(t t、mediatype contentType、httpoutputmessage outputmessage)IoException、httpmessagenotwritexception;}httpmessageconverterインターフェイスの定義には、canread()、read()、およびcanwrite()、write()メソッドをペアにしました。 Mediatypeは、要求されたメディアタイプの属性のカプセル化です。たとえば、次の処理方法を宣言するとき。
@RequestMapping(value = "/string"、method = requestmethod.post)public @responsebody string readstring(@requestbody string){return "read" string '" + string +"' ";}SpringMVCがReadStringメソッドに入る前に、@RequestBodyアノテーションに従って適切なHTTPMessageConverterクラスを選択して、要求パラメーターを文字列変数に解析します。具体的には、stringhttpmessageconverterクラスが使用されます。そのcanread()メソッドはtrueを返し、その後、read()メソッドはリクエストからリクエストパラメーターを読み取り、readstring()メソッドの文字列変数にバインドします。
SpringMVCがReadStringメソッドを実行すると、return値が@ResponseBodyを識別するため、SpringMVCはstringhttpmessageconverterのwrite()メソッドを使用し、結果を応答メッセージの文字列値として書き込みます。もちろん、CANWRITE()メソッドは現時点でTRUEを返します。
次の図を使用して、このプロセスを簡単に説明できます。
#requestResponseBodyMethodProcessor上記のプロセスセットで説明されているクラスはorg.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessorです。このクラスは、HandlermethododargumentResolverとHandlermethodreturnValueHandlerインターフェイスの両方を実装します。前者は、リクエストメッセージを処理方法の正式なパラメーターにバインドするポリシーインターフェイスであり、後者は処理方法の返品値を処理するポリシーインターフェイスです。 2つのインターフェイスのソースコードは次のとおりです。
Package org.springframework.web.method.support; Import org.springframework.core.methodparameter; Import org.springframework.web.bind.webdatabinder; Import org.springframework.web.bind.support.webdatabnidabinderfactory; Import; org.springframework.web.context.request.nativewebrequest; public interface handlermethodargumentresolver {boolean supportsparameter(MethodParameterパラメーター); Object ResolvearGument(MethodParameterパラメーター、ModelandViewContainer MavContainer、NativeWebRequest WebRequest、WebDataBinderFactory BindFactory)Slows Exception; org.springframework.web.context.request.nativewebrequest; public interface handlermethodreturnvaluehandler {boolean supportssreturntype(methodparameter returntype); void handlereturnvalue(object returnvalue、methodparameter returntype、modelandviewcontainer mavcontainer、nativewebrequest webrequest)をスローする;}RequestResponseBodyMethoDProcessorクラスは、メソッドパラメーター分析と戻り値処理の2つの役割としても機能します。ソースコードから、上記の2つのインターフェイスのメソッド実装を見つけることができます。
HandlermethododaRgumentReSolverインターフェイスの実装:
public boolean supportsparameter(methodparameter parameter){parameter.hasparameterannotation(requestbody.class);} public Object Resolveargument(MethodParameter Parameter、ModelandViewContainer MavContainer、NativeWebRequest WebRequest、WebDataBinderFactory = ReadFactis(WebDaveStory) parameter、parameter.getGenericParametertype());文字列名= Conventions.GetVariaBlenameForParameter(パラメーター); webdatabinder binder = bindfactory.createbinder(webrequest、argument、name); if(argument!= null){validate(binder、parameter); } mavcontainer.addattribute(BindingResult.Model_Key_Prefix + name、binder.getBindingResult());引数を返す;}HandLermethodreturnValueHandlerインターフェイスの実装
public boolean supportsreturntype(methodparameter returnType){returnType.getMethodAnnotation(ResponseBody.Class)!= null;} httpmediatypenotacceptableException {mavcontainer.setRequestHandled(true); if(returnValue!= null){writewithmessageconverters(returnValue、returnType、webRequest); }}上記のコードを読んだ後、httpmessageconverterコンバージョンコンテキスト全体がすでに非常に明確です。 2つのインターフェイスの実装は、条件として@RequestBodyと@ResponseBodyがあるかどうかに基づいており、HTTPMESSAGECONVERTERは、メッセージの読み取りと書き込みのためにそれぞれ呼び出されます。
RequestResponseBodyMethodProcessorを追跡する方法を尋ねたい場合は、以前のブログ投稿のアイデアに従い、Spring-MVC-Showcaseにアクセスしてソースコードをダウンロードし、HTTPMessageConverter関連の例をデバッグしてください。あなたが一生懸命働くことをいとわない限り、私はあなたが間違いなくあなた自身を得ると信じています。
#Zhang Xiaolongの監視Wechatの本質について話すとき、彼は言った:「WeChatは単なるプラットフォームであり、メッセージが流れています。」 SpringMVCソースコードを分析するプロセスでは、HTTPMessageConverterメカニズムから同様の真実を理解できます。 SpringMVCデザイナーの目には、リクエストメッセージと応答メッセージが、それぞれリクエストメッセージhttpinputmessageと応答メッセージhttpoutputmessageに抽象化されます。
リクエストを処理するとき、適切なメッセージコンバーターは、要求メッセージをメソッド内の正式なパラメーターオブジェクトにバインドします。ここでは、JSONやXMLなど、同じオブジェクトに複数の異なるメッセージフォームがある場合があります。同様に、リクエストに応答する場合、メソッドの返品値は、JSONやXMLなどの異なるメッセージフォームにも返される場合があります。
SpringMVCでは、異なるメッセージフォームのさまざまなメッセージフォームを処理するために、異なるhttpmessageconverterの実装クラスがあります。ただし、これらのメッセージに含まれる「有効な情報」が一貫している限り、さまざまなメッセージコンバーターが同じ変換結果を生成します。さまざまなメッセージ間の解析の違いについては、異なるhttpmessageconverterの実装クラスでブロックされています。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。