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.
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