【SpringMVC】| SpringMVC的视图

目录

SpringMVC的视图

1. ThymeleafView

2. 转发视图

3. 重定向视图

4. 视图控制器view-controller


SpringMVC的视图

(1)SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户。

(2)SpringMVC视图的种类很多,默认有转发视图(forward)和重定向视图(redirect)。

(3)若当工程引入jstl(jstl标签库)的依赖,转发视图会自动转换为JstlView。

(4)若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。

1. ThymeleafView

当控制器方法中所设置的视图名称没有任何前缀时(有前缀也就是forward:和redirct:这两种),此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转! 

其实前面一直使用的就是这种方式!

视图解析器

发送请求,并拼接视图解析器中的前后缀 

2. 转发视图

(1)SpringMVC中默认的转发视图是InternalResourceView。

(2)SpringMVC中创建转发视图的情况:当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转!

例如:我们从two跳转到one,此时就不需要视图解析器

此时会去调forward:,直接跳转到/one路径,不会被视图解析器解析,就不会加上前后缀!

注:此时创建的就不是ThymeleafView视图,而是InternalResourceView!

注:如果用的是jsp,那么视图解析器中配置的就是InternalResourceView(没有任何前缀也是这个),就没有ThymeleafView什么事了!

    @RequestMapping("/one")
    public String one(){
        return "success";
    }
    @RequestMapping("/two")
    public String two(){
        return "forward:/one";
    }

3. 重定向视图

(1)SpringMVC中默认的重定向视图是RedirectView。

(2)当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。

复习:转发与重定向

转发实际上是一次请求(相对于浏览器而言),第一次是浏览器发出请求,第二次是发生在服务器内部的;所以地址栏还是第一次发出请求的地址重定向是两次请求,第一次访问的是servlet,第二次是访问我们重定向的地址;地址栏是重定向的地址

转发可以携带数据,因为是一次请求,调用的是同一个request对象。重定向不可以,数据会丢失,因为是两次请求,对应着两个不同的request对象。

转发可以访问WEB-INF下的资源重定向不可以访问WEB-INF下的资源

转发不能跨域。重定向可以跨域

对比转发和重定向的地址栏变化

    @RequestMapping("/one")
    public String one(){
        return "success";
    }
    @RequestMapping("/two")
    public String two(){
        return "forward:/one";
    }

    @RequestMapping("/three")
    public String three(){
        return "redirect:/one";
    }

 使用转发:/two转发到/one(地址栏应该是two),然后经过视图解析解析跳转到success

使用重定向:/three重定向到/one(地址栏应该是one),然后经过视图解析解析跳转到success

4. 视图控制器view-controller

当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使mvc命名空间view-controller标签进行表示!

在springmvc.xml中增加以下配置

①path:设置处理的请求地址;
②view-name:设置请求地址所对应的视图名称。

<mvc:view-controller path="/" view-name="index"></mvc:view-controller>

以上代码就等价于:

    @RequestMapping("/")
    public String demo(){
        return "index";
    }

但是此时会出现一个新的问题:当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效!此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:

<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--开启mvc的注解驱动-->
<mvc:annotation-driven/>

总结:

(1)对于html,一般配置的是Thymeleaf视图解析器,因为对于html是无法使用java代码的;例如我们写路径发送请求时,需要利用thymeleaf的命名空间去处理!

注:此时会根据thymeleaf在one路径前面加上项目的上下文路径名!

<a th:href="@{/one}"></a>

(2)对于jsp,一般的配置的是InternalResourceViewResolver视图解析器,因为对于jsp中是可以使用java代码的,我们可以通过java代码动态获取上下文的路径名!

注:此时使用pageContext.request.contextPath去动态获取上下文的路径名!

<a href="${pageContext.request.contextPath}/one"></a>

猜你喜欢

转载自blog.csdn.net/m0_61933976/article/details/130917385