thymeleaf给响应页面传递参数(modelandview 中的model)
经过查看源码发现,1.原生方式requestthymeleaf 获得要访问页面的string 值之后,加上前缀加上后缀 ,请求转发,跳转至该页面,所以可以直接设置请求的参数。<a th:href="@{/yuansheng_request}">点我使用原生的request设置request的attribute</a>控制方法:@RequestMapping(value =
从控制器类向前端页面跳转时,传递参数
modelandview 中的model
1.原生方式request
thymeleaf 获得要访问页面的string 值之后,加上前缀加上后缀 ,请求转发,跳转至该页面,所以可以直接设置请求的参数。
<a th:href="@{/yuansheng_request}">
点我使用原生的request设置request的attribute</a>
控制方法:
@RequestMapping(value = "yuansheng_request")
public String display_yuansheng_request_attribute(HttpServletRequest request)
{ request.setAttribute("name","zyk");
//thymeleaf加上前后缀之后,请求转发方式跳转该页面,所以可以使用request设置请求
return "sucess";
}
sucess页面:
servlet原生方式获取数据:<h1 th:text="${name}"></h1>
2.原生session方式
<a th:href="@{/test_session}">点我使用原生设置session的attribute</a>
控制方法
@RequestMapping(value = "/test_session")
public String display_session(HttpSession session)
{
session.setAttribute("sesson","session_zyk");
return "sucess";
}
success页面
session获取:<h1 th:text="${session.sesson}"></h1>
3.原生application方式
@RequestMapping(value = "/test_application")
public String display_application(HttpSession session)
{
ServletContext application= session.getServletContext();
application.setAttribute("testapplication","application_zyk");
return "sucess";
}
<a th:href="@{/test_application}">点我使用原生设置application的attribute</a>
success页面
application获取:<h1 th:text="${application.testapplication}"></h1>
4.ModelAndView设置参数(官方推荐)
<a th:href="@{/ModelAndView_request}">
点我使用ModelAndView设置request的attribute</a>
控制方法:
@RequestMapping(value = "ModelAndView_request")
public ModelAndView display_modelandview()
{
ModelAndView mav=new ModelAndView();
mav.addObject("modelandview_name","zyk_mvn");
mav.setViewName("sucess");
return mav;
}
sucess页面
modelandview方式获取:<h1 th:text="${modelandview_name}"></h1>
5.model设置参数
控制方法
@RequestMapping(value = "/Model_Request")
public String display_model(Model model)
{
model.addAttribute("model_name","zyk_model");
System.out.println(model.getClass().getName());
return "sucess";
}
<a th:href="@{/Model_Request}">点我使用Model设置request的attribute</a>
sucess页面
model方式获取:<h1 th:text="${model_name}"></h1>
6.map方式设置参数
<a th:href="@{/testMap}">点我使用testMap设置request的attribute</a>
控制方法
@RequestMapping(value = "/testMap")
public String display_model(Map<String,Object> map)
{
map.put("test_map","zyk_map");
System.out.println(map.getClass().getName());
return "sucess";
}
success页面
map方式获取:<h1 th:text="${test_map}"></h1>
7.modelmap设置参数
<a th:href="@{/testmodelmap}">点我使用testMap设置request的attribute</a>
@RequestMapping(value = "/testmodelmap")
public String display_model(ModelMap modelmap)
{
modelmap.addAttribute("testscope","zyk_modelmap");
System.out.println(modelmap.getClass().getName());
return "sucess";
}
success页面
modelmap方式获取:<h1 th:text="${testscope}"></h1>
学习源码
在每个方法设置参数的地方打断点debug调试,在方法栈(就是进入栈中的方法,方法只有进入栈中才可以执行)中,
发现他们都被DispatcherServlet方法调用了
即DispatcherServlet是先于控制方法中的添加属性语句( modelmap.addAttribute("testscope","zyk_modelmap");举个栗子)执行的,并在执行过程中调用了控制方法中添加属性的语句
DispatherServlet这个方法,点进去会发现是这一句 mv=....
而mv是个modelandview对象 所以得出结论如下
看源码的结论:不管用如上的哪种方式,即使是原生request,也会把请求数据放入model,请求页面放入view,最后返回一个modelandview对象
验证:
在mv=...下面打个断点,等它执行完控制器中添加的属性的语句,会发现 mv中已经有刚才传递的数据了
更多推荐
所有评论(0)