spring mvcデータバインディング

7208 ワード

1、spring mvcデフォルトで提供されるデータバインディング類
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {

		List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();



		// Annotation-based argument resolution

		resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));

		resolvers.add(new RequestParamMapMethodArgumentResolver());

		resolvers.add(new PathVariableMethodArgumentResolver());

		resolvers.add(new PathVariableMapMethodArgumentResolver());

		resolvers.add(new MatrixVariableMethodArgumentResolver());

		resolvers.add(new MatrixVariableMapMethodArgumentResolver());

		resolvers.add(new ServletModelAttributeMethodProcessor(false));

		resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));

		resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));

		resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));

		resolvers.add(new RequestHeaderMapMethodArgumentResolver());

		resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));

		resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));



		// Type-based argument resolution

		resolvers.add(new ServletRequestMethodArgumentResolver());

		resolvers.add(new ServletResponseMethodArgumentResolver());

		resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));

		resolvers.add(new RedirectAttributesMethodArgumentResolver());

		resolvers.add(new ModelMethodProcessor());

		resolvers.add(new MapMethodProcessor());

		resolvers.add(new ErrorsMethodArgumentResolver());

		resolvers.add(new SessionStatusMethodArgumentResolver());

		resolvers.add(new UriComponentsBuilderMethodArgumentResolver());



		// Custom arguments

		if (getCustomArgumentResolvers() != null) {

			resolvers.addAll(getCustomArgumentResolvers());

		}



		// Catch-all

		resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));

		resolvers.add(new ServletModelAttributeMethodProcessor(true));



		return resolvers;

	}
2、その中でカスタムクラスを解析するのはServlet ModelAttributeMethodProcessorです.
全パラメータ対応解析クラスは以下の通りです.
Request Parame MethodAgMentReglaver処理タイプ:    1、注解Request Paramを含みますが、処理しないパラメータタイプはMapであり、value値は含まれていません.    2、パラメータタイプはMultiiprtFile、またはjavax.servlet.http.Partのタイプの処理方式です.    1、パラメータタイプがMultiiprtFileであれば、MultipartFileに戻ります.    2、パラメータタイプがList<MultiiprtFile>なら、List<MultiiprtFile>に戻ります.    3、パラメータタイプがjavax.servlet.http.Partの場合、Partに戻ります.    4、そうでない場合はrequest.get Parameeter(「key」)Request Parame MapMethodArgMentReolver処理タイプに戻ります.    1、パラメータはRequest Paramの注釈を含み、注釈のvalue値は空であり、パラメータタイプはMapの処理方式である.    1、parameterをmap形式で保存し、もしvalueに複数の値があれば、最初のPathVarable MethodAgMentResolover処理タイプを取る:    1、注釈を含むPathVarableは、パラメータタイプがMapであり、PathVarableのvalueは空で処理しない方式である:    1、Request Mappingのurl表現に基づいて、対応する値を見つけます.    2、対応する値をパラメータタイプのオブジェクトに変換する    3、View.class.get Name()+「.pathVarables」をkeyとし、パラメータ値はvalueとし、requestのAttributeに入れたPathVarable MapMethodArmage処理タイプ:    1、注釈PathVarableを含み、パラメータタイプはMapであり、PathVarableのvalueは空の処理方式である:    1、Map形式に戻る対象MatrixVarable MethodArgomntResolaver処理タイプ:    1、注釈MatrixVarableを含み、パラメータタイプがMapであり、MatrixVarableのvalueは空です.    1、対応する値をパラメータに反映する例   //GET/owners/42q=11/pets/21q=22    @Request Mapping(value="/owners/{weners}/pets/{petId}、method=Request Method.GET)    public void findPet(        @MatrixVarable(value=「q」、pathVar=「ownerald」)int q 1,        @MatrixVarable(value="q"pathVar="petId")int 2){          //q 1==11     //q 2==22    } MatrixVarable MapMethodAgMentResolover処理タイプ:    1、注釈MatrixVarableを含み、パラメータタイプはMapであり、MatrixVarableのvalueは空の処理方式である:    2、生産Map Servlet ModelAttributeMethodProcessor処理タイプ:    1、パラメータにはコメントModelAttributeの処理方式が含まれています.    1、nameを取得して、デフォルトはvalueです.ない場合はパラメータ名を使用します.    2、もしmodelにnameのオブジェクトが含まれていたら、これは返ってきます.もしなかったらオブジェクトを作成し、request.get Parameterの値を対象に反映します.    3、対象をmodelに入れるRequest Request RespnseBodMethodProcessorの処理タイプ:    1、パラメータには注解Request Bodyの処理方法が含まれています.    1、postデータを対応する対象に変換するRequest PartMethodArgenResoliver処理タイプ:    1、コメントを含むRequest Part    2、タイプはMultiiprtFileですが、Request Paramは注釈されていません.    3、タイプはjavax.servlet.http.Partの処理方式です.    1、対象に戻るタイプのデータRequest Header MethodArmagentReolver処理タイプ:    1、注釈Request Headerを含み、且つタイプはMap処理方式ではない:    1、request.get HeaderValues(name)[0]Request Header MapMethodAgMentReolver処理タイプ:    1、注釈Request Headerを含み、且つタイプはMap処理方式である.    1、HeanderをMap Servlet Cookie Value MethodAgMentResolover処理タイプに変換する:    1、注釈Cookie Valueの処理方法を含む:    1、対応するクッキーを見つけて、パラメータタイプがCookieであればcookieに戻ります.もしStringであれば、cookieの値ExpressionValueMethodAgMentResolaver処理タイプに戻ります.    1、注釈Value処理方式を含む:Servlet Request MethodAgMentResolaver処理タイプ:処理方式:Servlet ResonseMethodAgMentResoliver処理タイプ:    1、処理タイプはWebRequest.class.isAsignable From(paramType)𞓜                ServletRequest.class.isAsignable From(paramType)124                MultiiprtRequest.class.isAsignable From(paramType)                HttpSession.class.isAsignable From(paramType)𞓜                Principal.class.isAsignable From(paramType)𞓜                Locale.class.equals(paramType)124                InputStream.class.isAsignable From(paramType)                Reader.class.isAsignable From;処理方式:    1、対応タイプのRedirectAttributes MethodArmigment Resoliver処理タイプを返します.    1、パラメータタイプはRedirectAttributes処理方式:ModelMethodProcessor処理タイプ:    1、処理タイプはModel処理方式です.    1、Model MapMethodProcessorに戻る処理タイプ:    1、処理タイプはMap処理方式です.    1、Model ErrerMethodArgomntResoloverに戻る処理タイプ:    1、処理タイプはErrers処理方式です.    1、もしmodelにデータがないなら、Illegel StateExceptionの異常を抛り出して、でなければBindingResoult Session Status MethodArtResoliverの処理タイプに戻ります.    1、タイプはSession Stortsの処理方式です.    1、return mavContiner.get Session Starts();UriComponents Builder MethodAgMentResolover処理タイプ:    1、タイプはUriComponents Buiderの処理方式です.    1、UriComponents Buiderに戻る