深入理解Spring MVC下

news2024/11/14 20:16:53

上一篇博客从理论概念上来梳理Spring MVC相关知识,此篇博客将通过spring官网提供showcase代码为例子,详细介绍showcase代码中包含的各个例子是如何实现的。官网的showcase代码包含的主要例子包括,Demo地址:

  • Mapping Requests:请求匹配

  • Obtaining Request Data:请求中包含各种参数

  • Generating Responses:生成response

  • Message Converters:消息转换

  • Rendering Views:渲染view下面的js文件

  • Type Conversion:类型转换

  • Validation:对象严重

  • Forms:表单处理

  • File Upload:上传文件

  • Exception Handling:异常处理

下载代码,执行“mvn jetty:run”,启动应用,访问“http://localhost:8080/spring-mvc-showcase/”,会看到如下界面,每个tab按钮包含一种类型的demo例子。

查看代码目录,在config目录下的WebMvcConfig class文件里面进行了spring mvc相关的配置,通过添加@EnableWebMvc开启了spring mvc相关的自动配置,再通过@Override对部分配置进行自定义,例如自定义静态资源的存放位置,定义Resolver中的jsp文件目录和后缀等,定义了"/"目录下的viewname是home,所以打开上面地址后,实际mapping到的是home.jsp文件。

Views的例子

上面的showcase中例子很多,这里会抽取一部分例子进行讲解,首先来看看views目录下的代码,定义了一个JavaBean对象,定义了一个ViewsController,以下图的controller为例,返回的视图名称是“views/html”,因为配置文件中定义了registry.jsp的路径是“/WEB-INF/views/",所以,mapping出来的jsp文件路是“/WEB-INF/views/views/html.jsp"文件,在浏览器中访问这个controller定义的路径,实际显示的就是html.jsp文件中的内容。另外,在controller中通过model.addAttribute(virableName,value)设置属性,在home.js文件中,通过${virableName}引用属性的值。

Validation的例子

如下图所示,在对象中可以添加各种限制条件,例如@NotNull,@Future等,对象中添加限制条件后,在controller中天际@Valid注解,如果传入的对象值不符合限制条件,则会报错。

Response的例子

如下图所示,使用 ResponseEntity 可以灵活地控制 HTTP 响应的各个方面。例如,您可以设置状态码、响应头和响应体。通过设置响应体,您可以返回一个对象或一个集合,并自动将其转换为 JSON 格式或其他格式。

上面的例子ResponseEntity的body是String类型,实际项目中更多的是返回一个Java对象,例如下面的例子返回从数据库查询得到的User对象。

Redirect的例子

在 Spring MVC 中,重定向可以使用 redirect: 前缀来实现。如果需要在重定向请求中传递参数,可以使用 RedirectAttributes。例子如下图所示,需要注意一点:重定向返回的是一个字符串,而不是 ModelAndView 对象或 ResponseEntity 对象。

showcase的例子中,通过不同的方式将url重定向到了/redirect/{account},mapping过去,渲染显示的文件是/WEB-INF/views/redirect/redirectResults.jsp文件。

Message Convert例子

在上一篇博客中列举了spring mvc提供的Message Convert组件,这些组件无需程序员显式配置,因为Spring MVC默认提供的Message Converter组件,在初始化时自动注册到应用程序上下文中。Spring MVC能根据header中设置的消息的格式,自动选择合理的消息转换器将对象转换成期望的格式,并显示在前端页面上。

在showcase的例子中,message convert例子中以读写xml格式和json格式为例子,返回都是JavaBean对象,这是因为请求或者响应的content-Type在home.jsp文件中进行了设置,所以,能按照例子说明的格式返回期望格式的信息,关键代码片断如下所示:

FileUpload例子

MultipartFile是Spring MVC中用于处理文件上传的类,它可以将上传的文件封装成MultipartFile对象并进行处理。下面的例子中通过@RequestParam注解将上传的文件封装成MultipartFile对象。在处理上传文件之前,首先判断文件是否为空,然后获取文件的原始名称、大小和类型等信息,最后使用MultipartFile的transferTo方法将文件保存到本地磁盘上。注意,上述代码中的路径D:\upload\是一个本地路径,需要根据实际情况进行修改。此外,还需要在Spring MVC的配置文件中配置MultipartResolver,以便正确处理文件上传请求。

