81°

springMVC中级篇

1 springMVC作用域参数处理

     springMVC提供暂存(共享)数据到http的request对象或者session对象中的支持,主要注解有三个:@RequestAttribute、@SessionAttribute、@SessionAttributes,它们的作用如下:

  • @RequestAttribute获取http的请求(request)对象属性值,用来传递给控制器的参数。
  • @SessionAttribute在http的会话(session)对象属性值中,用来传递给控制器的参数。
  • @SessionAttributes,可以给它配置一个字符串数组,这个数组对应的是数据模型对应的键值对,然后将这些键值对保存到session中。

     也许你会留意到并没有@RequestAttributs这个注解,那是因为在请求的范围中,springMVC更希望你使用它所提供的数据模型Model,它的数据模型本身就是在请求的生命周期中存在的。

   1.1 注解@RequestAttribute

     主要作用是从http的request对象中取出请求属性,它的范围周期在一次请求中存在

<a href="/book//requestAttribute?msg=peppa">peppa</a>
@RequestMapping("/book/requestAttribute")  
public String requestAttr(@RequestAttribute("msg") String name){  
  ........  
}  

     这样就可以获取请求的msg属性了,对于@RequestAttribute注解的参数,默认是不能为空的,否则系统会抛出异常。和@RequestParam一样,它也有一个required配置项,只需要设置它为false,参数就可以为空了:@RequestAttribute(name="msg",required=false)

   1.2 注解@SessionAttribute和@SessionAttributs

     这两个注解和http的session会话对象有关,可以让我们在和服务器会话期间通过它读/写会话对象的属性,缓存一定数据信息。

     先来设置会话属性,在控制器中可以使用注解@SessionAttributes来设置对应的键值对,不过这个注解只能对类进行标注,不能对方法或者参数标注。可以配置属性名称或者属性类型。它的作用是:当这个控制器被注解后,SpringMvc执行完控制器的逻辑后,将数据模型中对应的属性名称或者熟悉类型保存到http的session对象中

package com.wise.tiger.controller;  
@Controller  
@RequestMapping("book")  
//可以配置数据模型的名称和类型,两者取或关系  
@SessionAttributes(names={"id"})  
public class AttributeController{  
   @Autowired private BookService service;  
   @RequestMapping("/sessionAttributes")  
   public String sessionAttrs(Integer id,Model model){  
      //根据类型,session将会保存图书信息  
       model.addAttribute("book",service.findById(id));  
     //根据名称,session将会保存id  
       model.addAttribute("id",id);  
       return "show";  
   }  
}  

     这样就可以在控制器内不使用servlet的api造成侵入的HttpSession对象来设置session的属性了,这更加有利于对测试环境的构建进行测试。既然有了设置Session的属性,那么自然就有读取session属性的要求,通过@SessionAttribute实现获取session对象

<c:set var="id" value="1" scope="session"/>  
<c:redirect url="/book/sessionAttr"/>  

     后台controller获取session属性值:

@RequestMapping("/book/sessionAttribute")  
public String sessionAttr(@SessionAttribute("id") Integer id){  
  ........  
}  

     和@RequestParam一样,@SessionAttribute注解的参数默认是不能为空的,如果要改变这个规则。修改required配置项为false即可。

  1.3 注解@CookieValue和注解@RequestHeader

      从名称而言,这两个注解都很明确,就是从cookie和http请求头获取对应的请求信息,它们的用法比较简单,其大同小异:

@RequestMapping("/getHeaderAndCookie")  
public  String getHeaderAndCookie(@RequestHeader(value="UserAgent",required=false,defaultValue="attribute") String userAgent,
@CookieValue(value="JSESSIONID",required=true,defaultValue="jsession-id" String sessionId){  
 .........  
}  

   1.4 清空session

@RequestMapping("/clear.do")
public void clearSession(SessionStatus status){
	status.setComplete();
}

2 请求分发与重定向

    要将一个图书信息转化为JSON视图的功能,只要传递图书信息给它,它就能将信息转化为视图:

@RequestMapping("/book/showBookJsonInfo")  
public ModelAndView showBookJson(Book book){  
     var mv = new ModelAndView();  
     mv.addObject("book",book);  
     mv.setView(new MappingJackson2JsonView());  
     return mv;  
}  

    现在的需求是,每当新增一个图书信息时,需要将其数据(图书编号会回填)以json视图的形式展示给请求者。在数据保存到数据库后,由数据库返回图书编号,再将图书信息传递给showBookJson方法,就可以展示json视图给请求者了:

@RequestMapping("/book/saveBook")  
//Model为重定向数据模型,Spring Mvc会自动初始化它  
public String saveBook(Book book,Model model){  
     service.save(book);// 插入图书后,会回填图书编号  
     //绑定重定向数据模型  
     model.addAttribute("book",book);//只能传递简单属性,pojo需要flash属性  
     return "redirect:./showBookJsonInfo";  
}  

    这里的Model代表一个数据模型,可以给它附加上对应的数据模型。SpringMVC有一个约定,如果返回的字符串不带redirect,则默认为请求分发;当返回的字符串中带有redirect的时候,它就会认为需要的是一个重定向。而事实上,不仅可以通过返回字符串来实现重定向,也可以通过返回视图来实现重定向。

@RequestMapping("/saveBook2")  
public ModelAndView saveBook2(ModelAndView mv,Book book){  
     mv.addObject("book",book);//只能传递简单属性,pojo需要flash属性  
     mv.setView("redirect:./book/showBookJsonInfo");  
     return mv;  
}  

    但是,这样并不能将参数顺利传递给重定向的地址,因为在url重定向的过程中,http的重定向参数是以字符串传递的,如果需要传递图书pojo来完成任务,这个时候Springmvc提供了一个方法-----flash属性,需要提供的数据模型就是一个RedirectAttribute:

@RequestMapping("/saveBook3")  
public String saveBook3(RedirectAttribute ra,Book book){  
     ra.addFlashAttribute("book",book);//绑定重定向数据模型  
     mv.setView("redirect:./book/showBookJsonInfo");  
     return "redirect:./showBookJsonInfo";  
}  

    这样就能够传递pojo给下一个地址。使用addFlashAttribute方法后,springmvc会将数据保存到session中(session在同一个会话有效),重定向后就会将其清除, 这样就能够传递给下一个地址了。

本文由【红凯】发布于开源中国,原文链接:https://my.oschina.net/u/4134962/blog/3055571

全部评论: 0

    我有话说: