SpringMVC学习总结

一、理解SpringMVC的基本概念

1.什么是MVC?

        MVC(Model-View-Controller)是一种软件架构模式,将业务逻辑、数据、显示分离的方法来组织代码。用于将应用程序分为三个主要组件(模型、视图和控制器),以便更好地组织和管理代码。

        M(Model)指模型:负责管理应用程序的业务数据、定义访问控制以及修改这些数据的业务规则,型是应用程序中用于存储和处理数据的部分。当模型的状态发生改变时,它会通知视图发生改变,并为视图提供查询模型状态的方法。

        V(View)指视图负责与用户进行交互,它从模型中获取数据向用户展示,同时也能将用户请求传递给控制器进行处理。当模型的状态发生改变时,视图会对用户界面进行同步更新,从而保持与模型数据的一致性。

        C(Controller)指控制器:负责应用程序中处理用户交互的部分,它从视图中读取数据,控制用户输入,并向模型发送数据。

        优点分工明确,互不干扰,具有分离性、可重用性。适用于大型项目架构,有利于组件重构。

2.什么是SpringMVC?

        SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级web框架,是Spring Framework的一部分,本质上相当于 Servlet,也是结构最清晰的 Servlet+JSP+JavaBean 的实现。它可以注解驱动,同时支持RESTful 风格的请求。

3.SpringMVC的特点

​        ①.松耦合: Spring MVC 实现了松耦合,即模型、视图和控制器之间的关系松散,可以独立开发和测试。这使得更容易进行单元测试和维护。

​        ②.注解支持: Spring MVC 提供了丰富的注解,例如 @Controller、@RequestMapping、@RequestParam 等,使得开发者可以使用更简洁的方式定义控制器和处理请求,减少了配置的需求。

​        ③.灵活性:Spring MVC 拥有强大的灵活性,非侵入性和可配置性。

​        ④.简洁性:代码清晰简洁,大幅度提升开发效率。

​        ⑤.RESTful支持: Spring MVC对RESTful风格的Web服务提供了很好的支持。通过使用 @RequestMapping 注解,可以轻松地定义RESTful风格的控制器。

​        ⑥.拦截器(Interceptor): Spring MVC 提供了拦截器机制,允许开发者在请求处理的不同阶段执行自定义的操作,例如身份验证、日志记录等。

​        ⑦.数据验证: Spring MVC 提供了数据验证的支持,通过使用注解或者实现 Validator 接口,可以对用户提交的数据进行验证,确保数据的合法性。

​        ⑧.支持国际化:Spring MVC 支持国际化,支持根据用户区域显示多国语言,并且国际化的配置非常简单。

4.SpringMVC常用组件

​        ①.前端控制器(DispatcherServlet)负责接收所有的客户端请求并将请求分派给适当的处理程序(Controller),有了DispatcherServlet就减少了其他组件之间的耦合度。

​        ②.处理器映射器(HandlerMapping):根据请求的URL来查找Handler,Spring MVC支持多种HandlerMapping,包括基于注解、基于URL路径、基于请求参数等多种映射策略。

​        ③.处理器适配器(HandlerAdapter):根据映射器找到的处理器 Handler 信息,按照特定的规则去执行相关的处理器 Handler。

​        ④.处理器(Handler)完成具体的业务逻辑,相当于Servlet。

​        ⑤.视图(View):View是一个接口,他的实现类支持不同的视图类型,如jsp,freemarker等等, 视图负责呈现模型数据并生成响应。

​        ⑥.视图解析器(ViewResolver):ViewResolver负责将逻辑视图名称解析为实际的视图对象。视图对象负责渲染模型数据并生成响应。Spring MVC支持多种视图解析器,包括JSP、FreeMarker、Thymeleaf等。

5.工作流程

        ①用户通过浏览器发起HttpRequest请求到前端控制器(DispatcherServlet)

​        ②DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping)

​        ③处理器映射器 (HandlerMapping)会根据请求,找到负责处理该请求的处理器,并将其封装为处理器执行链 返回 (HandlerExecutionChain) 给 DispatcherServlet

​        ④DispatcherServlet去调用处理器适配器(HandlerAdapter)

​        ⑤处理器适配器(HandlerAdapter)调用具体的Controller

​        ⑥Controller处理完请求后,返回一个包含模型数据和逻辑视图名的ModelAndView对象

​        ⑦HandlerAdaptor 直接将 ModelAndView 交给 DispatcherServlet 

​        ⑧DispatcherServlet调用ViewReslover并将ModelAndView传给它

​        ⑨ViewResolver 将封装好的视图 (View) 对象返回给 DIspatcherServlet

​        ⑩DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中),再响应给浏览器。

二、创建一个SpringMVC程序(入门案例)

这里我使用的开发工具是IDEA2022

1.首先创建一个基于maven的web项目

①创建一个新的maven项目

去setting修改配置

②添加webapps

选择File下的Project Structure

点击Facets,再点击+,选择web

添加项目

修改Deployment Descriptors下web.xml路径和Web Resource Directory路径 (修改成我下面这种路径就行)

2.再pom.xml导入SpringMVC相关依赖