Ajax使用说明

在处理上传文件的例子中,实际还使用了Ajax,所以这里对Ajax相关的内容进行补充说明。Ajax(Asynchronous JavaScript and XML)实际是一种在Web应用程序中使用的技术,它可以通过异步方式向服务器发送请求并获取响应,而不需要重新加载整个页面。而jQuery是一个非常流行的JavaScript库,其中包含了许多简化DOM操作和Ajax请求的方法,因此通常被用于实现Ajax请求。

下面是一段用Ajax写的Demo代码。在Controller中定义好get/post方法,在html.jsp页面上添加调用Ajax的代码。在下面的代码中,首先引入了jQuery库,并在页面加载完成后使用$函数进行初始化。然后,通过click事件监听提交按钮的点击,并在点击事件中使用$.ajax方法向服务器发送Ajax请求。在Ajax请求中,设置了请求的URL、请求类型、请求数据和回调函数等参数。最后,使用一个<div>元素来显示服务器返回的响应数据。

<!DOCTYPE html>
<html>
<head>
    <title>Ajax Demo</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script>
        $(function() {
            $('#submit-btn').click(function() {
                var message = $('#message').val();
                $.ajax({
                    url: '/ajax/echo',
                    type: 'POST',
                    data: {msg: message},
                    success: function(data) {
                        $('#result').text(data);
                    },
                    error: function() {
                        $('#result').text('Error!');
                    }
                });
            });
        });
    </script>
</head>
<body>
    <input type="text" id="message" placeholder="请输入消息" />
    <button id="submit-btn">提交</button>
    <div id="result"></div>
</body>
</html>

查看spring-mvc-showcase的home.jsp文件,里面有有大量ajax的请求调用,部分代码截图如下所示:可以看到在<script>标签下有很多监听click,submit的function(),function()里面实际调用的就是ajax请求,ajax请求调用的就是controller中定义的get/post等方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023王道考研数据结构笔记第一章绪论

第一章 绪论 1.1 数据结构的基本概念 1.数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。 2.数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理…

【LeetCode】2363. 合并相似的物品

2363. 合并相似的物品 题目描述 给你两个二维整数数组 items1 和 items2 &#xff0c;表示两个物品集合。每个数组 items 有以下特质&#xff1a; items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 &#xff0c;weighti 表示第 i 件物品的 重量 。items 中每…

cpp之STL

STL原理 STL ⼀共提供六⼤组件&#xff0c;包括容器&#xff0c;算法&#xff0c;迭代器&#xff0c;仿函数&#xff0c;适配器和空间配置器&#xff0c;彼此可以组合套⽤。容器通过配置器取得数据存储空间&#xff0c;算法通过迭代器存取容器内容&#xff0c;仿函数可以协助算…

电子科技大学软件工程期末复习笔记(九):项目管理

目录 前言 重点一览 软件项目管理的四大要素 团队组织方式 虚拟团队 软件范围 项目计划 P-CMM的5个级别 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲&#xff0c;供自己期末复习与学弟学妹参考用。 重点一览 本节是软件工程复习笔记的最后一篇&…

Hive---Zeppelin安装教程

Zeppelin安装教程 安装zeppelin必须基于Hadoop和Hive上 文章目录Zeppelin安装教程简介安装步骤1.上传zeppelin压缩包2.解压并更名3.修改配置文件编辑zeppelin-site.xml---将配置文件的ip地址和端口号进行修改编辑 zeppelin-env.sh---添加JDK和Hadoop环境拷贝hive文件切换目录拷…

数据结构与算法(六):图结构

图是一种比线性表和树更复杂的数据结构&#xff0c;在图中&#xff0c;结点之间的关系是任意的&#xff0c;任意两个数据元素之间都可能相关。图是一种多对多的数据结构。 一、基本概念 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成&#x…

嵌入式小白的进阶之路

