SpringMVC(五)SpringMVC的视图

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

SpringMVC视图的种类很多,默认有转发视图(InternalResourceView)和重定向视图(RedirectView)

当工程引入jstl的依赖,转发视图会自动转换为JstlView

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

1.1ThymeleafVIew

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

我们当前的解析器为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--扫描控制层组件-->
    <context:component-scan base-package="com.rgf.controller"></context:component-scan>

    <!--配置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">
                        <!--/WEB-INF/templates/index.html-->
                        <!--视图前缀+逻辑视图+视图后缀就是我们完整的物理视图,即访问index.html,不用完整路径,即index即可进行访问-->
                        <!--视图前缀-->
                        <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>
</beans>

使用的视图解析器为:ThymeleafViewResolver,被该解析器解析之后为:ThymeleafView

我们在控制方法进行debug:

我们在debug的一个框里面会展示我们当前的一个方法栈,当前方法处于该窗口中, 我们发现DispatcherServlet,找到对应行数:1061行。

存在于方法栈中的方法,在该框中越往上的方法跟当前所要执行的方法的断点所在的位置越近。

越往下,跟当前断点所对应的位置越远。从该方法栈里面从最下面一步步调用到当前所打得断点的位置。

此时我们查看到:

 我们所获取的是一个ModelAndView对象。

再次打断点的位置的作用为执行当前的我们的一个的转发结果 ,此时跳过断点之后我们就已经获取到ModelAndVIew。

此时我们跳过断点之后,我们会发现:

