SpringMVC【学习笔记】

news2024/11/16 3:43:23

SpringMVC是什么?

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web 框架,即使用了MVC架构模式的思想,将web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

使用SpringMVC的好处

  • 让我们能非常简单的设计出干净的Web 层和薄薄的Web 层;

  • 进行更简洁的Web 层的开发;请求参数是映射到方法的参数上

  • 天生与Spring框架集成(如IoC容器、AOP等);

  • 提供强大的约定大于配置的契约式编程支持;

  • 能简单的进行Web 层的单元测试;

  • 支持灵活的URL到页面控制器的映射;

  • 非常容易与其他视图技术集成,如Velocity、FreeMarker 等等,因为模型数据不放在特定的API 里,而是放在一个Model里(Map 数据结构实现,因此很容易被其他框架使用);

  • 非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;

  • 提供一套强大的JSP标签库,简化JSP开发;

  • 支持灵活的本地化、主题等解析;

  • 更加简单的异常处理;

  • 对静态资源的支持;

  • 支持Restful风格。

SpringMVC的六大组件

1.前端控制器(DispatcherServlet):
用户请求到达前端控制器,它就相当于mvc模式中的C , dispatcherservlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherservlet的存在降低了组件之间的耦合性。

2.Handler : 处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

3.View : 视图
Spring MVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是jsp。
通过页面标签或页面模版技术将模过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

4.HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler处理器,spring MVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

5.HandlerAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

6.View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

流程图:
在这里插入图片描述
代码实现:
在这里插入图片描述

SpringMVC的请求与响应

@RequestMapping:使用@RequestMapping注解可以定义不同的处理器映射规则。

1. URL路径映射:

