结论:
a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同。
b.当使用@ModelAttribute注解请求参数时,springmvc自动将该参数放入model,modelmap,map中。
c.model,modelmap,map中put,request.setattribute(),b中@ModelAttribute以及modelandveiw.addObj()效果相同,return时都是将参数放request的attribute中。
d.model,modelmap,map,modelandview的生命同期仅存在于当前方法内,forward/return后重新生成新空对象。
e.当使用redirectAttribute.addFlashAttribute重定向时,FlashAttribute会自动注入下一个action内部model,modelmap,map,详细请参考FlashAtrribute详细中的3.2model跟踪。
1.发送请求:http://localhost:8080/project/page/login/ModelTest/Map.do?aa=111&bb=333
@Controller @RequestMapping("/page/login/ModelTest") public class ModelTestController { @RequestMapping(value = "/Map.do") public String MapTest(HttpServletRequest request, Mapmap) { System.out.println("hello"); System.out.println(map); map.put("step1", "step1"); PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName());//打印 map.put("step2", "step2"); request.setAttribute("step3", "step3"); final HttpSession session = request.getSession(); session.setAttribute("step4", "step4"); // return "../loginSuccess.jsp"; return "Map1.do"; } }
输出:
hello
{}
================com..controller.ModelTestController====================
print request parameter:
aa==111
bb==333
print request attribute:
print session parameter:
step4==step4
结论:map的初始值为空
2.当请求forward到第二个action(Map1.do)中
@RequestMapping(value = "/Map1.do") public ModelAndView MapTest1(HttpServletRequest request, @ModelAttribute("aa") String aa, Mapmap, Model model) {
ModelAndView mav = new ModelAndView(); System.out.println("welcome to MapTest1"); model.addAttribute("mdbefore", "before"); System.out.println(map); System.out.println("................"); System.out.println(model.asMap()); model.addAttribute("mdafter", "after"); System.out.println("hello"); System.out.println(map); System.out.println("................"); System.out.println(model.asMap()); PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName() + "1"); mav.addObject("name", "mike");
mav.setViewName("Map2.do");
// return "Map2.do";
return mav;
//return new ModelAndView("Map2.do","name","mike");//红色部分代码可用这一句代替
}
输出:
welcome to MapTest1
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before}
................//aa由形参@ModelAttribute(“aa”)注入
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before}
hello
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before, mdafter=after}
................
{aa=111, org.springframework.validation.BindingResult.aa=org.springframework.validation.BeanPropertyBindingResult: 0 errors, mdbefore=before, mdafter=after}
================com.controller.ModelTestController1====================
print request parameter:
aa==111
bb==333
print request attribute:
step3==step3 //上一个action中map.put加入
step2==step2
step1==step1 //上一个action中request.setattribute加入
print session parameter:
step4==step4
结论:
a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同。
b.当使用@ModelAttribute注解请求参数时,springmvc自动将该参数放入model,modelmap,map中。
3.当请求进入第三个action(Map2.do)时
@RequestMapping(value = "/Map2.do") public String MapTest2(HttpServletRequest request, Mapmap, Model model, ModelMap mm) { System.out.println("welcome to MapTest2"); model.addAttribute("mdbefore2", "before2"); System.out.println(map); System.out.println("................"); System.out.println(model.asMap()); System.out.println("................"); System.out.println(mm); model.addAttribute("mdafter2", "after2"); System.out.println("hello"); System.out.println(map); System.out.println("................"); System.out.println(model.asMap()); PrintRequestInfo.printSessionAndRequest(request, ModelTestController.class.getName() + "2"); return "../loginSuccess.jsp"; }
输出结果:
welcome to MapTest2
{mdbefore2=before2}
................
{mdbefore2=before2}
................
{mdbefore2=before2}
hello
{mdbefore2=before2, mdafter2=after2}
................
{mdbefore2=before2, mdafter2=after2}
================com.controller.ModelTestController2====================
print request parameter:
aa==111
bb==333
print request attribute:
mdbefore==before//由上一个action中model.addAtrribute加入
step3==step3
step2==step2
step1==step1
mdafter==after//由上一个action中model.addAtrribute加入
aa==111 //aa由上一个action形参@ModelAttribute(“aa”)注入
name=mike// name由上一个action中modelAndView.addObject()加入
print session parameter:
step4==step4
结论:
c.model,modelmap,map中put,request.setattribute(),b中@ModelAttribute以及modelandveiw.addObj()效果相同(可以自己测试),return时都是将参数放request的attribute中。
d.model,modelmap,map,modelandview的生命同期仅存在于当前方法内,forward/return后重新生成新空对象
打印方法代码
public class PrintRequestInfo { public static void printSessionAndRequest(HttpServletRequest request, String remark) { System.out.println("================" + remark + "===================="); System.out.println("print request parameter:"); final Enumeration reqEnum = request.getParameterNames(); while (reqEnum.hasMoreElements()) { final String s = (String) reqEnum.nextElement(); System.out.println(s + "==" + request.getParameter(s)); } System.out.println("print request attribute:"); final Enumeration reqAttrs = request.getAttributeNames(); while (reqAttrs.hasMoreElements()) { final String s = (String) reqAttrs.nextElement(); System.out.println(s + "==" + request.getAttribute(s)); } System.out.println("print session parameter:"); final HttpSession session = request.getSession(); final Enumeration se = session.getAttributeNames(); while (se.hasMoreElements()) { final String key = (String) se.nextElement(); System.out.println(key + "==" + session.getAttribute(key)); } } }
4.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting pagetitle> head> <body> This is webSuc JSP page. <br> ${name}<br> ${aa}<br> <c:out value="Hello World">c:out> ${param.name}<br> <%=request.getAttribute("name") %><br> ${aa} body> html>
jsp页面结果:
This is webSuc JSP page.
mike
111
Hello World
mike
111