zoukankan      html  css  js  c++  java
  • springMVC中的HttpSession与Model


    突然发问:相信很多人在做WEB开发的时候,在传属性的时候都用到过这两个,但是这两个有什么区别?使用场景?

    1.1 spring的@MODELATTRIBUTE

    这里有好几种向spring的Model添加数据的方式。数据或者对象通常通过在controller上的注释方法添加到spring中的model中去。下边这个例子中,@ModelAttribute用来将MyCommandBean的实例以key值为myRequestObject添加到model中去

    @Controller
    public class MyController {
     
    	@ModelAttribute("myRequestObject")
    	public MyCommandBean addStuffToRequestScope() {
    		System.out.println("Inside of addStuffToRequestScope");
    		MyCommandBean bean = new MyCommandBean("Hello World",42);
    		return bean;
    	}
     
    	@RequestMapping("/dosomething")
    	public String requestHandlingMethod(Model model, HttpServletRequest request) {
    		System.out.println("Inside of dosomething handler method");
     
    		System.out.println("--- Model data ---");
    		Map modelMap = model.asMap();
    		for (Object modelKey : modelMap.keySet()) {
    			Object modelValue = modelMap.get(modelKey);
    			System.out.println(modelKey + " -- " + modelValue);
    		}
     
    		System.out.println("=== Request data ===");
    		java.util.Enumeration reqEnum = request.getAttributeNames();
    		while (reqEnum.hasMoreElements()) {
    			String s = reqEnum.nextElement();
    			System.out.println(s);
    			System.out.println("==" + request.getAttribute(s));
    		}
     
    		return "nextpage";
    	}
     
             //  ... the rest of the controller
    }
    

    在一个请求的request中,任何使用@ModelAttribute注解的方法会在controller的handler方法(像上边例子汇总的requestHandlingMethod 方法)之前被调用。在这些handler方法执行前,这些方法把数据增加到java.util.map中最终添加到spring Model中去。这可以通过一个简单的实验证明,我创建了两个jsp页面:index.jsp和nextpage.jsp。index.jsp中的链接用来发送request到web应用中来触发Mycontroller中的requestHandlingMethod()方法。requestHandlingMethod()方法返回“nextpage”作为下一个视图逻辑上的名字,在这个例子中我们解析为nextpage.jsp。
    当这个小的web站点用这种方式执行的时候,controller里边的System.out.println方法表明了@ModelAttribute方法是如何在handler方法之前运行的。它同样也展示了这个MyCommandBean被创建和添加到springModel中去的过程。

    Inside of addStuffToRequestScope
    Inside of dosomething handler method
    --- Model data ---
    myRequestObject -- MyCommandBean [someString=Hello World, someNumber=42]
    === Request data ===
    org.springframework.web.servlet.DispatcherServlet.THEME_SOURCE
    ==WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun Oct 13 21:40:56 CDT 2013]; root of context hierarchy
    org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER
    ==org.springframework.web.servlet.theme.FixedThemeResolver@204af48c
    org.springframework.web.servlet.DispatcherServlet.CONTEXT
    ==WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun Oct 13 21:40:56 CDT 2013]; root of context hierarchy
    org.springframework.web.servlet.HandlerMapping.pathWithinHandlerMapping
    ==dosomething.request
    org.springframework.web.servlet.HandlerMapping.bestMatchingPattern
    ==/dosomething.*
    org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER
    ==org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@18fd23e4
    

    2.1 session的概念

    session即 会话,是客户为实现特定应用目的与系统的多次请求交互。它具体是指一个终端用户与交互系统进行通信的时间间隔,通常指从 注册进入系统到注销退出系统 之间所经过的时间。
    modelAttribute与sessionAttribute区别?

    • modelAttribute:常量定义,比如key,value的映射。像下拉框,多选框等等
    • sessionAttribute:跟用户会话相关的常量,如用户基本信息等

    3.1 示例

    显示当前登录用户的状态信息(二者效果一样)

    controller
      session.setAttribute("admin",admin);
      session.setAttribute("loginUser",username);
    页面
      <a href="#">[[${session.admin.account}]]</a>
      <a href="#">[[${session.loginUser}]]</a>
      (session需要加上)
    
    controller
      model.addAttribute("msg", "账号或密码错误");
    页面
      <a href="javascript:;">[[${msg}]]</a>
      (直接用)
    

    4.1 为什么springmvc框架要使用model这个对象呢?

    在之前原生的Servlet中就有了Session,为什么还要用到Model?
    request他只是一个请求,他的作用就是从客户端发起一个请求,并且携带客户端发起的这个请求所带的参数,在业务层中进行参数的获取并且做出相对应的处理,到这里这个request请求对象的工作就应该结束了,剩下的就是客户端对这个请求和参数做出处理结果并且生成响应response返回客户端。

    所以不应该用request进行存值,来达到模型层和视图层的一个连接,所以才使用model或是modelandview这个专门的对象来进行模型层的存在和视图层的取值

    model会在模型层进行存值,在视图层中,他会去检查model对象中是否用这个属性,有他就会渲染出来,request请求结束后就会自动清除model的数据

    这样一来具体的Model我们可以写在具体的Controller里的方法上,与视图层一一绑定。

  • 相关阅读:
    Spring笔记——装配Bean
    Spring笔记——Spring之旅
    浅读Vue-Router源码记录
    稍微整理ES2020(es11)新东西
    前端实现批量打包下载文件
    CSS常见的三栏灵活布局实现方法
    不吹不黑,学完这篇,PDF导出就没有问题了
    不吹不黑,学完这篇,Word导出就没问题了
    不吹不黑,学完这篇,excel导出就没问题了
    Sass预编译 减法及除法计算问题
  • 原文地址:https://www.cnblogs.com/xhj928675426/p/13229631.html
Copyright © 2011-2022 走看看