Replace ModelAndViewContainer parameter with Object

This commit is contained in:
Rossen Stoyanchev
2011-04-06 15:30:19 +00:00
parent 3ee6734424
commit ca9a3b4584
21 changed files with 92 additions and 100 deletions

View File

@@ -92,7 +92,7 @@ import org.springframework.web.util.WebUtils;
* @author Rossen Stoyanchev
* @since 3.1
*/
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware,
public class RequestMappingHandlerMethodAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware,
InitializingBean {
private WebArgumentResolver[] customArgumentResolvers;
@@ -127,9 +127,9 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i
private final HandlerMethodArgumentResolverContainer binderMethodArgResolvers = new HandlerMethodArgumentResolverContainer();
/**
* Create a {@link RequestMappingHandlerAdapter} instance.
* Create a {@link RequestMappingHandlerMethodAdapter} instance.
*/
public RequestMappingHandlerAdapter() {
public RequestMappingHandlerMethodAdapter() {
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
stringHttpMessageConverter.setWriteAcceptCharset(false); // See SPR-7316

View File

@@ -19,7 +19,6 @@ package org.springframework.web.servlet.mvc.method.annotation;
import java.io.IOException;
import java.lang.reflect.Method;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
@@ -27,11 +26,9 @@ import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodProcessor;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.InvocableHandlerMethod;
import org.springframework.web.method.support.HandlerMethodReturnValueHandlerContainer;
import org.springframework.web.method.support.InvocableHandlerMethod;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ModelAndView;
@@ -95,7 +92,11 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
setResponseStatus((ServletWebRequest) request);
ModelAndViewContainer<View> mavContainer = new ModelAndViewContainer<View>(model);
if (returnValue == null && (isRequestNotModified(request) || usesResponseArgument())) {
return null;
}
ModelAndViewContainer mavContainer = new ModelAndViewContainer(model);
returnValueHandlers.handleReturnValue(returnValue, getReturnType(), mavContainer, request);
return getModelAndView(request, mavContainer, returnValue);
@@ -122,36 +123,32 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
* Create a {@link ModelAndView} from a {@link ModelAndViewContainer}.
*/
private ModelAndView getModelAndView(NativeWebRequest request,
ModelAndViewContainer<View> mavContainer,
ModelAndViewContainer mavContainer,
Object returnValue) {
if (returnValue == null && isResponseHandled(request)) {
return null;
}
else if (returnValueHandlerUsesResponseArgument()) {
if (returnValueHandlerUsesResponseArgument()) {
return null;
}
else {
ModelAndView mav = new ModelAndView().addAllObjects(mavContainer.getModel());
mav.setViewName(mavContainer.getViewName());
if (mavContainer.getView() != null) {
mav.setView(mavContainer.getView());
mav.setView((View) mavContainer.getView());
}
return mav;
}
}
private boolean isResponseHandled(NativeWebRequest request) {
/**
* Check whether the request qualifies as not modified...
* TODO: document fully including sample user code
*/
private boolean isRequestNotModified(NativeWebRequest request) {
ServletWebRequest servletRequest = (ServletWebRequest) request;
return (servletRequest.isNotModified() || (responseStatus != null) || usesResponseArgument());
}
/**
* Whether any of the underlying {@link HandlerMethodArgumentResolver}s or
* {@link HandlerMethodReturnValueHandler}s use the response argument.
* @see HandlerMethodProcessor#usesResponseArgument(MethodParameter)
*/
protected boolean usesResponseArgument() {
return (super.usesResponseArgument() || returnValueHandlerUsesResponseArgument());
return (super.usesResponseArgument() || returnValueHandlerUsesResponseArgument() || (responseStatus != null));
}
private boolean returnValueHandlerUsesResponseArgument() {

View File

@@ -55,11 +55,10 @@ public class DefaultMethodReturnValueHandler implements HandlerMethodReturnValue
return false;
}
@SuppressWarnings("unchecked")
public <V> void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer<V> mavContainer,
NativeWebRequest webRequest) throws Exception {
public void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
for (ModelAndViewResolver resolver : this.customModelAndViewResolvers) {
Class<?> handlerType = returnType.getDeclaringClass();
@@ -67,7 +66,7 @@ public class DefaultMethodReturnValueHandler implements HandlerMethodReturnValue
ExtendedModelMap extModel = (ExtendedModelMap) mavContainer.getModel();
ModelAndView mav = resolver.resolveModelAndView(method, handlerType, returnValue, extModel, webRequest);
if (mav != ModelAndViewResolver.UNRESOLVED) {
mavContainer.setView((V) mav.getView());
mavContainer.setView(mav.getView());
mavContainer.setViewName(mav.getViewName());
mavContainer.addModelAttributes(mav.getModel());
return;

View File

@@ -112,10 +112,10 @@ public class HttpEntityMethodProcessor extends AbstractMessageConverterMethodPro
}
public <V> void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer<V> mavContainer,
NativeWebRequest webRequest) throws Exception {
public void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
if (returnValue == null) {
return;
}

View File

@@ -38,15 +38,14 @@ public class ModelAndViewMethodReturnValueHandler implements HandlerMethodReturn
return false;
}
@SuppressWarnings("unchecked")
public <V> void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer<V> mavContainer,
NativeWebRequest webRequest) throws Exception {
public void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
ModelAndView mav = (ModelAndView) returnValue;
mavContainer.setView((V) mav.getView());
mavContainer.setView(mav.getView());
mavContainer.setViewName(mav.getViewName());
mavContainer.addModelAttributes(mav.getModel());
}
}

View File

@@ -79,10 +79,10 @@ public class RequestResponseBodyMethodProcessor extends AbstractMessageConverter
return new ServletServerHttpRequest(servletRequest);
}
public <V> void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer<V> mavContainer,
NativeWebRequest webRequest)
public void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest)
throws IOException, HttpMediaTypeNotAcceptableException {
if (returnValue != null) {
writeWithMessageConverters(webRequest, returnValue);

View File

@@ -39,17 +39,19 @@ public class ViewMethodReturnValueHandler implements HandlerMethodReturnValueHan
return false;
}
@SuppressWarnings("unchecked")
public <V> void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer<V> mavContainer,
NativeWebRequest webRequest) throws Exception {
public void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
if (returnValue instanceof String) {
mavContainer.setViewName((String) returnValue);
}
else if (returnValue instanceof View){
mavContainer.setView(returnValue);
}
else {
V view = (V) returnValue;
mavContainer.setView(view);
// should not happen
throw new UnsupportedOperationException();
}
}