3.在com.rmal.controller包下创建HelloController控制器

4.在resources文件夹下创建SpringMVC核心文件spring-mvc.xml,并添加注解扫描和配置视图解析器,启用基于注解的MVC支持

5.web.xml中配置SpringMVC核心控制器DispathcerServlet和过滤器

6.再WEB-INF下的view包创建一个hello.jsp视图页面

7.加入Tomcat并启动

再点击+,选择Tomcat Server下的Local

端口可以适当修改,避免冲突,再点击Fix

发起请求测试,测试结果如下

8.也可以采用注解的方式实现

①在config包下创建配置类SpringMvcConfig替换spring-mvc.xml

②在config包下创建配置类ServletContainersInitConfig替换web.xml

运行结果跟上面是一样的

三、@RequestMapping注解

1.功能?

@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。

2.使用位置

@RequestMapping 注解可用于类或方法上:

        用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。

        用于方法上,设置映射请求路径的具体信息

这时候访问时路径要加上test才能访问到

3.@RequestMapping常用参数

①value:指定URL请求的实际地址,是@RequestMapping的默认值,通过请求的请求地址匹配请求映射;并且是一个字符串数组,表示该请求映射能够匹配多个请求地址所对应的请求,其值必须设置。以下两种写法等价


②method:用于指定请求的方式,包括GET、POST、PUT、DELETE等

这样就将请求方式设置为POST,只有以POST方式请求才能访问。
③params:指定request请求中必须包含的参数值,如果不包含的话,就无法调用该方法

4.SpringMVC支持ant风格的路径

        ?:表示任意的单个字符

        *:表示任意的0个或多个字符

        **:表示任意的一层或多层目录

        注意:在使用**时,只能使用/**/xxx的方式

5.SpringMVC支持路径中的占位符

        原始方式: /deleteUser?id=1        rest方式: ldeleteUser/1
        SpringMVC路径中的占位符常用于restful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。

四、SpringMVC实现多种类型数据响应

1.返回字符串

forward转发请求

使用redirect关键字可以重定向到其他页面

2.返回ModelAndView对象

将hello.jsp页面修改成以下样子,并再控制器中处理

运行结果如下:

3.返回Model

Model与ModelAndView的区别:

  • Model:每次请求中都存在的默认参数,利用其 addAttribute() 方法即可将服务器的值传递到客户端页面中。
  • ModelAndView:包含 model 和 view 两部分,使用时需要自己实例化,利用 Model 来传值,也可以设置 view 的名称。

运行结果如下:

4.返回Json类型

①加入依赖

②创建User实体类

③检查spring配置类上是否有 @EnableWebMvc注解

④编写控制器请求

运行结果如下:

5.返回void类型

浏览器渲染数据

运行结果如下:

五、SpringMVC获取请求参数的方法

1.通过servletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

2.通过控制器方法获取

        在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参

3.@RequestParam

@RequestParam是将请求参数和控制器方法的形参创建映射关系,使用在方法入参的位置。

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定。

一共有三个属性:
value:指定请求参数的参数名
required:设置是否必须传输此请求参数,默认值为true。若设置为true时,则当前请求必须传输                  value所指定的请求参数,若没有传输该请求参数,且没有设置
defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值

4.@RequestHeader

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系。
@RequestHeader注解一共有三个属性:

         value:该属性用于指定要提取的头部信息的名称。可以使用 value 属性或 name 属性,它们是等效的。

        required:该属性用于指定提取的头部信息是否是必需的。默认值为 true,表示如果请求中没有相应的头部信息,将抛出 MissingRequestHeaderException 异常。可以通过将 required 设置为 false 来允许缺少相应的头部信息。

        defaultValue:该属性用于指定在请求中没有相应头部信息时的默认值。如果请求中没有指定的头部信息,并且没有设置默认值,Spring 将抛出 MissingRequestHeaderException 异常。可以通过 defaultValue 设置一个默认值,以避免异常。

5.@CookieValue

@CookieValue是将cookie数据和控制器方法的形参创建映射关系,用于方法入参位置
@CookieValue注解一共有三个属性:

        value:该属性用于指定要提取的 Cookie 的名称。

        required:该属性用于指定提取的 Cookie 是否是必需的。默认值为 true,表示如果请求中没有相应的 Cookie,将抛出 MissingCookieValueException 异常。可以通过将 required 设置为 false 来允许缺少相应的 Cookie。

        defaultValue:该属性用于指定在请求中没有相应 Cookie 时的默认值。如果请求中没有指定的 Cookie,并且没有设置默认值,Spring 将抛出 MissingCookieValueException 异常。

六、SpringMVC获取不同类型参数

1.获取基本类型参数

运行结果如下:

2.获取POJO类型参数

POJO类型参数指的是将这种简单的Java对象作为方法或函数的参数进行传递或使用。

再UserContoller.java文件中写:

执行后结果如下:注意地址需要自己手动添加

3.获取数组类型参数

这Controller方法去获取

执行后结果如下:注意地址需要自己手动添加

4.获取集合类型参数

创建一个班级类里面有集合类型的成员变量

采用json格式传输数据,在Controller里面编写

