学习SpringMVC必知必会(2)~走近Spring MVC

简介: 学习SpringMVC必知必会(2)~走近Spring MVC

一、Spring 基本介绍

1.什么是 Spring MVC?

  • SpringMVC 是 Spring-Frame 框架的子集(Spring-Frame包含了Spring MVC)MVC 框架,(类比javaWeb)它解决 WEB 开发中常见的问题(参数接收文件上传表单验证、国际化等等),而且使用简单,与 Spring 无缝集成。
  • 支持 RESTful 风格的 URL 请求 ,非常容易与其他视图技术集成,如 Velocity、FreeMarker。 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
  • Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 (更安全,性能更好,更简单)。


2.Spring WebFlux

  • Spring WebFlux 是 Spring 另一个 Web 框架,基于异步非阻塞的。
  • SpringMVC 是同步阻塞的 IO 模型,资源浪费相对来说比较严重,当我们在处理一个比较耗时的任务时, 比如上传文件,服务器的线程一直在等待接收文件,而 Spring WebFlux 可以做到异步非阻塞。


✿ SpringMVC 是单例的,提高性能:

SpringMVC 是单例的, 基于方法设计;是单例的,避免线程安全问题,不定义成员变量、不使用成员变量

尤其是需要共享数据的变量,作为局部变量,不要作为共享字段。

  • servlet 单例,一般不使用成员变量,不安全,除非是要共享数据,才作为成员变量。


二、Spring 基本使用

▷ 基于xml配置

0.建立web项目

1、依赖[细节版本一致性]:

  • commons-logging-1.2.jar
  • servlet-api.jar
  • spring-aop-5.2.8.RELEASE.jar
  • spring-beans-5.2.8.RELEASE.jar
  • spring-context-5.2.8.RELEASE.jar
  • spring-core-5.2.8.RELEASE.jar
  • spring-expression-5.2.8.RELEASE.jar
  • spring-web-5.2.8.RELEASE.jar
  • spring-webmvc-5.2.8.RELEASE.jar

2、配置前端控制器

<!-- 配置前端控制器 -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 初始化参数,告诉DispatcherServlet去哪里找mvc配置文件 -->
    <!-- 
      默认是去WEB-INF 目录中寻找
      默认寻找的文件名是<servlet-name>元素的文本内容-servlet.xml
     -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:mvc.xml</param-value>
    </init-param>
    <!-- 在Tomcat启动的时就初始化SpringMVC容器 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>  
    <url-pattern>/</url-pattern>
  </servlet-mapping>

3、开发一个处理器类 HelloController,实现接口Controller,覆盖handlerRequest方法

//处理器---目的是处理请求【具体包含要跳转的界面和共享的数据】
public class HelloController implements Controller{
    //处理请求
  @Override
  public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("hello...");
    //封装模型(共享数据)和视图(跳转的界面)
    ModelAndView mv = new ModelAndView();
    //设置视图名称
    mv.setViewName("/WEB-INF/views/welcome.jsp");
    //设置共享数据
    mv.addObject("msg", "你好,easyMVC");
    return mv;
  }
}

4、配置MVC框架[mvc.xml]:

  • 配置处理器映射器:BeanNameUrlHandlerMapping [目的是寻找匹配的处理器]
  • 配置处理器适配器:SimpleControllerHandlerAdapter [目的是调用处理器的handlerRequest方法]
  • 配置视图解析器:InternalResourceViewResolver [目的是处理视图,使之支持jsp、jstl]
  • 配置处理器:HelloController [我们自己开发的处理类]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 1:处理器映射器 -->
    <!-- 目的:选择哪个处理器(Controller)来处理当前请求
      BeanNameUrlHandlerMapping: 根据请求的url去选择对应的bean【根据bean的id/name 进行匹配】  举例:/hello 去匹配id/name 为/hello 的bean
     -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!-- 2:处理器适配器 -->
    <!-- 目的:调用处理器(Controller)的处理请求方法
      1)所有哦的适配器 实现HandlerAdapter接口
      2)处理器(Controller) 类必须实现org.springframework.web.servlet.mvc.Controller接口
     -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!-- 3:视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    <!-- 4:处理器 -->
    <bean id="/hello" class="com.shan.hello.HelloController"/>
</beans>


✿ 总结,站在开发者角度:

1、配置前端控制器

2、配置框架提供的: 处理器映射器、处理器适配器、视图解析器

3、需要开发:

1)先开发Controller处理器,再配置
2)开发jsp等视图


三、SpringMVC执行流程


image.png


四、SpringMVC 核心组件分析:

1、前端控制器 DispatcherServlet(不需开发),由框架提供,在 web.xml 中配置

  • 作用:接收请求,响应结果,相当于转发器,中央处理器。

2、处理器映射器 HandlerMapping(不需开发),由框架提供。

  • 作用:匹配处理器,根据请求的 url 查找 Handler(处理器),可以通过 XML 和注解方式来映射。

3、处理器适配器 HandlerAdapter(不需开发),由框架提供。

  • 作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler

4、处理器 Handler(也称之为 Controller,需要开发)

  • 注意:编写 Handler 时按照 HandlerAdapter 的要求去做[实现Controller接口,重写handlerRequest方法],这样适配器才可以去正确执行 Handler。
  • 作用:相当于Servlet,接受用户请求信息,调用业务方法处理请求,控制界面跳转,也称之为后端控制器。

