Spring4MVC之请求转发和重定向

本文介绍SpringMVC框架中如何使用重定向和转发功能。通过实例代码演示了控制器方法返回redirect:和forward:前缀字符串时的具体行为,并解释了SpringMVC内部处理这两种类型请求的过程。

 

 

关于重定向

 

一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理

如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:

将 forward: 和redirect: 当成指示符,其后的字符串作为 URL 来处理

redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作

forward:success.jsp: 会完成一个到 success.jsp 的转发操作

 

示例

 

1. 添加请求handler

 

/**
 * 类定义处标记的@RequestMapping 限定了处理器类可以处理所有 URI 为 /user 的请求,它相对于 WEB 容器部署的根路径
 * 
 * @author RabbitX
 */
@Controller
@SessionAttributes(value={"user","time"},types={String.class})
@RequestMapping("/user")
public class UserController {
    	/**
	 * 请求转发和重定向之转发
	 * 
	 */
	@RequestMapping("/testForward")
	public String testForward()
	{
		System.out.println("--------------testForward----------------");
		return "forward:/pages/login.jsp";
	}
	
	/**
	 * 请求转发和重定向之重定向
	 * 
	 */
	@RequestMapping("/testRedirect")
	public String testRedirect()
	{
		System.out.println("--------------testRedirect----------------");
		return "redirect:/pages/login.jsp";
	}
}

 

 

2. 添加jsp内容

 

<li><a href="user/testForward">请求转发和重定向之转发</a></li>
<li><a href="user/testRedirect">请求转发和重定向之重定向</a></li>

 

原理分析

 

1. 在UserController的testForward或testRedirect方法中添加断点调试;

2. 启动调试

 

在调试栈中选中:DispatcherServlet.doDispatch(HttpServletRequest, HttpServletResponse) line: 945

 

 

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

 

 

进入上面代码后面的方法processDispatchResult:

 

 

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

 

进入上面方法内的方法render:

 

 

render(mv, request, response);

 

 

进入上面方法内的方法resolveViewName:

 

view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);

 

进入上面方法内的方法resolveViewName:

 

View view = viewResolver.resolveViewName(viewName, locale);

 

进入方法resolveViewName时,选择类AbstractCachingViewResolver

进入类AbstractCachingViewResolver的方法resolveViewName中的方法createView:

 

return createView(viewName, locale);

 

或者

 

view = createView(viewName, locale);

 

进入方法createView时,选择实现类UrlBasedViewResolver

 

	@Override
	protected View createView(String viewName, Locale locale) throws Exception {
		// If this resolver is not supposed to handle the given view,
		// return null to pass on to the next resolver in the chain.
		if (!canHandle(viewName, locale)) {
			return null;
		}
		// Check for special "redirect:" prefix.
		if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
			String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
			RedirectView view = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());
			return applyLifecycleMethods(viewName, view);
		}
		// Check for special "forward:" prefix.
		if (viewName.startsWith(FORWARD_URL_PREFIX)) {
			String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
			return new InternalResourceView(forwardUrl);
		}
		// Else fall back to superclass implementation: calling loadView.
		return super.createView(viewName, locale);
	}

  

阅读此段代码,可以知道SpringMVC对以redirect:和forward:开头的返回值进行了特殊处理。即进行了请求转发和重定向的处理。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spring MVC 中,可以使用重定向转发来进行请求的跳转。下面是设定重定向转发的几种方式: 1. 重定向: - 使用 `RedirectView` 类:可以在控制器方法中返回一个 `RedirectView` 对象,设置重定向的目标 URL。 - 使用 `RedirectAttributes` 类:可以在控制器方法中将重定向的目标 URL 添加到 `RedirectAttributes` 对象中,并使用 `redirect:` 前缀来指示重定向。 2. 转发: - 使用 `ModelAndView` 类:可以在控制器方法中返回一个 `ModelAndView` 对象,设置转发的视图名称。 - 使用 `forward:` 前缀:可以在控制器方法中使用 `return "forward:/path"` 的方式来指示转发到指定的路径。 下面是一个示例,展示如何在控制器方法中设定重定向转发: ```java @Controller public class MyController { @GetMapping("/redirect") public RedirectView redirectToUrl() { RedirectView redirectView = new RedirectView(); redirectView.setUrl("https://www.example.com"); return redirectView; } @GetMapping("/redirectWithAttributes") public String redirectWithAttributes(RedirectAttributes attributes) { attributes.addAttribute("param", "value"); return "redirect:/targetUrl"; } @GetMapping("/forward") public ModelAndView forwardToView() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("forward:/targetView"); return modelAndView; } } ``` 上述代码中,`/redirect` 路径的请求会被重定向到 `https://www.example.com`,`/redirectWithAttributes` 路径的请求会带着参数重定向到 `/targetUrl`,`/forward` 路径的请求会被转发到 `targetView` 视图。 需要注意的是,在设定重定向转发时,可以使用绝对路径或相对路径,具体根据需求来确定。同时,还可以在路径中使用占位符路径参数来实现动态的跳转。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值