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里的方法上,与视图层一一绑定。

原文地址:https://www.cnblogs.com/xhj928675426/p/13229631.html