SpringMVC服务端返回数据

下面介绍controller向jsp页面传递数据的几种方式

请求转发

1.在学习MVC之前,用request的setAttribute方法传递数据

@RequestMapping("/response")                                
public ModelAndView sendData01(HttpServletRequest request) {
    ModelAndView mav = new ModelAndView("result");          
    request.setAttribute("user_name", "清雅轩");               
    return mav;                                             
}                                                           

在jsp页面用el表达式即可接到数据。

2.用ModelAndView的addObject方法

@RequestMapping("/modelandview")                            
public ModelAndView sendData02() {                          
    ModelAndView mav = new ModelAndView("result");          
    Map<String, String> map = new HashMap<String, String>();
    map.put("user_id", "1");                                
    map.put("user_name", "清雅轩");                            
    mav.addObject("map", map);                              
    return mav;
}                                             

3.用ModelMap的addAttribute方法

@RequestMapping("/modelmap")                   
public String sendData03(ModelMap modelMap) {  
    modelMap.addAttribute("user_name", "清雅轩"); 
    return "result";                           
}                                              

这里返回值为一个字符串,而不是ModelAndView对象,实际上字符串形式与ModelAndView的viewName等价,解析器也会将字符串解析出路径。

还有一种返回值为void的形式,这种默认会将@RequestMapping中的请求路径进行解析得出路径。

@RequestMapping("/void")  
public void voidMethod() {
//默认的返回路径为/WEB-INF/void.jsp                 
}                         

4.用Model的addAttribute方法

@RequestMapping("/model")                   
public String sendData04(Model model) {     
    model.addAttribute("user_name", "清雅轩"); 
    return "result";                        
}                                           

5.用Map集合

@RequestMapping("/map")                            
public String sendData05(Map<String, String> map) {
    map.put("user_name", "清雅轩");                   
    return "result";                               
}                                                  

重定向

1.在路径后拼凑数据

@RequestMapping("/redirect")                          
public String sendData06() {                          
    return "redirect:result.jsp?user_name=qingyaxuan";
}                                                     

这种方式传递的数据属于param域,用${param.user_name}可以获取。但是这种方式在地址栏会显示出参数,而且只能传递简单参数

2.用RedirectAttribute的addFlashAttribute方法

因为/WEB-INF/的安全级别很高,重定向方式无法访问/WEB-INF/目录下的jsp文件,所以需要先重定向到controller中再由请求转发访问。

@RequestMapping("/redirect02")                              
public String sendData07(RedirectAttributes redi) {         
                                                            
    Map<String, String> map = new HashMap<String, String>();
    map.put("user_id", "1");                                
    map.put("user_name", "qingyaxuan");                     
    redi.addFlashAttribute("map", map);                     
    redi.addFlashAttribute("account", "account");           
    return "redirect:redirect03";                           
}                                                           
                                                            
@RequestMapping("/redirect03")                              
public String sendData08() {                                
    return "result";                                        
}                                                           

用addFlashAttribute传递的数据属于request域,可用$(requestScope.account)获取。

而且这种方式可以传递复杂数据类型

使用addFlashAttribute方法传值是为了解决下列问题,引用别人的解释说明一下:

正常的MVC Web应用程序在每次提交都会POST数据到服务器。一个正常的Controller (被注解 @Controller标记)从请求获取数据和处理它 (保存或更新数据库)。一旦操作成功,用户就会被带到(forward)一个操作成功的页面。传统上来说,这样的POST/Forward/GET模式,有时候会导致多次提交问题. 例如用户按F5刷新页面,这时同样的数据会再提交一次。

为了解决这问题, POST/Redirect/GET 模式被用在MVC应用程序上. 一旦用户表单被提交成功, 我们重定向(Redirect)请求到另一个成功页面。这样能够令浏览器创建新的GET请求和加载新页面。这样用户按下F5,是直接GET请求而不是再提交一次表单。

虽然这一方法看起来很完美,并且解决了表单多次提交的问题,但是它又引入了一个获取请求参数和属性的难题. 通常当我们生成一次http重定向请求的时候,被存储到请求数据会丢失,使得下一次GET请求不可能访问到这次请求中的一些有用的信息.

Flash attributes 的到来就是为了处理这一情况. Flash attributes 为一个请求存储意图为另外一个请求所使用的属性提供了一条途径. Flash attributes 在对请求的重定向生效之前被临时存储(通常是在session)中,并且在重定向之后被立即移除。

但引述的说法中,数据是被存在session中的,我试的例子中数据是存在request域中的,不知究竟孰是孰非,有知道的dalao希望能指点迷津。

原文地址:https://www.cnblogs.com/qingyaxuan/p/6522995.html