springMVC的入门,学习,配置和静态资源访问问题的解决

简介: # 引言不知不觉,之前的文章生成器已经迎来了终章,这是网页版狗屁不通文章生成器的终章,也是狗屁不通文章生成器系列的最后一章。所以我决定精心打磨一下最后的终章部分,今天的更文我就写一个springMVC的学习部分。正好今天练习项目的开发在一些springMVC方面也是卡了很久。# springMVC的简介Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 HttpServlet。一个Spring内置的MVC框架。与Spring有着很好的兼容。而且SpringMVC比其他的很多 MVC 框架更具扩展性和灵活性。# s

引言

不知不觉,之前的文章生成器已经迎来了终章,这是网页版狗屁不通文章生成器的终章,也是狗屁不通文章生成器系列的最后一章。所以我决定精心打磨一下最后的终章部分,今天的更文我就写一个springMVC的学习部分。正好今天练习项目的开发在一些springMVC方面也是卡了很久。

springMVC的简介

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 HttpServlet。一个Spring内置的MVC框架。与Spring有着很好的兼容。

而且SpringMVC比其他的很多 MVC 框架更具扩展性和灵活性。

springMVC的引入

传统的jar包引入

传统的jar导入并不多赘述,也不推荐。

众所周知,传统Jar包的导入即去对应的网址下载所需的jar包,然后放在指定的目录的下,但这么做有很多的问题与缺点

统jar包导入的缺点

首先要去找到对应的官网下的对应版本的jar包,有时候还会遇到广告的网址,要去做一个筛选判断,而且即便找到了对应好的所需jar包的官网,繁重的英文,大量的不知道干什么的文件......

而且即便是找到了正确的资源jar包,较慢的下载速度,较为繁琐的引入方式,让人很难受。

Maven项目管理

这里我们采用Maven项目管理的方式来完成jar包的引入,这里的另一个好处是,传统的项目的创建,比如idea的项目,在eclipse上未必能运行。而采用Maven项目管理的方式,也一定程度上提高了项目的兼容性。同时在Maven项目中的pom.xml中直接导坐标的形式,一定程度上非常非常非常方便。

这里做一个springMVC的一些导入的pom.xml

创建Maven工程,Tomcat这些基础的教程这里就不多赘述了

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>MVC</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>



  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8087</port>
          <path>/</path>

        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.0</version>
      </plugin>
    </plugins>
  </build>

</project>

上面是springMVC的配置,注意!注意!注意!JDK一定不要用18的版本,不能兼容,本人已经狠狠踩了一波这个大坑。

接下来我们刷新Maven,会发现有的jar包如下:

image.png

检查一下Maven

image.png

接下来我们完成对springMVC的学习

springMVC与传统的HttpServlet类的对比

这里我们来看一下我之前写的一个练习小项目和现在写的一个项目的对比

之前的项目后端技术栈方面采用的是Spring+MyBatis,并未使用SpringMVC,而是继承自传统的HttpServlet类

image.png

这里我使用了大量的HttpServlet类的派生类,做了大量的后端接口,非常繁琐,非常复杂,大量的代码量,还有复杂的结构,不管是个人书写还是团队开发都很费时费力。

这是我最新的一个项目

image.png

从结构上看,给读者的感受可以说是显而易见的明显了,而且上一个项目的目录因为过长并没有完全截全,即便如此也是繁琐太多了。

所以这里springMVC不管从整洁上和代码量上,都是大大的优化了程序员的开发体验。

接下来我们来完成springMVC的配置

首先在Java目录下创建com包,com包中分别创建config包和control包

在config包下创建 pringMVCconfig类

代码如下

package com.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan({"com.control","com.config"})
@EnableWebMvc
public class SpringMVCconfig {

}

@Configuration
@ComponentScan({"com.control","com.config"})
@EnableWebMvc作为配置部分完成包扫描

接下来我们创建SpringContent类完成加载

package com.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

public class SpringContent extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(SpringMVCconfig.class);
        return applicationContext;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

其中getServletMappings中的return new String[]{"/"};则是将所有的请求都交给SpringMVC来处理。

而WebApplicationContext函数分别是重写createServletApplicationContext,完成SpringMVCconfig.class反射的加载

最后我们开始写control包下的实现后端接口的部分

package com.control;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.*;
@Controller
public class SpringMVCselect {
    @RequestMapping("/cs")
    @ResponseBody
    public String cs(){
        return "{'springMVC':'successfully'}";
    }

    @RequestMapping("/loginReq")
    @ResponseBody
    public String loginReq(String username,String password){
        if (username != null && password != null){
            System.out.println(username+","+password);
        }
        return "{'springMVC':'successfully'}";
    }
}

短短的几行代码,如果交给传统的HttpServlet来实现则需要做两个类 同时写更多的代码,而且请求的参数越多,差距就越明显。

而反观SpringMVC,极大的简化了代码量并提高了代码的工整性。这就非常nice了。

接下来我们来使用Apifox来进行测试,先启动我们的Tomcat服务器,假设我们这边的服务器在 http://localhost:8080/ 那么我们可以访问 http://localhost:8080/cs 发现页面成功返回显示了{'springMVC':'successfully'}

