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的入门及学习练习。当然其中还有更高级的操作,需要大家深入探究。

相关文章
|
13天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1天前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
SpringMVC入门到实战------ 十一 拦截器的使用
这篇文章介绍了SpringMVC中拦截器的使用,包括拦截器的配置、拦截器的三个抽象方法`preHandle`、`postHandle`和`afterCompletion`的作用,以及多个拦截器的执行顺序和规则。
SpringMVC入门到实战------ 十一 拦截器的使用
|
1月前
|
JSON 前端开发 JavaScript
SpringMVC入门到实战------九 HttpMessageConverter @RequestBody 、@ResponseBody 、RequestEntity、ResponseEntity
这篇文章详细介绍了SpringMVC中的`HttpMessageConverter`接口及其相关的`@RequestBody`、`@ResponseBody`、`RequestEntity`和`ResponseEntity`注解和类型的使用,包括如何将请求体转换为Java对象、如何将Java对象转换为响应体、以及如何处理JSON和AJAX请求。
SpringMVC入门到实战------九 HttpMessageConverter @RequestBody 、@ResponseBody 、RequestEntity、ResponseEntity
|
1月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
1月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
1月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
SpringMVC入门到实战------十二、异常处理器
这篇文章介绍了SpringMVC中拦截器的使用,包括拦截器的配置、拦截器的三个抽象方法`preHandle`、`postHandle`和`afterCompletion`的作用,以及多个拦截器的执行顺序和规则。
|
1月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
4月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】