域对象共享数据,视图
一.域对象共享数据
复习:4个域对象
page jsp页面内
request 一次请求内
session 浏览器开启到浏览器关闭(就算服务器关闭了,也会钝化和活化)
application(servletContext) 服务器开启到关闭
原生servlet方法与获取请求参数部分类似。
debug看源码发现原生servlet不会用到Model
使用ModelAndView向request 域共享数据(一般使用这个)
- Model:模型 向域对象共享数据的功能
- View:视图 我们设置的视图名称经过视图解析器解析跳转到我们页面的过程
Model
作用:作为数据流转的载体,SpringMVC官方提供的一个对象。
使用:在单元方法上声明Model类型的形参即可。
特点:
请求转发:
model对象中存储的数据,相当于存储到了request对象中
我们在jsp中直接按照request对象作用域取值的方式来获取数据即可。
重定向:
在重定向中,会将第一次请求中model对象的数据作为第二次请求的请求数据携带,第一次请求的model对象销毁。只能携带基本类型的数据。
下面共享数据的方法都会把Model和View封装到ModelAndView对象里
@Controller
public class ScopeController {
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//返回值必须是这个才能被前端控制器解析到
ModelAndView mav =new ModelAndView();
//处理模型数据,即向请求域中共享数据
mav.addObject("testRequestScope","hello.ModelAndView");
//设置视图名称 相当于之前的return String
mav.setViewName("success");
return mav;
}
}
使用Model向request 域共享数据
@RequestMapping("/testModel")
public String testModel(Model model) {
model.addAttribute("testRequestScope", "hello.Model");
return "success";
}
使用Map向request 域共享数据
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map) {
map.put("testRequestScope","hello.map");
return "success";
}
使用MapModel向request 域共享数据
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap) {
modelMap.addAttribute("testRequestScope","hello.modelMap");
return "success";
}
Map,ModelMap,ModelAndView的关系
就是一个类实现了这些接口,虽然说的是很多种方法,但是本质上实现类是同一个
使用了同一个对象org.springfarmework.validation.support.DindingAwareModelMap
分析源码和debug发现本质都是最后封装成了一个ModelAndView
向session域共享数据
向application域共享数据
这两种一般都使用Servlet原生API 在参数位置设置
@RequestMapping("/testSession")
public String testSession(HttpSession session) {
session.setAttribute("testSessionScope","hello.session");
return "success";
}
@RequestMapping("/testApplication")
public String testApplication(HttpSession session) {
ServletContext servletContext = session.getServletContext();
servletContext.setAttribute("testApplicationScope","hello.Application");
return "success";
}
提醒:session.setAttribute 会先get的 也就是如果没有会创建session.setAttribute 会先getsession的 也就是如果没有会创建
二.SpringMVC的视图
thymeleafView
没有前缀就会被配置的thymeleafView解析器解析
debug 看源码发现:你创建什么样的视图,只和你视图名称有关系
使用了thymeleaf后 html只能通过转发去访问

html本来是静态页面,通过thymeleaf渲染实际上就是数据的动态变化,静态到动态的改变。以前的html可没办法从服务器端获取数据并且显示,咱们用的EL和JSTL输出数据都是基于jsp页面进行的.
因为Html页面中有th标签,必须由Thymeleaf在服务器端解析后才能获取结果使用,所以必须要转发.
@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
return "success";
}
InternalResourceView
内部资源视图(如果使用了Thymelea,这个使用的不多)
只能转发到一个html的请求
如果使用的jsp视图解析。配置的是这种的话,就算是没有前缀,使用的也是InternalResourceView。只不过现在配置了thymeleafView。
@RequestMapping("/testForward")
public String testForward(){
//解析时前缀(forward:)去掉,后面的部分使用请求转发跳转
return "forward:/testThymeleafView";
}
@RequestMapping("/testForward")
public String testForward(){
//解析时前缀(forward:)去掉,后面的部分使用请求转发跳转
return "forward:https://www.baidu.com";//错的。No mapping for GET /springMVC_demo3_war_exploded/https://www.baidu.com",
}
RedirectView
当一个事务完成后如:登入,添加,删除,一般使用重定向
解析时前缀(redirect:)去掉,后面的部分使用重定向跳转
转发只能用内部资源,无法跨域;重定向可以
视图控制器
@RequestMapping("/")
public String index(){
return "index";
}
像上面这种,请求映射对应的控制器方法中,没有其他请求过程的处理,只需要设置一个视图名称时使用视图控制器。
<!-- 只写了这个之后 控制器类中的方法会全部失效!!!-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- 开启MVC注解驱动 加上这个恢复-->
<mvc:annotation-driven></mvc:annotation-driven>
本文详细介绍了SpringMVC中如何使用ModelAndView、Model、Map和ModelMap向request、session和application域共享数据。同时,讲解了InternalResourceView、RedirectView以及Thymeleaf视图解析器的工作原理。此外,还讨论了视图控制器的使用场景及其配置。
954

被折叠的 条评论
为什么被折叠?



