【SpringMVC 从 0 开始】SpringMVC 的视图

简介: 【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

相关文章
|
SpringCloudAlibaba
SpringCloudAlibaba踩坑日记(三)GateWay type=Service Unavailable, status=503
SpringCloudAlibaba踩坑日记(三)GateWay type=Service Unavailable, status=503
2299 0
SpringCloudAlibaba踩坑日记(三)GateWay type=Service Unavailable, status=503
|
Java Nacos Spring
项目采坑日志—XxlJob配置迁移到Nacos,项目运行提示Could not resolve placeholder ‘xxl.job.accessToken’ in value
项目采坑日志—XxlJob配置迁移到Nacos,项目运行提示Could not resolve placeholder ‘xxl.job.accessToken’ in value
1475 0
|
Java Nacos 微服务
Could not resolve placeholder ‘*‘ in value “${*}“
Could not resolve placeholder ‘*‘ in value “${*}“
1971 0
Could not resolve placeholder ‘*‘ in value “${*}“
|
前端开发 Java 测试技术
Spring Bean 依赖注入常见错误(上)
有时我们会使用@Value自动注入,同时也存在注入到集合、数组等复杂类型的场景。这都是方便写 bug 的场景。
373 0
Spring Bean 依赖注入常见错误(上)
|
21天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9071 29
|
20天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
4153 16
|
19天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2335 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
6天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
492 1