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

相关文章
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
54 2
|
2月前
|
缓存 前端开发 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月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
112 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
215 1
SpringMVC入门到实战------ 十一 拦截器的使用
这篇文章介绍了SpringMVC中拦截器的使用,包括拦截器的配置、拦截器的三个抽象方法`preHandle`、`postHandle`和`afterCompletion`的作用,以及多个拦截器的执行顺序和规则。
SpringMVC入门到实战------ 十一 拦截器的使用
|
3月前
|
JSON 前端开发 JavaScript
SpringMVC入门到实战------九 HttpMessageConverter @RequestBody 、@ResponseBody 、RequestEntity、ResponseEntity
这篇文章详细介绍了SpringMVC中的`HttpMessageConverter`接口及其相关的`@RequestBody`、`@ResponseBody`、`RequestEntity`和`ResponseEntity`注解和类型的使用,包括如何将请求体转换为Java对象、如何将Java对象转换为响应体、以及如何处理JSON和AJAX请求。
SpringMVC入门到实战------九 HttpMessageConverter @RequestBody 、@ResponseBody 、RequestEntity、ResponseEntity
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)