准备对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
准备FreeMarker视图解析器
@Configuration
public class WebConfig {
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
freeMarkerConfigurer.setDefaultEncoding("UTF-8");
freeMarkerConfigurer.setTemplateLoaderPath("classpath:templates");
return freeMarkerConfigurer;
}
@Bean
public FreeMarkerViewResolver freeMarkerViewResolver(FreeMarkerConfigurer freeMarkerConfigurer) {
FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver() {
public AbstractUrlBasedView instantiateView() {
FreeMarkerView freeMarkerView = new FreeMarkerView() {
@Override
protected boolean isContextRequired() {
return false;
}
};
freeMarkerView.setConfiguration(freeMarkerConfigurer.getConfiguration());
return freeMarkerView;
}
};
freeMarkerViewResolver.setContentType("text/html;charset=utf-8");
freeMarkerViewResolver.setPrefix("/");
freeMarkerViewResolver.setSuffix(".ftl");
freeMarkerViewResolver.setExposeSpringMacroHelpers(false);
return freeMarkerViewResolver;
}
}
准备控制器
@Slf4j
static class Controller {
public ModelAndView test1() {
log.warn("test1()");
ModelAndView modelAndView = new ModelAndView("view1");
modelAndView.addObject("name", "张三");
return modelAndView;
}
public String test2() {
log.warn("test2()");
return "view2";
}
@ModelAttribute
public User test3() {
log.warn("test3()");
return new User("李四", 20);
}
public User test4() {
log.warn("test4()");
return new User("王五", 30);
}
public HttpEntity<User> test5() {
log.warn("test5()");
return new HttpEntity<>(new User("赵六", 40));
}
public HttpHeaders test6() {
log.warn("test6()");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", "text/html");
return httpHeaders;
}
@ResponseBody
public User test7() {
log.warn("test7()");
return new User("钱七", 50);
}
}
准备返回值处理器组合
private static HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite() {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = new HandlerMethodReturnValueHandlerComposite();
returnValueHandlerComposite.addHandlers(CollUtil.newArrayList(
new ModelAndViewMethodReturnValueHandler(),
new ViewNameMethodReturnValueHandler(),
new ServletModelAttributeMethodProcessor(false),
new HttpEntityMethodProcessor(CollUtil.newArrayList(jackson2HttpMessageConverter)),
new HttpHeadersReturnValueHandler(),
new RequestResponseBodyMethodProcessor(CollUtil.newArrayList(jackson2HttpMessageConverter)),
new ServletModelAttributeMethodProcessor(true)
));
return returnValueHandlerComposite;
}
处理返回值(打印要渲染的视图)
@SneakyThrows
private static void renderValue(ModelAndViewContainer modelAndViewContainer, ServletWebRequest servletWebRequest,
AnnotationConfigApplicationContext applicationContext) {
try {
log.warn("=========>渲染视图内容");
HttpServletRequest request = servletWebRequest.getRequest();
MockHttpServletResponse response = (MockHttpServletResponse) servletWebRequest.getResponse();
String viewName = modelAndViewContainer.getViewName();
if (StrUtil.isBlank(viewName)) {
viewName = ((String) request.getAttribute(UrlPathHelper.PATH_ATTRIBUTE));
modelAndViewContainer.setViewName(viewName);
log.warn("没有获取到视图名,获取默认视图:{}", viewName);
}
if (!modelAndViewContainer.isRequestHandled()) {
FreeMarkerViewResolver freeMarkerViewResolver = applicationContext.getBean(FreeMarkerViewResolver.class);
View view = freeMarkerViewResolver.resolveViewName(viewName, RequestContextUtils.getLocale(request));
view.render(modelAndViewContainer.getModel(), request, response);
}
for (String headerName : response.getHeaderNames()) {
System.out.println(headerName + "=" + response.getHeaders(headerName));
}
System.out.println(new String(response.getContentAsByteArray(), StandardCharsets.UTF_8));
} catch (Exception e) {
e.printStackTrace();
}
}
测试返回值处理器
test1(ModelAndViewMethodReturnValueHandler)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test1");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}
test2(ViewNameMethodReturnValueHandler)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test2");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}
test3(ServletModelAttributeMethodProcessor)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test3");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRequestURI("test3");
UrlPathHelper.defaultInstance.resolveAndCacheLookupPath(request);
MockHttpServletResponse response = new MockHttpServletResponse();
response.setContentType("text/html;charset=utf-8");
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}
test4(ServletModelAttributeMethodProcessor)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test4");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRequestURI("test4");
UrlPathHelper.defaultInstance.resolveAndCacheLookupPath(request);
MockHttpServletResponse response = new MockHttpServletResponse();
response.setContentType("text/html;charset=utf-8");
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}
test5(HttpEntityMethodProcessor)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test5");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}
test6(HttpHeadersReturnValueHandler)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test6");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}
test7(RequestResponseBodyMethodProcessor)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(WebConfig.class);
Method method = Controller.class.getMethod("test7");
Controller controller = new Controller();
Object returnValue = method.invoke(controller);
HandlerMethod handlerMethod = new HandlerMethod(controller, method);
MethodParameter returnType = handlerMethod.getReturnType();
ModelAndViewContainer modelAndViewContainer = new ModelAndViewContainer();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);
HandlerMethodReturnValueHandlerComposite returnValueHandlerComposite = returnValueHandlerComposite();
if (returnValueHandlerComposite.supportsReturnType(returnType)) {
returnValueHandlerComposite.handleReturnValue(
returnValue, returnType, modelAndViewContainer, servletWebRequest
);
System.out.println(modelAndViewContainer.getModel());
System.out.println(modelAndViewContainer.getViewName());
renderValue(modelAndViewContainer, servletWebRequest, annotationConfigApplicationContext);
}