引言
不知不觉,之前的文章生成器已经迎来了终章,这是网页版狗屁不通文章生成器的终章,也是狗屁不通文章生成器系列的最后一章。所以我决定精心打磨一下最后的终章部分,今天的更文我就写一个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包如下:
检查一下Maven
接下来我们完成对springMVC的学习
springMVC与传统的HttpServlet类的对比
这里我们来看一下我之前写的一个练习小项目和现在写的一个项目的对比
之前的项目后端技术栈方面采用的是Spring+MyBatis,并未使用SpringMVC,而是继承自传统的HttpServlet类
这里我使用了大量的HttpServlet类的派生类,做了大量的后端接口,非常繁琐,非常复杂,大量的代码量,还有复杂的结构,不管是个人书写还是团队开发都很费时费力。
这是我最新的一个项目
从结构上看,给读者的感受可以说是显而易见的明显了,而且上一个项目的目录因为过长并没有完全截全,即便如此也是繁琐太多了。
所以这里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......这里我个人习惯是每个类别的分别存储、
接下来比如我这里写了一个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的入门及学习练习。当然其中还有更高级的操作,需要大家深入探究。