这里需要用到postman传输json格式数据

如何使用postman:将地址复制到postman上就可以了

运行结果如下:

5.自获得Restful风格的参数

        Restful(Representational State Transfer)是一种软件架构风格,它通常用于设计网络应用程序。Restful 风格的参数指的是通过HTTP请求传递给RESTful服务的参数,这些参数通常嵌入在URL中,也可以通过请求体传递。

        优点:Restful架构是一种简单的、轻量级的架构风格,可以轻松地通过增加或减少服务器来实现横向扩展,并且Restful服务之间是松耦合的、全局性的,可以支持不同的数据格式,如JSON、XML等,提高了API的可读性,使其易于理解和使用。

        在Restful架构中,资源通过URI(Uniform Resource Identifier)进行标识,并通过HTTP方法(通常是GET、POST、PUT、DELETE)执行对这些资源的操作。Restful风格的参数可以分为以下几种:

在UserController中编写以下代码:

执行后结果如下:注意地址需要自己手动添加

注意:这里我们出现了乱码

解决办法:

在ServletContainersInitConfig配置类中加入过滤器

6.自定义类型转换器

        自定义类型转换器是指在编程中创建自定义逻辑,以便在不同数据类型之间进行转换。

        在许多编程语言和框架中,包括Java、C#、Python等,都提供了内置的数据类型转换功能。但有时,当需要定制特定类型之间的转换时,可以通过创建自定义类型转换器来实现。

①先定义类型转换器(在config包下面创建DateConverter)

②在springMVC配置文件中配置自定义转换器

或者在sping-mvc.xml中配置

③使用

执行后结果如下:注意地址需要自己在浏览器地址栏中手动添加

七、SpringMVC文件上传和下载

1.文件上传

        文件上传是通过表单的形式提交给服务器的,因此,实现文件的上传,就需要一个提供上传的表单,而这个表单则必须满足以下三个条件

                 ①form表单的method属性为post

                ②form表单的enctype属性为multipart/form-data

                ③使用<input type="file" name="filename"/>为文件上传输入框

实现:

①添加依赖

②配置文件上传解析器

xml方式:

注解方式:

③在控制器中写入

④创建表单

2.文件下载

修改表单

八、拦截器

1.拦截器的概念

        在Spring MVC中,拦截器(Interceptor)是一种用于在处理请求的过程中执行预处理和后处理任务的机制,用于拦截控制器方法的执行。拦截器提供了一种非常灵活的方式,使得开发者能够在请求进入控制器处理之前或之后执行一些自定义的逻辑,类似于过滤器。通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

2.拦截器的作用

        拦截器可以在请求进入控制器之前执行预处理逻辑,也可以在控制器处理完请求并生成响应之后执行后处理逻辑,可以用于实现权限验证逻辑、日志记录、修改Controller方法返回的ModelAndView对象,捕获控制器中抛出的异常,并进行相应的处理

3.拦截器与过滤器的区别

作用层次不同:

  • 过滤器: 操作在Servlet容器级别,即在请求进入Servlet容器之前和响应离开Servlet容器之前。过滤器能够在请求的生命周期内实施对所有Servlet的通用处理。
  • 拦截器: 操作在Spring MVC框架内部,即在请求进入Spring MVC控制器之前和控制器处理完请求之后。拦截器主要针对Spring MVC框架的控制器进行处理。

依赖框架不同:

  • 过滤器: 是Servlet规范的一部分,与任何特定的框架无关,可以在任何Java web应用中使用。
  • 拦截器: 是Spring MVC框架的一部分,依赖于Spring框架。

配置方式不同:

  • 过滤器: 配置在web.xml文件中,通过在部署描述符中声明过滤器名称和映射路径来配置。
  • 拦截器: 配置在Spring MVC的配置文件中,通过实现HandlerInterceptor接口,然后在Spring的配置文件中进行注册。

使用对象不同:

  • 过滤器: 操作在javax.servlet.Filter接口的实现类中,它对所有请求和响应生效。
  • 拦截器: 操作在Spring MVC的HandlerInterceptor接口的实现类中,它对Spring MVC框架内的控制器请求进行处理。

处理阶段不同:

  • 过滤器: 在请求进入Servlet容器和响应离开容器的生命周期的早期和晚期阶段执行。
  • 拦截器: 在Spring MVC的控制器处理请求之前和之后执行。

4.HandlerInterceptor接口的三个方法

在Spring MVC中,拦截器通过实现HandlerInterceptor接口来定义,这个接口包含了三个方法:

preHandle 在请求处理之前被调用,该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束 ,可以用于执行一些预处理操作,返回值表示是否继续处理请求。

postHandle: 在请求处理之后被调用,前提是preHandle方法的返回值为true时才能被调用, 在视图渲染之前,可以用于执行一些后处理操作

afterCompletion 在整个请求处理完成后被调用,包括视图渲染完成,可以用于执行一些资源清理操作。

5.模拟创建一个登录拦截器

在config包下的springmvc配置文件中配置拦截器,注册

导入依赖

在前面我们创建了一个User实体类,这里我们直接使用

创建控制器

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值