@RequestMapping(value=“/queryAll”)或@RequestMapping("/queryAll”)
value的值是数组,可以将多个url映射到同一个方法

2. 窄化请求映射

​ 在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:

@RequestMapping放在类名上边,设置请求前缀

@Controller

@RequestMapping(“/user”)

方法名上边设置请求映射url:

@RequestMapping放在方法名上边,如下:

@RequestMapping("/queryAll ")

访问地址为:/user/queryAll .action

3. 限制Http请求方式
@RequestMapping(value=“url”,method = RequestMethod.GET)
例如:限定GET方法,如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported

4.替换写法

Springmvc提供一组注解用于替换@RequestMapping注解的

  • @GetMapping get请求
  • @PostMapping post请求
  • @PutMapping put请求
  • @DeleteMapping delete请求

Controller的返回值

有两中处理方式:1.页面跳转2.响应数据

页面跳转:

1.直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

真正视图(jsp路径)=前缀+逻辑视图名+后缀
在这里插入图片描述

可以指定跳转方式:redirect 重定向,forward 转发
例如:
在这里插入图片描述

2 返回ModelAndView对象
ModelAndView: 在request域存放数据, 设置逻辑视图名
默认情况: 经过视图解析器,找物理视图, 转发
使用关键字redirect或者forward时, 视图是不经过视图解析器的
代码演示:

@RequestMapping("/index1")
public ModelAndView toIndex1(){
    ModelAndView modelAndView = new ModelAndView();
   // 转发(forward)/重定向(redirect)关键字:逻辑视图名:  不经过视图解析器,要求逻辑视图是一个完整的url,
   // 视图可以是页面,也可以是处理器
    modelAndView.setViewName("redirect:/index.jsp");
    return modelAndView;
}
@RequestMapping("/index2")
public ModelAndView toIndex2(){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("forward:/WEB-INF/views/index.jsp");
    return modelAndView;
}
@RequestMapping("/index3")
public ModelAndView toIndex3(){
    ModelAndView modelAndView = new ModelAndView();
    //直接写的逻辑视图名: 经过视图解析器,找物理视图, 转发
    modelAndView.setViewName("index");
    return modelAndView;
}

3.void 表示无返回

/**
     * 返回值是void, 默认使用 使用绑定的url作为逻辑视图名
     *  经过视图解析器,找物理视图, 转发
     */
    @RequestMapping("/test10")
    public void test11(){
        System.out.println("执行了test10");
    }

    @RequestMapping("/index")
    public void index(){ }

响应数据:

1.response对象:
通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void。

@RequestMapping("/test4")
public void test4(HttpServletResponse response) throws IOException {
    response.getWriter().print("hello world");
}

2.@ResponseBody注解
将需要回写的字符串直接返回,但此时需要通过**@ResponseBody**注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回

@RequestMapping("/test5")
@ResponseBody
public String test5() throws IOException {
	return "hello springMVC!!!"; 
}

在异步项目中,客户端与服务器端往往要进行json格式字符串交互,我们需要导入jackson依赖,将复杂的java对象转换成json格式的字符串。

通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
   <property name="messageConverters">
       <list>
           <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
       </list>
   </property>
</bean>

补充

< !–mvc的注解驱动–>
mvc:annotation-driven/
它会帮我们自动配置SpringMVC的三大组件处理器映射器处理器适配器视图解析器
使用mvc:annotation-driven默认底层就会集成jackson进行对象或集合的json格式字符串的转换。

SpringMVC获取请求数据

springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收
在这里插入图片描述

1.默认支持数据类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

  • HttpServletRequest 请求对象
  • HttpServletResponse 响应对象
  • HttpSession session对象
  • Model/ModelMap Model是一个接口,ModelMap是一个接口实现 。作用:将model数据填充到request域。

2 简单数据类型
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
例如:
请求:http://localhost:8080/test8?username=zhangsan&age=12

@RequestMapping("/test8")
@ResponseBody
public void test8(String username,int age) throws IOException {
	System.out.println(username);
	System.out.println(age);
}

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
例如:
http://localhost:8080/test8?username=zhangsan&age=12

@RequestMapping("/test8")
@ResponseBody
public void test8(@RequestParam("username")String name,int age) throws IOException {
	System.out.println(name);
	System.out.println(age);
}

注解@RequestParam还有如下参数可以使用:

  • value:与请求参数名称

  • required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错

  • defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

3.获得POJO类型参数
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。

4.自定义类型转换器
自定义类型转换器的使用步骤:

  1. 定义转换器类实现Converter接口
  2. 在配置文件中声明转换器
  3. <mvc:annotation-driven>中引用转换器

5 获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
请求:http://localhost:8080/test10?ids=1001&ids=1002&ids=1003

@RequestMapping("/test10")
@ResponseBody
public void test10(Integer[] ids) throws IOException {
	System.out.println(Arrays.asList(ids));
}

6 获得集合类型参数
注意:使用List接收页面提交的批量数据,通过包装类接收,在包装类中定义list属性

补充:

web.xml中的 < url-pattern > < /url-pattern> 的注意事项:
写法:
1. 前缀配置: /前缀名/* 比如: /api/*
2. 后缀配置: *.后缀名 比如: *.do *.action
3. / * 所有的请求经过前端控制器, 错误的, 访问jsp,经过前端控制器
通过处理器映射器根据url找处理器, jsp是一个页面, 找不到, 报404
4. / 所有的请求经过前端控制器,除jsp, restFul配置:注意:
访问静态资源,经过前端控制器,通过处理器映射器根据url找处理器, 找不到,报404
5.访问静态资源,需要在springmvc.xml中配置默认静态资源处理器< mvc:default-servlet-handler/ >

6.手动映射静态资源:使用资源映射 访问的url与本地的路径一 一映射
mapping: url /pages/ * * : / * *: 该目录以及所有后台目录
location: 本地路径 /pages/
注意: controller前缀的url不能与静态资源的路径一样
例如
<mvc:resources mapping=“/pages/ * *” location=“/pages/”/>
<mvc:resources mapping=“/css/ * *” location=“/css/”/>
<mvc:resources mapping=“/images/ * *” location=“/images/”/>

补充

@Controller注释类中的每个@RequestMapping注释方法最终都将转向 HandlerMethod 类(而这个类才是SpringMVC 注解开发方式的真正处理器)。

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

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

相关文章

看2022年卡塔尔世界杯有感

一、我印象中第一次看世界杯是2010年南非世界杯 自己第一次踢球是什么时候已经记不清了&#xff0c;大概是小学时候。因为我印象中第一次看世界杯是2010年南非世界杯&#xff0c;因为世界杯主题曲也比较好听&#xff0c;当然&#xff0c;我认为1998年法国世界杯的主题曲最为经…

Python中的魔法方法

python中的魔法方法是一些可以让你对类添加“魔法”的特殊方法,它们经常是两个下划线包围来命名的 Python的魔法方法&#xff0c;也称为dunder(双下划线)方法。大多数的时候&#xff0c;我们将它们用于简单的事情&#xff0c;例如构造函数(init)、字符串表示(str&#xff0c; r…

计算机毕设Python+Vue兴发农家乐服务管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux | 套接字(socket)编程 | UDP协议讲解

文章目录TCP与UDP的区别网络字节序套接字接口介绍sockaddr结构服务端UDP套接字设置客户端UDP套接字设置TCP与UDP的区别 TCPUDP传输层协议传输层协议有连接无连接可靠连接不可靠连接面向字节流面向数据报 首先&#xff0c;网络通信模型是分层的&#xff0c;模型的每一层都有属于…

深入jvm字节码

深入jvm字节码1.深入剖析class文件结构1.1初探class文件1.2 class文件结构解析1.2.1 魔数1.2.2 版本号1.2.3 常量池1.2.4 Access flags1.2.5 this_class,super_name,interfaces1.2.6 字段表1.2.7 方法表1.2.8 属性表1.3使用javap查看类文件2.字节码基础2.1字节码概述2.2java虚拟…

一文看懂---B树及其简单实现

目录 1.B树的引入 2.B树的概念 3.B树是如何插入的&#xff1f; 4.具体的代码实现 1.B树的引入 在以往我们在内存中搜索数据时&#xff0c;可以使用红黑树&#xff0c;平衡树&#xff0c;哈希表等数据结构&#xff0c;但是当数据量比较大&#xff0c;不能一次放进内存&…

[附源码]计算机毕业设计Python仓储综合管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

C++PrimerPlus 第七章 函数-C++的编程模块-7.9 递归

目录 7.9 递归 7.9.1 包含一个递归调用的递归 7.9.2 包含多个递归调用的递归 7.9 递归 下面介绍一些完全不同的内容。C函数有一种有趣的特点——可以调用自己&#xff08;然而&#xff0c;与C语言不同的是&#xff0c;C不允许main()调用自己&#xff09;&#xff0c;这种功能…

SpringCloud Gateway简单使用

前言 SpringCloud Gateway是一个网关框架&#xff0c;也是现在流行的的一个网关框架&#xff0c;它包括了过滤器、限流、权限、基本路由、整合Eureka 断言predicates 等功能&#xff0c;也会介绍和zuul这个框架的一个对比&#xff0c; Spring Cloud 生态系统中的网关&#xff…

243. 一个简单的整数问题2——差分+树状数组

给定一个长度为 N 的数列 A&#xff0c;以及 M 条指令&#xff0c;每条指令可能是以下两种之一&#xff1a; C l r d&#xff0c;表示把 A[l],A[l1],…,A[r] 都加上 d。 Q l r&#xff0c;表示询问数列中第 l∼r 个数的和。 对于每个询问&#xff0c;输出一个整数表示答案。 …

《爱与自由》豆瓣9.3优秀父母的必读书

《爰和自由》 关于作者 孙瑞雪&#xff0c;中国著名的幼儿教育家与心理学专家&#xff0c;"爱和自由、规则和平等”教育精神的 发起者和倡导者&#xff0c;中国系统引进实施国际蒙特梭利教育第一人&#xff0c;成功实践了科学教育法的本土化。她发展和延伸了蒙特梭利敏感…

Oh My Posh美化CMD、Anaconda Prompt解决方案

网上搜到的Oh My Posh安装配置都是针对power shell的&#xff08;我参考这篇成功配置了针对power shell的字体和主题&#xff09;。期间遇到了无法加载文件WindowsPowerShell\profile.ps1的问题&#xff0c;参考这篇解决。由于平时我用Anaconda比较多&#xff0c;而anaconda是基…

基于ARMR和白噪声特性模型及风速威布尔分布研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

PRISEMI芯导产品推荐 | 支持路径管理功能的3A单节锂离子电池充电IC——PSC2965

PRISEMI芯导产品推荐 | 支持路径管理功能的3A单节锂离子电池充电IC——PSC2965 随着便携式电子设备功能越来越多样化和整机性能的不断提升&#xff0c;整机功耗也在面临越来越大的挑战。最直接有效的方式就是提高电池的容量来提高整机的使用时长。为了不降低用户体验&#xff0…

C# 绘图基础

一 GDI技术简介 ① GDI&#xff1a;Graphics Device Interface. ② GDI&#xff1a;GDI的改进&#xff1b; ③ 是.NET框架结构的重要组成部分&#xff1b; ④ 和GDI一样它提供对二维图形图像的支持&#xff1b; 二 .NET 对GDI的封装 三 坐标系统 GDI的坐标系统&#xff1b; …

计算机毕业设计——简单的网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

基于粒子群优化算法的分布式电源优化调度实现配电网稳定运行(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WAYON维安提供新产品:新起点,新征程,DCDC炼成之路

WAYON维安提供新产品&#xff1a;新起点&#xff0c;新征程&#xff0c;DCDC炼成之路 新起点&#xff0c;新征程&#xff0c;DCDC炼成之路 随着新能源汽车、5G通信、工业4.0以及人工智能的快速发展&#xff0c;电源管理芯片的应用场景越来越丰富。同时传统行业&#xff0c;如网…

Day834.Dubbo如何用管程实现异步转同步 -Java 并发编程实战

Dubbo如何用管程实现异步转同步 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Dubbo如何用管程实现异步转同步的内容。 在很多并发场景下&#xff0c;支持多个条件变量能够让并发程序可读性更好&#xff0c;实现起来也更容易。例如&#xff0c;实现一个阻塞队列&a…

星火计划学习笔记——第八讲Apollo控制模块解析与实践2

文章目录1. Apollo控制框架介绍1.1 控制模块的功能和性能要求1.2 控制模块的总体框架1.3 控制模块的代码结构1.3.1 control -> common 中的主要程序1.3.2 control -> conf 中的主要程序1.3.3 control -> controller 中的主要程序1.3.4 control -> proto 中的主要程…