SpringMVC+入门案例

一、入门案例

1.依赖导入

java 复制代码
<!--1. 导入SpringMVC与servlet的坐标-->
<dependencies>
<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>

这里javax.servlet-api这个依赖一定要确定范围为provided

  • scope是maven中jar包依赖作用范围的描述
  • 如果不设置默认是compile在在编译、运行、测试时均有效
  • 如果运行有效的话就会和tomcat中的servlet-api包发生冲突,导致启动报错
  • provided代表的是该包只在编译和测试的时候用,运行的时候无效直接使用tomcat中的,就避 免冲突

2.创建控制器类

java 复制代码
//2.制作控制器类,等同于Servlet
//2.1必须是一个spring管理的bean
//2.2定义具体处理请求的方法
//2.3设置当前方法的访问路径
//2.4设置响应结果为json数据
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'springmvc'}";

//设置映射路径为/delete,即外部访问路径
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}
}

3.创建配置类

注意springmvc只加载表示层,即@Controller注释修饰的即可,故,在@ComponentScan中指定到controller包中的Bean就行

java 复制代码
//3.定义配置类加载Controller对应的bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

4.创建Tomcat的Servlet容器配置

java 复制代码
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

总结:

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器 的抽象类
  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现
  • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非 SpringMVC对应的bean,使用当前方法进行,使用方式同 createServletApplicationContext()
  • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对 应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围 ngetServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所 有请求,任意请求都将转入到SpringMVC进行处理 createServletApplicationContext用来加载SpringMVC环境 createRootApplicationContext用来加载Spring环境

5.配置Tomcat环境

二、知识点

三、流程分析

1.启动服务器初始化过程

2. 单次请求过程

四、Bean的加载控制

目录结构:

问题分析:

原代码:

思路分析:

解决方法:

方法一常用

方法二很鸡肋,有个小细节要十分注意,测试的时候,需要把SpringMvcConfig配置类上的@ComponentScan注解注释掉,否则不会 报错 ,也就是分开不成功。

原因是

补充创建Tomcat的Servlet容器配置文件的另类简洁写法

java 复制代码
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
相关推荐
架构师沉默6 小时前
别又牛逼了!AI 写 Java 代码真的行吗?
java·后端·架构
Java水解9 小时前
微服务架构下Spring Session与Redis分布式会话实战全解析
后端·spring
后端AI实验室10 小时前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai
凉年技术12 小时前
Java 实现企业微信扫码登录
java·企业微信
狂奔小菜鸡13 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum13 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
程序员Terry14 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP14 小时前
MyBatis-缓存与注解式开发
java
码路飞14 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java
Re_zero14 小时前
以为用了 try-with-resources 就稳了?这三个底层漏洞让TCP双向通讯直接卡死
java·后端