springMVC 学习总结(详细)

MVC是一种思想,将一个应用程序分为三部分,分别代表web应用程序的三种职责,分为模型(Model)、视图(View)和控制器(Controller)的三个主要组件。

  1. Model(模型): 模型代表应用程序的数据和业务逻辑。在 Spring MVC 中,模型通常是一个 JavaBean,它封装了应用程序的状态。模型对象负责处理应用程序的数据逻辑。

  2. View(视图): 视图是用户界面的呈现方式。在 Spring MVC 中,视图通常是 JSP(JavaServer Pages)或 Thymeleaf 模板等。视图负责展示模型的数据给用户。

  3. Controller(控制器): 控制器是处理用户请求的组件。它接收用户输入,并调用模型和视图来完成用户请求的处理。在 Spring MVC 中,控制器是由开发者编写的类,通常使用注解进行标记,如 @Controller

这是 Spring MVC 的基本工作原理:

  1. Model(模型): 模型代表应用程序的数据和业务逻辑。在 Spring MVC 中,模型通常是一个 JavaBean,它封装了应用程序的状态。模型对象负责处理应用程序的数据逻辑。

  2. View(视图): 视图是用户界面的呈现方式。在 Spring MVC 中,视图通常是 JSP(JavaServer Pages)或 Thymeleaf 模板等。视图负责展示模型的数据给用户。

  3. Controller(控制器): 控制器是处理用户请求的组件。它接收用户输入,并调用模型和视图来完成用户请求的处理。在 Spring MVC 中,控制器是由开发者编写的类,通常使用注解进行标记,例如 @Controller

Spring MVC 的工作流程如下:

  1. 用户发起请求:用户通过浏览器或其他客户端发起请求。

  2. DispatcherServlet处理请求:Spring MVC 应用程序的中央控制器是 DispatcherServlet,它拦截所有的请求,并将它们分发给适当的控制器。

  3. 控制器处理请求:控制器根据请求的 URL 和方法调度到合适的处理方法,这个方法执行业务逻辑,并返回一个包含模型数据的对象。

  4. 模型数据传递给视图:控制器返回的模型数据被传递给视图,用于呈现用户界面。

  5. 视图渲染响应:视图负责将模型数据呈现为最终的用户界面。这可能是一个 HTML 页面、JSON 数据等,具体取决于请求和配置。

  6. 响应返回给用户:最终的响应被返回给用户,显示在其浏览器或客户端上。

 spinrgMVC特点:

1.spring框架的一部分,无缝集成spring框架

2. 分离了控制器,模型对象等,容易定制

3.支持注解驱动

4.高度可配置,支持多种视图技术

5.采用松耦合可插入的组件结构,具备扩展灵活性

 

一.接下来说一下创建和配置一个springmvc的项目,采用maven项目和纯注解配置和开发,无xml操作 

1.首先导入springmvc和spring,mybatis等依赖

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.6</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>

    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-spec</artifactId>
      <version>1.2.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-impl</artifactId>
      <version>1.2.5</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <version>2.6.2</version>
      <scope>runtime</scope>
    </dependency>

    <!-- LogBack日志框架 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.11</version>
    </dependency>

2.注解创建spring,springmvc的配置类来替代application.xml,web.xml等文件

以下为spring的配置类:

以下为springMVC的配置类:

  • @Configuration 表示这是一个配置类
  • @ComponentScan表示开启组件扫描,把需要扫描的包或类以数组的形式添加进去
  • @EnableWebMvc开启注解驱动
  • WebMvcConfiguer是一个接口,提供多个可以自定义的springMVC配置,如拦截器链,视图解析器等(也可以不实现这个接口,把相关配置单独封装成一个自定义配置类),如下;

 

@Configuration
public class springMvcSupport extends WebMvcConfigurationSupport {

    @Autowired  //这是一个拦截器,也需要配置,后面会介绍
    private projectInterceptor projectInterceptor;

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //访问 /resources时。不走mvc,直接访问resources目录下 让MVC放行以下目录的资源,一般为静态资源
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        registry.addResourceHandler("/statics/**").addResourceLocations("/statics/");
        registry.addResourceHandler("/uploadfiles/**").addResourceLocations("/uploadfiles/");

    }

    @Override  //添加拦截器并指定拦截的路径
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users/**");
    }

    @Override   //配置视图解析器
    protected void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }

    //配置文件解析器
    @Bean
    public MultipartResolver multipartResolver(){
        CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(9000000);
        multipartResolver.setDefaultEncoding("UTF-8");
        //问题所在
        multipartResolver.setResolveLazily(true);
        return multipartResolver;
    }

}

这里的配置类继承了WebMvcConfigurationSupport类,这里的WebMvcConfigurationSupport类和WebMvcConfigurer接口的作用都差不多,都是用来配置mvc,但也存在一些区别,这里就不详细说明,需要注意,如果使用这样的方法配置mvc,需要让配置类的@ComponentScan注解扫描到这个类或包。

3.将DispatcherServlet和Spring应用上下文配置到Servlet容器中,也是通过注解加配置类的方式。

Servlet配置类有以下几种抽象类可以继承实现,本文使用的最后一种,其他几种这里不多介绍,大家感兴趣可以看看自己查阅学习。
WebApplicationInitializer —> AbstractContextLoaderInitializer —> AbstractDispatcherServletInitializer —> AbstractAnnotationConfigDispatcherServletInitializer

 

4.接下来就是配置拦截器,实现一个 HandlerInterceptor  接口,可以在里面填写拦截前后和完成后逻辑。也需要通过@Component表示为配置类并且让@ComponentScan注解扫描到。

@Component
public class projectInterceptor implements HandlerInterceptor {
    @Override   // 在请求处理之前调用
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       // 在这里执行拦截前的逻辑,返回 true 表示继续处理,返回 false 则中断处理
        return true;
    }
    @Override      // 在请求处理之后,视图渲染之前调用
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    // 在这里执行拦截后的逻辑,可以修改 ModelAndView
    }
    @Override   // 在整个请求完成后调用,主要用于资源清理等工作
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
       // 在这里执行拦截完成后的逻辑
    }

}

然后就可以在继承了 WebMvcConfigurationSupport 类的配置类种注入拦截器,并通过 addInterceptors 方法注册拦截器,拦截指定路径,把匹配路径的请求交给拦截器处理,如下所示

以上就是mvc的全注解配置。

二.接下来说一下springMVC中的重要的控制器,controller。

1,springMVC中通过@Controller把一个类声明为控制类,需要让配置类中@ComponentScan注解扫描到控制类所在包,

2,使用@RequestMapper注解将不同的请求映射到控制器上,切该注解不仅可以作用到方法上,也能做用到类上,这样使得请求的路径 = 类注解上的URL + 方法注解上的URL。

但@RequestMapper也可也细分为 @PostMapping注解,@DeleteMapping注解,@PutMapping注解和@GetMapping四种注解,分别处理增删改查的请求。如下所示,

 

 

 图中的@RequestBody和@PathVariable注解涉及到spring MVC的数据交互,本文不详细介绍,因为存在一篇文章太长,大家看不下去的情况,所以我决定分为两篇或三篇博客,此文为第一篇,剩余的内容,如数据交互,三层架构,文件上传,日志和统一异常处理等,下一篇博客再详细介绍。如有错误不足,感谢指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值