2011-07-29 9 views
16

Spring MVC 3 Showcaseのコードをダウンロードしました。 1つのことが私を困惑させる(まあ、1つ以上)、なぜこれは(concisionのために編集された)サンプルを返すnullSpring MVC @Controllerがnullビュー名を返すとはどういう意味ですか?

@Controller 
@RequestMapping("/form") 
public class FormController { 
    @RequestMapping(method=RequestMethod.POST) 
    public String processSubmit(@Valid FormBean form, 
       BindingResult result, 
       WebRequest webRequest, 
       HttpSession session, Model model) { 

     if (result.hasErrors()) { 
      return null; 
     } else { 
      session.setAttribute("form", form); 
      return "redirect:/form";    
     } 
    } 
} 

答えて

24

コントローラがnullビュー名を返す、またはvoid戻り値の型を宣言した場合は、春には、リクエストURLからビュー名を推測しようとします。

あなたのケースでは、ビュー名はformと想定し、その前提に従います。

RequestToViewNameTranslatorの実装を使用してこれを実行します。この実装のデフォルト実装はDefaultRequestToViewNameTranslatorです。javadoc for whichは、適用するルールを正確に説明しています。

+0

RequestToViewNameTranslator Beanを明示的に提供する必要がありますか、またはSpringがこれをボックスの外に提供していますか? – acvcu

2

AnnotationMethodHandlerAdapter.invokeHandlerMethod()は、ハンドラメソッドの呼び出しを行います。ここでModelAndViewServletHandlerMethodInvoker.getModelAndView()で検索されます。

getModelAndView()には、ハンドラメソッドのnull戻り値が指定されています。 getModelAndView()メソッドは戻り値の型をチェックしますが、as in Java null is never an instanceof any class、そのメソッドのロジックは新しいModelAndViewを作成します。新しいModelAndViewのビューのプロパティは、最初にnullに設定されています。 ModelAndViewオブジェクトが(mv.hasView())に関連Viewを有する場合

そして後でコールスタックアップ、DispatcherServlet.doDispatch()に、テストがあります。 view == nullのため、doDispatch()のロジックはmv.setViewName(getDefaultViewName(request))を呼び出します。それは登録されたRequestToViewNameTranslatorに委任され、そのデフォルト実装はDefaultRequestToViewNameTranslatorです。このサブクラスは、リクエストURIをビュー名に変換します(ケースform)。

その後doDispatch()で、render()経由 - >resolveViewName()、このサンプルのViewResolver sがビュー名formが設けられています。このサンプルではViewResolver,InternalResourceViewResolverの1つだけが使用されています。また、このInternalResourceViewResolversrc/main/webapp/WEB-INF/spring/appServlet/servlet-context.xmlに設定され、接頭辞/WEB-INF/views/と接尾辞.jspをビュー名に追加しました。合計で、というJSPファイルを使用してViewを作成します。幸いにも、JSPファイルはまさにこの場所にあります。

関連する問題