2011-07-29 15 views
16

Spring MVC 3 Showcase kodunu indirdim. Bir şey beni (birden, birden fazla) bulmaca, neden bu (concision için düzenlenmiş) örnek null geri dönüyor? Bir kontrolör boş görünüm adını döndürür veya void dönüş türü ilan ederseSpring MVC @Controller boş görünüm adını döndürdüğünde ne anlama geliyor?

@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";    
     } 
    } 
} 

cevap

24

, Bahar istek URL'den görünüm adını anlaması deneyecektir. Durumunuzda, görünüm adının form olduğunu varsayar ve bu varsayımı devam ettirir.

Bu, 'un bir uygulamasının kullanıldığı varsayılan uygulama olan DefaultRequestToViewNameTranslator, javadoc for which uygulamasının geçerli kuralları açıklar. İşleyici yöntemlerini çağırmak için

+0

RequestToViewNameTranslator Bean'in açıkça sağlanması gerekiyor mu yoksa Spring bunu kutudan çıkarır mı? – acvcu

2

AnnotationMethodHandlerAdapter.invokeHandlerMethod(). Burada bir ModelAndView, ServletHandlerMethodInvoker.getModelAndView() aracılığıyla alınacaktır.

Durumunuza göre, getModelAndView(), işleyici yönteminin null dönüş değerini sağlar. getModelAndView() yöntemi, dönüş değeri türünü denetler, ancak as in Java null is never an instanceof any class, bu yöntemin mantığı yeni bir ModelAndView oluşturur. Yeni bir ModelAndView, başlangıçta görünüm özelliği null olarak ayarlanmıştır. ModelAndView nesnesine (mv.hasView()) ile ilişkili bir View varsa

sonra daha sonra çağrı yığını kadar DispatcherServlet.doDispatch() olarak, bir test yoktur. view == null, doDispatch() 'ün mantığı mv.setViewName(getDefaultViewName(request)) numaralı telefonu çağırır. Varsayılan uygulaması DefaultRequestToViewNameTranslator olan kayıtlı RequestToViewNameTranslator'a delege eder. Bu alt sınıf, sizin durumunuzda form durumundaki istek URI'sini bir görünüm adına çevirir.

Daha sonra doDispatch() yılında, render() aracılığıyla ->resolveViewName(), bu numune ViewResolver s görünüm adının form sağlanmaktadır. Bu örnekte sadece bir tane ViewResolver, InternalResourceViewResolver kullanılmıştır. Ayrıca, bu InternalResourceViewResolver, /WEB-INF/views/ önekini ve .jsp sonekini görünüm adına eklemek için src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml'da yapılandırılmıştır. Toplam olarak, /WEB-INF/views/form.jsp JSP dosyasını kullanarak bir View oluşturur. Neyse ki, tam olarak bu konumda bir JSP dosyası var.