Hey, Nice to meet You. 

必有过人之节.人情有所不能忍者,匹夫见辱,拔剑而起,挺身而斗,此不足为勇也,天下有大勇者,猝然临之而不惊,无故加之而不怒.此其所挟持者甚大,而其志甚远也.          ☆☆☆所谓豪杰之士,

SpringMVC入门学习(七)----将数据放入域对象中 (request、session、application)

1、Request域

在SpringMVC中,一般在进行页面跳转时,都会带上该处理器处理完成的数据。我们都知道,SpringMVC的底层是封装了Servlet的代码,所以在SpringMVC中可以使用Servlet中的域对象,当然SpringMVC也额外给我们封装一些其它的域对象供我们使用,如Model、ModelMap。

注:Model、ModelMap和Map的底层其实都是封装了Request请求。

①、使用Model对象

在方法中将Model以形参的形式设置,使用addAttribute设置要传输的数据(注意是addAttribute属性,不是setAttribute)。返回值就是页面名称,这种方式比较常用。

@RequestMapping("/requestAttrModel")
public String requestAttrModel(Model model) {
    model.addAttribute("username", "张三");
    model.addAttribute("password", "123456");
    return "success";
}

②、使用ModelMap

ModelMap 是个Map集合可以使用Map的基本功能,ModelMap 也定义了addAttribute()方法

@RequestMapping("/requestAttrModelMap")
public String requestAttrModelMap(ModelMap modelMap) {
    modelMap.addAttribute("username", "张三");
    modelMap.put("password","123456");
    return "success";
}

③、使用Map

@RequestMapping("/requestAttrMap")
public String requestAttrMap(Map<String, Object> map) {
    map.put("mapName", "mapValue");
    return "success";
}

④、使用HttpServletRequest

这是Servlet中原生的Request域对象。

@RequestMapping("/requestAttrRequest")
public String requestAttrRequest(HttpServletRequest request) {
    request.setAttribute("grapeAttrName", "grapeAttrName");
    return "success";
}

2、Session域

向session域存入数据,真正有效的办法只有一个,直接使用Servlet原生的Session域对象

@RequestMapping("/sessionAttr")
public String sessionAttr(HttpSession session) {
    session.setAttribute("sessionAttrName", "sessionAttrValue");
    return "success";
}

3、Application域

向application域存入数据需要先拿到ServletContext对象。前面介绍过获取ServletContext对象的两种方法。拿到ServletContext对象后调用setAttribute()方法,即可,用的比较少,可以用来加载网页中不经常改变的数据。

@Autowired
private ServletContext servletContext;

@RequestMapping("/application/scope")
public String applicationScope() {
    servletContext.setAttribute("appName", "appValue");
    return "success";
}

4、ModelAndView(推荐)

ModelAndView我们平时中使用的最多的,它表示封装了ModelMap请求域和视图的对象(即数据模型+视图)。使用步骤如下所示:

  • 首先new一个ModelAndView实例
  • 使用addObject()设置需要像页面传输的数据
  • 使用setViewName()设置需要跳转的视图页面
  • 最后将ModelAndView对象返回
  • 这样前台就可以通过EL表达式${name}获取数据了
@RequestMapping("/modelAndView")
public ModelAndView testModelAndView() {
    
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("mavAttrName1", "mavAttrValue1");
    modelAndView.addObject("mavAttrName2", "mavAttrValue2");
    modelAndView.setViewName("success");
    return modelAndView;
}

如果要在ModelAndView中使用转发和重定向也可以在setViewName()中设置。

//转发
modelAndView.setViewName("forward:/WEB-INF/pages/show.jsp");

//重定向,注:重定向不能访问/WEB-INF资源,因为是两次请求
modelAndView.setViewName("redirect:/hello.jsp");
posted @ 2021-05-13 18:46  唐浩荣  阅读(1301)  评论(0编辑  收藏  举报