快速入门搭建SpringMVC项目

172 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

简单介绍

  1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
  2. 可实现servlet的所有功能,是一个表现层的框架
  3. 相比servlet使用简单,开发便捷

快速入门

1. 实现步骤

1 创建web工程(Maven结构)

2 设置tomcat服务器,加载web工程(tomcat插件)

3 导入坐标(SpringMVC+Servlet)

4 定义处理请求的功能类(UserController)

5 编写SpringMVC配置类,加载处理请求的Bean

6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

2. 代码实现

step1:创建web工程(已经准备好)

step2:设置tomcat服务器,加载web工程

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>

step3:导入坐标

<!--servlet的依赖-->
<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>

【注】导入spring-mvc坐标自动依赖spring坐标

step4:定义处理请求的功能类

@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'info':'springmvc'}";
    }
}

@RequestMapping("/save"):设置请求路径。

@ResponseBody:响应的东西按我给的东西给。

step5:编写SpringMVC配置类,加载处理请求的Bean

@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

step6:加初始化Servlet容器,载SpringMVC配置,并设置SpringMVC请求拦截的路径

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    //设置由springmvc控制器处理的请求映射路径
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //加载spring配置类
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

maven插件(tomact)运行

运行结果:

3. 案例注解和类解析

注解

@Controller是把类放到spring容器中管理

@RequestMapping设置当前控制器方法请求访问路径

@ResponseBody设置当前控制器方法响应内容为当前返回值,无需解析

AbstractDispatcherServletInitializer类

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类
  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现
    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。
//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringMvcConfig.class);
    return ctx;
}
    • getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。
//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
    return new String[]{"/"};
}
    • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
    return null;
}

4. 注意事项

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?

Spring相关bean加载控制

  1. 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
  2. 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
  3. 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

4.1方式一代码实现

@Configuration
@ComponentScan(value = "com.itheima",
               excludeFilters = @ComponentScan.Filter(
                   type = FilterType.ANNOTATION,
                   classes = Controller.class
               )
              )
public class SpringConfig {
}
  • 属性
    1. excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
    2. includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)

4.2 Bean的加载格式

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { 
    protected WebApplicationContext createServletApplicationContext() { 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;  
    }   
    protected WebApplicationContext createRootApplicationContext() {  
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();      
        ctx.register(SpringConfig.class);        
        return ctx;  
    }   
    protected String[] getServletMappings() { 
        return new String[]{"/"}; 
    }
}

简化格式

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class}
    };
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
}