`

spring mvc redirect

 
阅读更多

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware,
		InitializingBean {

.....
protected final ModelAndView handleInternal(HttpServletRequest request,
												HttpServletResponse response,
												HandlerMethod handlerMethod) throws Exception {

		if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {
			// Always prevent caching in case of session attribute management.
			checkAndPrepare(request, response, this.cacheSecondsForSessionAttributeHandlers, true);
		}
		else {
			// Uses configured default cacheSeconds setting.
			checkAndPrepare(request, response, true);
		}
		
		// Execute invokeHandlerMethod in synchronized block if required.
		if (this.synchronizeOnSession) {
			HttpSession session = request.getSession(false);
			if (session != null) {
				Object mutex = WebUtils.getSessionMutex(session);
				synchronized (mutex) {
					return invokeHandlerMethod(request, response, handlerMethod);
				}
			}
		}
		
		return invokeHandlerMethod(request, response, handlerMethod);
	}


private ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response,
			HandlerMethod handlerMethod) throws Exception {
		
		ServletWebRequest webRequest = new ServletWebRequest(request, response);

		WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
		ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
		ServletInvocableHandlerMethod requestMappingMethod = createRequestMappingMethod(handlerMethod, binderFactory);

		ModelAndViewContainer mavContainer = new ModelAndViewContainer();
		mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
		modelFactory.initModel(webRequest, mavContainer, requestMappingMethod);
		mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);

		requestMappingMethod.invokeAndHandle(webRequest, mavContainer);
		modelFactory.updateModel(webRequest, mavContainer);

		if (mavContainer.isRequestHandled()) {
			return null;
		}
		else {
			ModelMap model = mavContainer.getModel();
			ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model);
			if (!mavContainer.isViewReference()) {
				mav.setView((View) mavContainer.getView());
			}
			if (model instanceof RedirectAttributes) {
				Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes();
				RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes);
			}
			return mav;
		}
	}


.....

}

 

 

public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {

.......

public final void invokeAndHandle(
			NativeWebRequest request, ModelAndViewContainer mavContainer,
			Object... providedArgs) throws Exception {

		Object returnValue = invokeForRequest(request, mavContainer, providedArgs);

		setResponseStatus((ServletWebRequest) request);

		if (returnValue == null) {
			if (isRequestNotModified(request) || hasResponseStatus() || mavContainer.isRequestHandled()) {
				mavContainer.setRequestHandled(true);
				return;
			}
		}

		mavContainer.setRequestHandled(false);

		try {
			returnValueHandlers.handleReturnValue(returnValue, getReturnType(), mavContainer, request);
		} catch (Exception ex) {
			if (logger.isTraceEnabled()) {
				logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
			}
			throw ex;
		}
	}


.......

}

 

 

public class HandlerMethodReturnValueHandlerComposite implements HandlerMethodReturnValueHandler {

...

public void handleReturnValue(
			Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
			throws Exception {

		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType);
		Assert.notNull(handler, "Unknown return value type [" + returnType.getParameterType().getName() + "]");
		handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
	}

...

}

 

public class ViewNameMethodReturnValueHandler implements HandlerMethodReturnValueHandler {

...

public void handleReturnValue(
			Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
			throws Exception {

		if (returnValue == null) {
			return;
		}
		else if (returnValue instanceof String) {
			String viewName = (String) returnValue;
			mavContainer.setViewName(viewName);
			if (isRedirectViewName(viewName)) {
				mavContainer.setRedirectModelScenario(true);
			}
		}
		else {
			// should not happen
			throw new UnsupportedOperationException("Unexpected return type: " +
					returnType.getParameterType().getName() + " in method: " + returnType.getMethod());
		}
	}
	
	/**
	 * Whether the given view name is a redirect view reference.
	 * @param viewName the view name to check, never {@code null}
	 * @return "true" if the given view name is recognized as a redirect view
	 * reference; "false" otherwise.
	 */
	protected boolean isRedirectViewName(String viewName) {
		return viewName.startsWith("redirect:");
	}
...
}
 
分享到:
评论

相关推荐

    spring学习: spring mvc在redirect请求中传递数据

    标题中的“spring学习:spring mvc在redirect请求中传递数据”指的是在Spring MVC框架中,如何在重定向(Redirect)请求过程中传递参数。这通常涉及到HTTP响应的状态码、重定向URL以及模型数据的处理。在Spring MVC...

    spring mvc 注解 增删改 实例

    Spring MVC 是一个强大的Java web开发框架,用于构建高效、可维护和模块化的Web应用程序。它在MVC(Model-View-Controller)设计模式的基础上提供了一种结构化的方法来组织应用程序的逻辑。在这个实例中,我们将重点...

    spring mvc 自學筆記

    ### Spring MVC 数据跳转 在 Spring MVC 中,数据跳转主要指的是控制器(Controller)处理完请求后,将数据转发到视图(View)进行展示的过程。这里的“跳转”实际上是指请求处理后的视图重定向或转发。 #### 转发与...

    spring mvc 快速入门深入分析

    ### Spring MVC 快速入门深入分析 #### 一、Spring MVC 概述 Spring MVC 是 Spring Framework 的一个重要模块,主要用于构建 Web 应用程序。它遵循 MVC(Model-View-Controller)设计模式,将应用程序的不同关注点...

    Spring MVC 登录实例

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、模块化且松散耦合的Web应用程序。这个“Spring MVC登录实例”是一个非常适合初学者上手的项目,它涵盖了Spring MVC的基本概念和流程,让我们逐步深入这个...

    第三课:spring mvc 原理深度解析1

    Spring MVC 是一个强大的 web 框架,它简化了基于模型-视图-控制器(MVC)架构的应用程序开发。本课程将深入讲解 Spring MVC 的核心原理和组件,特别是 HandlerAdapter 的作用。 首先,让我们回顾 MVC 应用场景。在...

    Spring MVC文件上传下载

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、模块化且松散耦合的Web应用程序。在Spring MVC中,文件的上传和下载是常见的功能需求,这涉及到客户端与服务器之间的数据传输。本篇文章将深入探讨Spring...

    Spring MVC validation Example

    在本文中,我们将深入探讨如何使用Spring MVC框架进行基于注解的验证,特别是在Spring Bean Validation框架下。Spring MVC是Spring框架的一部分,它提供了一个强大的模型-视图-控制器(MVC)架构,用于构建Web应用...

    spring MVC学习笔记

    **Spring MVC 学习笔记** Spring MVC 是 Spring 框架的一个模块,专门用于构建 Web 应用程序。它提供了一种模型-视图-控制器(Model-View-Controller)架构,帮助开发者处理请求、控制应用程序流程,并实现业务逻辑...

    Spring MVC常用注解

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。在 Spring MVC 中,注解扮演着非常重要的角色,它们使得代码更加...

    spring mvc controller间跳转 重定向 传参

    Spring MVC controller 间跳转重定向传参 在 Spring MVC 框架中,controller 间跳转重定向传参是一个非常常见的需求。这里,我们将讨论三种常见的情况:不带参数跳转、带参数拼接 URL 形式跳转、带参数不拼接参数...

    Spring MVC 之@ModelAttribute使用.rar

    这个注解的使用涉及到MVC模式中的Model层和View层的交互,是理解Spring MVC工作原理的重要一环。下面将详细阐述`@ModelAttribute`的用法、作用以及它在实际开发中的应用场景。 `@ModelAttribute`主要应用于两个场景...

    spring mvc重定向导致内存溢出解决方案

    ### Spring MVC 重定向导致内存溢出解决方案 在Spring MVC框架中进行页面重定向操作时,可能会遇到因重定向导致的内存溢出问题。本文将详细介绍该问题的原因、原理以及解决方法。 #### 一、问题背景及原因分析 在...

    spring mvc 文档

    ### Spring MVC框架详解 #### 一、目的与假设 **目的**:本文旨在为开发者提供一个快速入门Spring Web应用框架的指南。Spring是一款开源框架,主要用于Web应用开发,其官方网站为http://www.springframework.org。...

    Spring MVC面试题(2022最新版)

    - **设计模式**:Spring MVC遵循传统的MVC模式,而Struts2则采用了拦截器模式。 - **灵活性**:Spring MVC提供了更多的灵活性,因为它是基于POJO的,而Struts2则是基于API的。 - **配置**:Spring MVC更倾向于使用...

    基于注解的Spring mvc增删改DEMO

    在本文中,我们将深入探讨基于注解的Spring MVC在实现增删改操作中的应用。Spring MVC是Spring框架的一部分,主要用于构建Web应用程序。它利用注解简化了开发过程,使得开发者无需编写大量的XML配置文件,就能实现...

    hibernate和spring MVC配置整合

    **hibernate与Spring MVC配置整合详解** 在Java Web开发中,Spring MVC作为控制器层,负责处理用户请求,而Hibernate作为持久化框架,用于管理数据库操作。将这两者结合使用,可以实现MVC架构的高效数据访问。下面...

    spring mvc step by step

    ### Spring MVC Step by Step知识点详解 #### 概览 本文档详细介绍了如何使用Spring Framework MVC框架逐步构建一个完整的Web应用程序。文档版本为2.5,由Thomas Risberg、Rick Evans和Portia Tung共同编著,版权...

Global site tag (gtag.js) - Google Analytics