学习嵌入式采用的是2021年华清远见嵌入式课程 安装虚拟机 &#xff1a; 懒人版 目标&#xff1a;快速上手 问题一&#xff1a; 在Linux虚拟环境中运行一个c语言程序步骤 1、激活虚拟环境&#xff1a;source venv/bin/activate 2、进入Hello文件夹&#xff1a;cd Hello 3、新…

【Python学习笔记】第二十节 Python 网络编程

Python 网络编程简单来说&#xff0c;网络是用物理链路将各个孤立的工作站或主机相连在一起&#xff0c;组成数据链路&#xff0c;从而达到资源共享和通信的目的。所谓的网络编程就是&#xff0c;让在不同的电脑上的软件能够进行数据传递&#xff0c;即进程之间的通信Python 提…

超级品牌符号怎么设计?大咖有方法

怎么设计超级LOGO图标&#xff1f;有方法&#xff01; LOGO设计大趋势&#xff1a;卡通化、拟人化 抽象符号已经泛滥 但卡通形象也已经泛滥 趣讲大白话&#xff1a;设计容易出名难 【安志强趣讲信息科技89期】 ******************************* 别以为设计一个卡通就牛X闪闪 比…

解析iptables原里及设置规则

文章目录一、前言二、iptables简介三、iptables原理四、iptables设置规则五、 Linux 常用实例六、注意事项1、命令书写规则2、谨慎使用的动作 DROP3、永久生效一、前言 其实在IT行业里了&#xff0c;不仅是专职的运维人员需要了解 iptables&#xff0c;开发、测试等人员在了解…

IIS .Net Core 413错误和Request body too large解决办法

错误描述图片比较大时&#xff0c;在前端上传就报413错误。根本到不了后端。在网上看到这个文章比较有用。https://blog.csdn.net/wstever/article/details/1288707421、修改网站Web.config配置文件加入下面这段配置<?xmlversion"1.0" encoding"utf-8"…

Python 中 openpyxl 模块封装,读写 Excel 文件中自动化测试用例数据

只有测试数据和错误提示信息不同&#xff0c;其他代码都是一样的&#xff0c;不这样不易修改数据和维护&#xff0c;会有两点痛点 1.代码冗余极其严重, 程序可读性不佳 2.程序拓展性很差 往往我们在自动化测试汇总&#xff0c;会将数据放在 Excel 文件、CSV文件、数据库 Py…

JVM 堆内存模型

方法区和永久代的关系 方法区与 Java 堆一样&#xff0c;是各个线程共享的内存区域&#xff0c;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分&#xff0c;但是它却有一个别名叫做 N…

如何整理自己的前端面试题库

compose 题目描述:实现一个 compose 函数 // 用法如下: function fn1(x) {return x 1; } function fn2(x) {return x 2; } function fn3(x) {return x 3; } function fn4(x) {return x 4; } const a compose(fn1, fn2, fn3, fn4); console.log(a(1)); // 1432111实现代码…

基于Java+SpringBoot+Vue前后端分离书店购书系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…

Tomcat部署及多实例

Tomcat部署及多实例一、Tomcat简介1、Tomcat核心组件2、什么是JSP二、Tomcat数据流向1、Tomcat数据流向2、Tomcat-Nginx数据流向三、Tomcat服务部署安装1、安装jdk包2、解压Tomcat所需的安装包3、在/etc/profile添加环境变量4、启动服务并查看5、在浏览器网页验证6、创建用户&a…

flink常用算子介绍

flink任务中【Transformation 数据转换】是对数据进行操作&#xff0c;有 Map、FlatMap、Filter、KeyBy 、Reduce 、Fold 、Aggregations、Window 、WindowAll 、Union 、Window join 、Split 、Select 、Project 等&#xff0c;通过对数据的操作&#xff0c;转换成想要的数据&…

【设计模式】4.建造者模式

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不…

【沐风老师】3DMAX一键玻璃门生成器使用教程

3DMAX一键玻璃门生成器使用方法详解 3dMax一键玻璃门生成器是在3dMax中自动创建三维玻璃门模型的高效脚本。有6种风格的玻璃门&#xff0c;它可以在Archviz项目中灵活应用&#xff0c;同时为3D艺术家节省大量时间。 【适用版本】 3dMax 2018.2及更高版本 【安装方法】…

day37|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ 复健运动

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…