接续访问 http://localhost:8080/loginReq 并为其指定x-www-form-unlencoded 并给他来个usewrname 和 password 的参数。

发送请求,也成功返回了数据。

证明我们后端部分已经没问题了。

静态资源被拦截的一个解决办法

上面我们已经入门了springMVC 接下来我们再来看一个静态资源访问被springMVC拦截的一个解决方案。

这里我们还是老规矩来在web-app下写一些js,html,css......这里我个人习惯是每个类别的分别存储、

image.png

接下来比如我这里写了一个login.html,所以我们启动服务器,访问 http://localhost:8080/html/login.html

这里我们发现一个很奇怪的事情,我们并没有访问到这个页面,这是为什么呢

我们核对一下路径 并没有问题,但是无法访问到,我们想一下,会不会是springMVC的问题?我们将springMVC的代码全部注释掉。
再次启动服务器并访问上述地址 成功访问到了静态资源。

那么这是为什么,难道是用springMVC后没办法访问静态资源了?是springMVC有问题?

显而易见这并不是springMVC本身的问题,再次检查几遍我们的代码,并没有发现什么问题,调用接口测试工具Apifox,同样也没有什么问题。那这就很奇怪了,我们来详细分析一下bug产生的原因

我们打开com.config.SpringContent类 发现我们对于getSeverletMappings中的设置是控制所有的路由,那么这问题就来了,我们对于访问静态资源这个事情,并不会经手Tomcat,而是经过SpringMVC,他会直接拦截我们的请求,而拦截后springMVC会发现我们并没有对应的mapping,就会访问不到,所以我们应该让静态资源的访问直接走Tomcat,而不是springMVC、

这里我们在com.config包下创建SpringMVCSupport类

代码如下:

package com.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class SpringMVCSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/html/**").addResourceLocations("/html/");
    }
}

接下来我们就可以放行我们的html了

但是还有一个小问题,我们访问到html了但是其中涉及的css和js还有一些我们需要的axois,vue,element-ui,echarts.......却没有访问到,所以我们为了访问他们需要对其一一放行

全部代码如下:

package com.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class SpringMVCSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/html/**").addResourceLocations("/html/");
        registry.addResourceHandler("/JavaScript/**").addResourceLocations("/JavaScript/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/vue/**").addResourceLocations("/vue/");
        registry.addResourceHandler("/element-ui/**").addResourceLocations("/element-ui/");
        registry.addResourceHandler("/axios/**").addResourceLocations("/axios/");
        registry.addResourceHandler("/ECharts/**").addResourceLocations("/ECharts/");
    }
}

我们已经完成了springMVC的入门及学习练习。当然其中还有更高级的操作,需要大家深入探究。

相关文章
|
3天前
|
XML 前端开发 Java
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
这篇文章是SpringMVC框架的入门教程,详细指导了如何在IDEA中使用Maven和Tomcat创建SpringMVC工程,包括添加依赖、配置web.xml、编写控制器、创建配置文件、配置Tomcat服务器以及进行基本的测试,展示了一个简单的Hello SpringMVC示例。
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
3天前
|
存储 前端开发 Java
SpringMVC入门到实战------1、SpringMVC简介
这篇文章是SpringMVC框架的入门介绍,阐述了MVC架构的概念和分层,解释了SpringMVC作为Spring家族的一部分在Web应用开发中的作用和重要性,并概述了SpringMVC的关键特点,包括与Spring IOC容器的无缝集成、基于Servlet的DispatcherServlet、全面的解决方案、代码简洁性、高内聚低耦合的组件化设计以及卓越的性能表现。
|
3天前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
3天前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
3天前
|
前端开发
SpringMVC入门到实战------六、SpringMVC的视图。ThymeleafView、转发视图、重定向视图、视图控制器的使用详解
这篇文章详细介绍了SpringMVC中的视图类型,包括ThymeleafView、转发视图、重定向视图和视图控制器的使用,以及如何通过源码查看确定使用的视图渲染器类型。
SpringMVC入门到实战------六、SpringMVC的视图。ThymeleafView、转发视图、重定向视图、视图控制器的使用详解
|
3天前
|
JavaScript 数据安全/隐私保护
SpringMVC入门到实战------4、SpringMVC获取请求参数(六种方式详细说明)
这篇文章介绍了在Vue中如何使用过滤器来隐藏手机号和邮箱等字符串的中间部分内容,以提高隐私保护。文章展示了实现效果,并提供了实现过程的代码示例,包括HTML部分的绑定、data部分的数据定义和script部分的过滤器定义。文章还解释了过滤器的概念、语法和使用方式,并提供了一个外部链接供读者获取更加详细的过滤器知识。
SpringMVC入门到实战------4、SpringMVC获取请求参数(六种方式详细说明)
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
该博客文章详细介绍了SpringMVC中`@RequestMapping`注解的使用方法,包括其功能、位置、value属性、method属性、params属性、headers属性以及支持的路径风格和占位符,并通过实际代码案例展示了如何建立请求与控制器方法之间的映射关系。
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
|
6天前
|
前端开发 Java Spring
Java 新手入门:Spring Boot 轻松整合 Spring 和 Spring MVC!
Java 新手入门:Spring Boot 轻松整合 Spring 和 Spring MVC!
18 0
|
3月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
80 0