原创

SpringMVC轻量级框架之控制器重定向跳转原理分析

        Spring是一个开源轻量级的Java开发框架。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。而SpringMVC属于SpringFrameWork的后续产品,Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。


SpringMVC框架控制器(controller)之间的跳转需要重定向操作,可以分为如下几种情况:

1)不带参数跳转形式

2)拼接Url带参数跳转形式

3)不拼接参数而带参数跳转形式


1. 首先介绍一下不带参数跳转形式,如:新增用户操作后跳转至用户列表页面。

方式一:使用ModelAndView对象

@RequestMapping(value = "add",method = RequestMethod.POST)
public ModelAndView addUser(){
	...
	return new ModelAndView("redirect:/user/userList");
}

方式二:返回String字符串

@RequestMapping(value = "add",method = RequestMethod.POST)
public String addUser(){
	return "redirect:/user/userList";
}

等方式都可以满足不带参数重定向跳转,其他形式就不一一介绍,注意:Spring跳转都是基于response封装开发的。


2. 拼接Url带参数跳转形式,如:用户列表页面查询操作,跳转后查询页面条件不能丢失。

方式一:使用ModelAndView对象

@RequestMapping(value = "add",method = RequestMethod.POST)
public ModelAndView addUser(){
	...
	return new ModelAndView("redirect:/user/userList?param1="+value1+"&param2="+value2);
}

方式二:返回String字符串

@RequestMapping(value = "add",method = RequestMethod.POST)
public String addUser(){
	return "redirect:/user/userList?param1="+value1+"&param2="+value2;
}


3. 不拼接参数而带参数跳转形式,如:登录操作时信息不对外公开。

@RequestMapping("login")
public ModelAndView login(RedirectAttributes attr)
               throws Exception {
	...
	attr.addAttribute("userId", "u100001");  
	attr.addFlashAttribute("name", "路人宅");  
    attr.addFlashAttribute("success", "登录成功!");
    return new ModelAndView("redirect:/index");
}

@RequestMapping("/index")
public String save(@ModelAttribute(RedirectAttributes attr)
               throws Exception {
	Map map = attr.getFlashAttributes();
	String name = (String) map.get("name");
	...
	return "redirect:/user/userList";
}

带参数使用RedirectAttributes参数进行传递注意事项:

1)使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面,如上面代码Url地址为http:/127.0.0.1/user/userList.action?userId=u100001

2)使用addFlashAttribute不会跟随在URL后面,会把参数值暂时保存于session,待重定向url获取该参数后从session中移除,redirect必须是方法映射路径(跳转controller控制器)。

3)使用RedirectAttributes对象来完成传递参数操作,但是没有进行redirect重定向,Spring不会将RedirectAttributes参数传递过去,默认传forward对应的model,官方的建议是:p:ignoreDefaultModelOnRedirect="true" />设置RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect属性,可以提高效率,避免不必要的检索。


分析原理:将传递参数存临时放入session对象中(为了防止不同重定向请求的数据相互影响,存在有锁处理机制),重定向成功后session将其参数立即移除,观察后台刷新页面后值已经不存在。

关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

相关推荐

评论

分享:

支付宝

微信