5、视图解析器 ViewResolver(不需开发),由框架提供

  • 作用:进行视图解析,把逻辑视图名解析成真正的物理视图。
  • SpringMVC 框架支持多种 View 视图技术,包括:JstlView、FreemarkerView、pdfView 等。

6、视图 View(需要开发)

  • 作用:把数据展现给用户的页面 View 是一个接口,实现类支持不同的 View 技术(jsp、freemarker、pdf 等).


五、 debug的方式阅读springmvc 的执行流程的思路:


1、发送请求-》前端控制器,所以第一步是到前端控制器,看前端控制器的什么呢?---service方法【理由:前端控制器是基于servlet,可以把它的职责看成servlet的职责,所以核心方法-service】----快捷键ctr+o,搜索service方法,发现没有----》父类中查找service方法,在service方法第一步打个断点

2、开始debug:按正常流程走,先启动tomcat服务器,然后在浏览器发送请求-》

https://www.cnblogs.com/shan333/p/15983643.html


六、使用注解开发

1、使用xml配置springMVC的缺点:

① 配置繁琐

② Controller 必须实现Controller接口,只有一个处理器请求的方法,若是要处理多个请求,得开发多个Controller

■ 企业中用得最多的方式:注解开发


2、注解开发步骤:

(1)贴标签:@Controller、@RequestMapping("hello")

(2)第三方注解驱动(赋予注解功能):

  • 先配置命名空间(约束内容) 某某.xsd
<!-- IoC注解解析器 -->  
  <context:component-scan base-package="com.shan"/>
  <!-- MVC注解解析器 -->
  <mvc:annotation-driven/>


■ springmvc 的配置:处理器的映射器、处理器的适配器、视图解析器 在jar包:spring-webmvc.jar包下的文件 DispatcherServlet.properties 中有相应的配置了。


■ MVC注解解析器: <mvc:annotation-driven/> :会自动去注册RequestMappingHandlerMapping,RequestMappingHandlerAdapter,ExceptionHandlerExceptionResolver 三个bean。

除此之外,SpringMVC中几乎所有的注解,都需要该注解解析器来解析:

  • 支持类型转换ConversionService
  • @NumberFormat,DateTimeFormate注解
  • @Validdate JSR303 校验
  • @RequestBody @ResponseBody 等等。


3、RequestMapping注解详解:

  • 用来处理请求地址url映射的注解,可以贴在类上和方法上。
    贴在类上:表示类中的所有请求方法的url都必须把类上的url地址作为父路径。

■ 窄化路径映射:


76.png


■ RequestMapping 的子注解(常用):

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping


■ RequestMapping 的六大属性讲解:


77.png


① value 和 method

value: 和 path 是一样的,指定请求的url。

method:指定请求方式的类型,请求方式的类型:GET\POST\HEAD\PUT\PATCH\DELETE\OPTIONS\TRACE

② 指定请求和响应的mediaType

consumes:指定请求内容格式, 例如:Content-Type=application/json

produces: 指定响应内容格式,例如:application/json;charset=UTF-8

③ params 和 headers:

params:指定request中必须包含某些参数值,包含该方法才处理

headers:指定request中必须包含指定的header,包含才能处理


4、前端控制器的url-pattern 配置:

  • 静态资源:图片、html、css、js等

第一种方式:*.拓展名,比如 *.do 古老的方式,不会导致静态资源文件被拦截问题,但是不支持restfull编码风格。

第二种方式:/,支持restfull 风格,但是会导致静态资源文件被拦截,解决问题--

第三种方式:/* ,是错误的,可以请到Controller方法,但是跳转到jsp时会被拦截,jsp不能正常显示。


■ 解释和解决第二种方式 /

  • 解释:因为tomcat中处理静态资源的servlet叫default,而default的映射路径就是/
    启动项目的时候:
    1)启动tomcat,加载tomcat的web.xml文件
    2)启动项目,加载项目的web.xml文件
    项目中的web.xml所映射的/会覆盖tomcat中web.xml配置的映射规则。


  • 常用)解决1:在springmvc的框架配置中添加:
<!-- 处理静态资源文件请求 -->
<mvc:default-servlet-handler/>
  • 原理:将springmvc上下文[环境] 中定义的一个DefaultServletHttpRequestHandler,对所有经过前端控制器的请求做筛选和盘查,

若是发现没有经过映射请求,则交给tomcat默认的servlet来处理。(将静态资源由springmvc交回给servlet来处理)


  • springboot常用)解决2:springmvc 自己来处理资源文件,而且还附加了很多功能:在SpringBoot中: 允许把静态资源放在任何地方,比如WEB-INF里面,resoures目录,设置把JS等静态文件打包放在jar中,也能找到. 都可以通过Location去指定静态资源路径,location是Resouce类型,可以使用前缀,如classpath:. mapping表示映射路径.
  • **: 包含所有的子集目录
<!-- 资源映射 --> 
<mvc:resources location="/" mapping="/**"/>


目录
相关文章
|
18天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
42 9
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
36 9
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
21 1
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
68 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
112 1
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
98 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
29 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
2月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
下一篇
无影云桌面