2011-07-29 28 views
16

Tôi đã tải xuống mã cho số Spring MVC 3 Showcase. Một điều làm tôi khó hiểu (vâng, nhiều hơn một), tại sao điều này (chỉnh sửa cho việc cắt ngắn) trả lại mẫu null?Có nghĩa là gì khi Spring MVC @Controller trả về tên xem rỗng?

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

Trả lời

24

Nếu bộ điều khiển trả về tên chế độ xem rỗng hoặc tuyên bố loại trả về void, Spring sẽ cố suy ra tên chế độ xem từ URL yêu cầu.

Trong trường hợp của bạn, nó sẽ giả sử tên chế độ xem là form và tiếp tục giả định đó.

Thực hiện việc này bằng cách triển khai RequestToViewNameTranslator, triển khai mặc định là DefaultRequestToViewNameTranslator, javadoc for which giải thích các quy tắc chính xác được áp dụng.

+0

Một hạt RequestToViewNameTranslator có phải được cung cấp rõ ràng hay không Spring có cung cấp điều này ra khỏi hộp không? – acvcu

2

AnnotationMethodHandlerAdapter.invokeHandlerMethod() quản lý các phương thức xử lý gọi. Tại đây, ModelAndView sẽ được truy xuất qua ServletHandlerMethodInvoker.getModelAndView().

Trong trường hợp của bạn, getModelAndView() được cung cấp giá trị trả về null phương thức xử lý. Phương thức getModelAndView() kiểm tra kiểu giá trị trả về, nhưng as in Java null is never an instanceof any class, logic của phương thức đó sẽ tạo ra một ModelAndView mới. Mới ModelAndView ban đầu đã xem thuộc tính được đặt thành null.

Sau đó sao lưu ngăn xếp cuộc gọi, trong DispatcherServlet.doDispatch(), có một thử nghiệm nếu đối tượng ModelAndView có một số View được liên kết với nó (mv.hasView()). Vì các cuộc gọi logic view == null, doDispatch() của logic mv.setViewName(getDefaultViewName(request)). Nó ủy quyền cho đăng ký RequestToViewNameTranslator, có cài đặt mặc định là DefaultRequestToViewNameTranslator. Phân lớp này dịch URI yêu cầu thành tên chế độ xem, trong trường hợp của bạn là form.

Sau đó trong doDispatch(), qua render() ->resolveViewName(), của mẫu này ViewResolver s được cung cấp với tên xem form. Chỉ sử dụng một mẫu ViewResolver, InternalResourceViewResolver trong mẫu này. Ngoài ra, InternalResourceViewResolver này được định cấu hình theo số src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml để thêm tiền tố /WEB-INF/views/ và hậu tố .jsp vào tên chế độ xem. Vì vậy, tổng cộng, nó sẽ tạo ra một View bằng cách sử dụng tệp JSP /WEB-INF/views/form.jsp. May mắn thay, một tệp JSP tồn tại ở vị trí chính xác này.

Các vấn đề liên quan