此时的mv已经获取数据: “ModelAndView  ["view="success"  ;model={testRequestScope="Hello,ModelAndView"}。

箭头依次为:下一步(F8)、进入某个方法中(F7)、强制进入某个方法(ALT+Shift+F7)、从某个方法中跳出(shift+F8)、跳过断点(ALT+F9)。

CTRL+G,查找指定行。

我们在进行debug的时候,可以点击下面的红点进行管理断点所在的位置。

 我们选中某一个,点击上端的-即可。

我们创建一个新的controller之后,先在我们的index.html新建一个超链接:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
<a th:href="@{/aaa/test/ant(username='admin')}">测试@RequestMapping注解支持ant风格的路径</a><br>
<br>
<form th:action="@{/param/servletAPI}" method="post">
    用户名: <input type="text" name="username"><br>
    密码:   <input type="password" name="password"><br>
    提交: <input type="submit" value="登录"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
<hr>
<a th:href="@{/test/mav}">测试通过ModelAndView向请求域共享数据</a>
<hr>
<a th:href="@{/test/view/thymeleaf}">测试SpringMVC的视图ThymeleafView</a>
</body>
</html>

我们在新建的controller里面定义新的方法,我们进行打断点如下所示:

 我们点击页面我们所测试的ThymeleafView:

我们发现首先进入 

我们跳过之后进入如下所示:

 

继续跳过之后进入:

 此方法为执行处理我们转发的结果。我们进入该方法进行查看:

我们进去之后,在该处也打一个断点,此处为渲染的意思。此时即可处理我们当前的ModelAndView,然后把我们Model当中的数据共享在我们的请求域中,把我们所设置的逻辑视图创建相对应的视图对象,然后去找到我们相对应的视图。即为页面,然后进行跳转。

此时里面的viewName即为我们设置的success.

此处的 resolveViewName,解析我们当前的视图名称来得到一个视图。所以我们当前所创建的视图只跟我们的视图名称有关。只跟我们当前方法的字符串类型的返回值有关系。

此时,我们的view为ThymeleafView.

ThymeleafView创建过程中没有任何的前缀。

2.InternalRersourceView

SpringMVC中默认的转发视图是InternalResourceView

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

我们新建如下链接:

我们创建新的方法:

我们将其转发到:

 我们在此处进行打断点:

运行之后,点击超链接:

点击之后进入断点:

跳过之后继续查看进入:

 其中的render为渲染视图,来处理ModelAndView.

我们继续进入里面:

此时我们的mv:"ModelAndView[view="forward:.test/model";此时的视图名称如下所示。

跳转完之后,我们查看View里面的值:

 此时的view为InternalResourceView,url为/test/model;将其转发到该url.

此时会创建两个视图,首先转发前会创建InternalResourceView这个视图,跳转成功之后,dispatcherServlet会进行处理forward:.test/model这个请求,即会进入另一个视图。而另一个视图默认为ThymeleafView。

此时我们将断点跳过之后,会再次进入如下断点:

我们继续向下执行的时候,我们的视图名称为success.即可进行跳转到该页面。此时创建出来的视图为ThymeleafView。

此时的过程为点击链接之后,进行跳转到forward:/test/model,携带hello,Model,跳转到success界面。如下所示:

我们比较常用的是ThymeleafView,我们并不是直接跳转页面,而是通过ThymeleafView的视图解析器ThymeleafViewResolver来解析当前的视图,去解析当前页面中ThymeleafView中的语法,才能去渲染页面,看到一个动态数据。

当我们使用

界面是会被Thymeleaf进行渲染的,但是我们使用如下方式进行转发到该界面的时候

界面是不会被Thymeleaf所渲染的,仅仅是一个简单的转发。

如果我们所使用的是一种jsp视图的话:我们需要在配置文件中配置的视图解析器为:InternalResourceViewResolver

此时创建的转发视图也是InternalResourceViewResolver。但是通InternalResourceViewResolver进行转发的是无法进行页面渲染的,ThymeleafView的语法无法被解析,但是ThymeleafView的这种视图是可以进行页面渲染的。

 3.RedirectView

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

我们创建如下链接:

 我们创建新的方法:

 @RequestMapping("/test/view/redirect")
    public  String  testRedirectView(){
        return "redirect:/test/model";
    }

此时我们将项目进行运行:

我们点击如下所示:

我们发现继续进入断点:

我们继续将断点往下走:

我们继续进入里面:

此时我们的mv:"ModelAndView[view="redirect:.test/model";此时的视图名称如此所示。

跳转完之后,我们查看View里面的值:

 此时的view为RedirectView。此时跳转过之后,会继续访问test/model,断点会继续进入该方法:

此时再次创建的视图名称为ThymeleafView。 

此时查看我们所跳转的界面的地址拦:

一般而言,当我们的业务逻辑处理成功的时候用转发,处理失败的时候用重定向。登录成功用转发,登录失败用重定向。 

重定向所跳转到的绝对路径就会被浏览器所解析,而浏览器解析的绝对路径是把/解析为localhost:8080.而我们当前设置的重定向的路径,都可以成功进行跳转,说明在跳转过程中会自动在绝对路径前面加一个上下文路径。

4.视图控制器view-controller

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

例如我们要进行跳转到首页:

我们必须要有这个方法才能跳转到index.html首页。

我们利用view-controller,在配置文件里面进行配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--扫描控制层组件-->
    <context:component-scan base-package="com.rgf.controller"></context:component-scan>

    <!--配置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">
                        <!--/WEB-INF/templates/index.html-->
                        <!--视图前缀+逻辑视图+视图后缀就是我们完整的物理视图,即访问index.html,不用完整路径,即index即可进行访问-->
                        <!--视图前缀-->
                        <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>
    <!--视图控制器:为当前的请求直接设置视图名称实现页面跳转-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>

我们即可直接进行跳转该页面。

我们将该方法进行注掉:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ProtalController {
    @RequestMapping("/")
    public  String  protal(){
        return  "index";
    }
}

进行重新部署,我们回到首页,进行刷新:

仍然可以访问首页。

此时点击其他链接,发现出现了:404

 如果我们在当前配置文件中使用了view-controller视图控制器,当前只有视图控制器所设置的请求才能被处理。此时要在配置文件里再加一个标签:<mvc:annotation-driver/>,开启mvc的注解驱动

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--扫描控制层组件-->
    <context:component-scan base-package="com.rgf.controller"></context:component-scan>

    <!--配置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">
                        <!--/WEB-INF/templates/index.html-->
                        <!--视图前缀+逻辑视图+视图后缀就是我们完整的物理视图,即访问index.html,不用完整路径,即index即可进行访问-->
                        <!--视图前缀-->
                        <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>
    <!--开启mvc的注解驱动-->
    <mvc:annotation-driver/>
    <!--视图控制器:为当前的请求直接设置视图名称实现页面跳转
    若设置视图控制器,则只有视图控制器所设置的请求会被处理,其他的请求将全部404
    此时必须再配置一个标签 <mvc:annotation-driver/>,从而开启mvc的注解驱动
    <mvc:annotation-driver/>,在好多功能里面都要使用这个标签,(在处理静态资源的时候,处理ajax请求,处理json数据的时候),都是要加上这个标签。
    -->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>

此时设置之后,我们的链接都可以进行点击。即视图解析器和@RequestMapping实现的界面跳转都可以实现。此时我们再次访问首页,其他界面都可以进行点击。

 点击其他的也可以成功进行跳转:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/178753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5-8输出水仙花数

#include<stdio.h> int main(){int i,j,k;int n;for(n100;n<1000;n){in/100;jn/10-i*10;kn%10;if(ni*i*ij*j*jk*k*k)printf("%d ",n);}printf("\n");return 0; }

golang学习笔记——罗马数字转换器

文章目录 罗马数字转换器代码 参考LeetCode 罗马数字转整数代码 罗马数字转换器 编写一个程序来转换罗马数字&#xff08;例如将 MCLX 转换成 1,160&#xff09;。 使用映射加载要用于将字符串字符转换为数字的基本罗马数字。 例如&#xff0c;M 将是映射中的键&#xff0c;其值…

【Python】【Torch】神经网络中各层输出的特征图可视化详解和示例

本文对神经网络各层特征图可视化的过程进行运行示例&#xff0c;方便大家使用&#xff0c;有助于更好的理解深度学习的过程&#xff0c;尤其是每层的结果。 神经网络各层特征图可视化的好处和特点如下&#xff1a; 可视化过程可以了解网络对图像像素的权重分布&#xff0c;可…

SpringBoot : ch05 整合Mybatis

前言 随着Java Web应用程序的快速发展&#xff0c;开发人员需要越来越多地关注如何高效地构建可靠的应用程序。Spring Boot作为一种快速开发框架&#xff0c;旨在简化基于Spring的应用程序的初始搭建和开发过程。而MyBatis作为一种优秀的持久层框架&#xff0c;提供了对数据库…

【算法】链表-20231123

这里写目录标题 一、19. 删除链表的倒数第 N 个结点二、21. 合并两个有序链表三、24. 两两交换链表中的节点 一、19. 删除链表的倒数第 N 个结点 提示 中等 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 输入&#xff1a;head [1,…

Niushop 开源商城 v5.1.7:支持PC、手机、小程序和APP多端电商的源码

Niushop 系统是一款基于 ThinkPHP6 开发的电商系统&#xff0c;提供了丰富的功能和完善的商品机制。该系统支持普通商品和虚拟商品&#xff0c;并且针对虚拟商品还提供了完善的核销机制。同时&#xff0c;它也支持新时代的商业模式&#xff0c;如拼团、分销和多门店砍价等营销活…

PS_魔幻

首先打开一个背景图片 然后ctrl j复制一层背景 在调整中将图片改成黑白颜色 点击调整中的 色相/饱和度 调整明度 点击画笔工具&#xff0c;并且设置画笔模板 调节画笔大小&#xff0c;将笔记本电脑涂个概况 然后再新建色相/饱和度 勾选着色 调节背景颜色至喜欢 右键混合选项 …

启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析

原创/朱季谦 遇到一个很诡异的问题&#xff0c;我在启动多个配置相同zookeeper的Dubbo项目时&#xff0c;其他项目都是正常启动&#xff0c;唯独有一个项目在启动过程中&#xff0c;Dubbo注册zookeeper协议时&#xff0c;竟然出现了这样的异常提示—— Caused by: java.lang.…

Web项目从Tomcat迁移到TongWeb

注意事项 1. 使用JNDI方式获取数据源&#xff1a; ①在TongWeb创建JDBC连接池; ②修改Web项目数据源配置. #spring.datasource.urljdbc:mysql://127.0.0.1:3306/demo #spring.datasource.usernametest #spring.datasource.passwordspring.datasource.jndi-namedemo2. 修…

主机dbeaver访问gitlab容器中的pg

映射5432端口- 5431:5432或者从docker客户端查看 version: 3.6 services:web:image: gitlab/gitlab-ce:latestrestart: alwayshostname: localhostenvironment:GITLAB_OMNIBUS_CONFIG: |external_url http://localhost:8929gitlab_rails[gitlab_shell_ssh_port] 2224ports:- …

ROS设置DHCP option121

配置时&#xff0c;了解格式很关键&#xff0c;16进制填写格式如下&#xff1a; 将要访问的IPV&#xff14;地址&#xff1a;192.168.100.0/24 192.168.30.254 转换为&#xff1a;掩码 目标网段 网关 0x18c0a864c0a81efe&#xff0c;0不用填写 ROS配置如下图&#xff1a; 抓…

BLE协议栈入门学习

蓝牙LE栈 物理层 频带 蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作&#xff0c;该频段分为40个信道&#xff0c;每个信道间隔为2MHz。 时分 蓝牙LE是半双工的&#xff0c;可以发送和接收&#xff0c;但不能同时发送和接收&#xff0c;然而&#xff0c;所有的设…

Android studio 迁移之后打开没反应

把Android studio由d盘迁移到c盘&#xff0c;点击没反应&#xff1b; 需要把C:\Users\xxxx\AppData\Roaming\Google\AndroidStudio2022.3 目录下的studio64.exe.vmoptions 修改为C:&#xff0c;删除该文件会导致无法安装app。 里面配置了一个

RK3568开发板在工控工业物联网网关方面的应用

在数字化转型的浪潮中&#xff0c;工控物联网关产品扮演着重要的角色。这些产品通过连接工业设备和网络&#xff0c;为数据传输和分析提供了便利。而迅为RK3568核心板作为一款高性能的芯片&#xff0c;为工控物联网关产品的性能提升和功能扩展提供了强大的支持。 迅为RK3568核心…

5-7求三种数的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1结果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2结果是&#xff1a;%15.6f\n"…

网站被攻击了怎么办,有什么办法防御攻击?

近年来&#xff0c;随着互联网发展&#xff0c;出现了各种各样的网站&#xff0c;web应用&#xff0c;网络极大方便了人们的生活&#xff0c;改变了人们生活方式。而随着网络的发展普及&#xff0c;网络安全问题也困扰着用户。 许多人都曾有过这样经历&#xff0c;网站上线后&…

在 Redis 中使用 JSON 文档:命令行界面(CLI)和 Navicat 集成

Redis&#xff0c;因其极高的性能而闻名&#xff0c;是一款多功能的 NoSQL 数据库&#xff0c;擅长处理键值对。虽然 Redis主要用于处理简单数据结构&#xff0c;但是同样支持更多复杂的数据类型&#xff0c;如列表、集合甚至是 JSON 文件。在本文&#xff0c;我们将深入到 Red…

机器学习入门(第三天)——K近邻(物以类聚)

K-nearest neighbor 知识树 怎么区分红豆绿豆&#xff1f; How to distinguish red beans and green beans? 之前我们构造了一个超平面来解决这个问题&#xff0c;既然超平面可以切分&#xff0c;是不是红豆之间和绿豆之间有着某种关联。即&#xff1a;物以类聚。 如果一个…

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS 1. 搭建仿真线上业务环境2. 安装KeyarchOS操作系统和X2Keyarch迁移工具3. 将CentOS系统业务迁移至KeyarchOS系统 浪潮信息云峦操作系统KeyarchOS基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服…

Seaborn画图颜色和给定的RGB hex code不一致

使用以下代码画图&#xff1a; import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi150) x [A,B,C,D] y [164, 86, 126, 53] sns.barplot(xx, yy, color#3a923a) 得到的颜色如下图所示&#xff1a; 这是因为seaborn默认降低了颜色的饱和度&#xff0c;即…