SpringMVC—域对象共享数据,SpringMVC的视图

本文详细介绍了SpringMVC中如何使用ModelAndView、Model、Map和ModelMap向request、session和application域共享数据。同时,讲解了InternalResourceView、RedirectView以及Thymeleaf视图解析器的工作原理。此外,还讨论了视图控制器的使用场景及其配置。

一.域对象共享数据

复习: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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值