【SpringMVC 从 0 开始】SpringMVC 的视图

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【SpringMVC 从 0 开始】SpringMVC 的视图

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


视图的种类很多,默认有:转发视图和重定向视图。


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


一、ThymeleafView


当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被 SpringMVC 配置文件中所配置的视图解析器解析。


回顾下spring配置文件里的视图解析器的配置:


<!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>


名称拼接视图前缀视图后缀所得到的最终路径,会通过转发的方式实现跳转。


之前写的代码示例一直都是这种,比如:


@RequestMapping("/testThymeleafView")
    public String testThymeleafView() {
        return "success";
    }


二、转发视图


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


当控制器方法中所设置的视图名称以forward:为前缀时,创建 InternalResourceView 视图。


此时的视图名称不会被 SpringMVC 配置文件中所配置的视图解析器解析,而是将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转。


@Controller
public class ViewController {
    @RequestMapping("/testThymeleafView")
    public String testThymeleafView() {
        return "success";
    }
    @RequestMapping("/testToForward")
    public String testToForward() {
        return "forward:/testThymeleafView";
    }
}


控制器方法 testToForward 中,进行了转发forward:/testThymeleafView,去掉forward:之后,就可以转发到/testThymeleafView上。


也就是说,当我访问 http://localhost:8080/springmvc/testToForward,应该跳转显示出 success 页。


1268169-20210815105824879-1376787243.png


三、重定向视图


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


当控制器方法中所设置的视图名称以redirect:为前缀时,创建 RedirectView 视图。

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


继续新增一个控制器方法 testRedirect() 来测试一下:


@Controller
public class ViewController {
    @RequestMapping("/testThymeleafView")
    public String testThymeleafView() {
        return "success";
    }
    @RequestMapping("/testToForward")
    public String testToForward() {
        return "forward:/testThymeleafView";
    }
    @RequestMapping("/testRedirect")
    public String testRedirect() {
        return "redirect:/testThymeleafView";
    }
}


嗯?testToForward()testRedirect()最终都是访问/testThymeleafView,那这2个还不是一样?


其实不一样。


  • 转发访问/testToForward时,页面看到的是 success 页面,浏览器地址栏仍然是/testToForward


  • 重定向访问/testRedirect时,页面看到的是 success 页面,地址栏里也变成了/testThymeleafView


四、转发和重定向区别


转发浏览器是发生一次请求,重定向是2次。


转发可以获取请求域中的数据,但是重定向不可以。因为转发用到一次请求,也就是用到的request对象是同一个。重定向是发送2次请求,是2个request对象。


转发可以访问 WEB-INF 中的资源,但是重定向不可以。因为 WEB-INF 下面的资源具有隐藏性,只能通过服务器内部来访问,不能通过浏览器来访问。


转发不可以跨域,重定向可以。转发是发生在服务器内部的,就只能访问内部的资源。

而浏览器发送了2次请求,通过浏览器可以访问任何资源,比如我重定向到百度首页。


五、视图控制器 view-controller


视图控制器实际上是 springMVC 配置文件里的一个标签,作用也是实现请求地址和视图页面的映射关系。


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


比如:


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


这里就可以注释掉,在springmvc 配置文件中用视图控制器来配置。


<!--
        path:设置处理的请求地址
        view-name:设置请求地址所对应的视图名称
    -->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>


注意这里用的命名空间是 mvc,要去添加上。


重新部署,访问http://localhost:8080/springmvc/


1268169-20210815113501109-641975611.png


依然可以访问成功。


但是当我点击 index 中的超链接的时候报错了404:


1268169-20210815113716547-1881969437.png


这是因为当在配置文件中配置了 view-controller 之后,控制器中写的所有请求映射都失效了。


还需要再加入一个配置,设置开启 mvc 注解驱动的标签:


<!--开启 mvc 的注解驱动-->
    <mvc:annotation-driven />


再次点击跳转,访问成功:


1268169-20210815113951520-95678401.png

相关文章
|
安全 前端开发 Java
SpringMVC的视图
SpringMVC的视图
|
XML 前端开发 数据格式
SpringMVC的视图~
SpringMVC的视图~
|
8月前
|
开发框架 前端开发 Java
SpringMVC视图
SpringMVC视图
38 0
|
前端开发 Java Spring
SpringMVC 中的视图如何使用 Thymeleaf
SpringMVC 中的视图如何使用 Thymeleaf
|
前端开发 Java Spring
SpringMVC-视图解析器
SpringMVC-视图解析器
66 0
|
8月前
|
数据安全/隐私保护 容器
什么是springMVC 视图和视图解析器
什么是springMVC 视图和视图解析器
111 1
|
8月前
|
XML 前端开发 数据格式
springMVC之视图
springMVC之视图
|
关系型数据库 MySQL 数据库
42SpringMVC - SpringMVC小案例
42SpringMVC - SpringMVC小案例
33 0
|
XML Java 应用服务中间件
SpringMVC的配置
SpringMVC的配置
89 0
|
存储 前端开发 Java
SpringMVC深入(组件篇)
1、组件说明 DispatcherServlet:中央控制器,前端控制器 用户请求到达前端控制器(dispatcherServlet),他是整个流程控制的中心,由它负责调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。 这玩意可以理解成一个【咨询处】,你去某个地方办事,先去咨询处问问我们应该先干什么,等第一件事做完了,可以接着去咨询处咨询,你的下一步工作应该是什么。 handler:处理器 Handler也叫后端控制器,在DispatcherServlet的控制下H
289 1