• SpringMVC入门


    SpringMVC概述

    替代了原来的Servlet

    入门案例

    SpringMVC环境搭建及测试

    1.导入依赖

    1. <dependency>
    2. <groupId>javax.servletgroupId>
    3. <artifactId>javax.servlet-apiartifactId>
    4. <version>4.0.1version>
    5. <scope>providedscope>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframeworkgroupId>
    9. <artifactId>spring-webmvcartifactId>
    10. <version>${spring.version}version>
    11. dependency>

    2.写Controller

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/save")
    4. @ResponseBody
    5. public String save(){
    6. System.out.println("user save...");
    7. return "{'info':'SpringMVC'}";
    8. }
    9. }

    3.配置SpringMVC的config,让他加载SpringMVC需要的bean

    1. @Configuration
    2. @ComponentScan("com.example.controller")
    3. public class SpringMVCConfig {
    4. }

    4.配置Servlet容器

    1. public class ServletConfig extends AbstractDispatcherServletInitializer {
    2. @Override
    3. //加载SpringMVC的容器
    4. protected WebApplicationContext createServletApplicationContext() {
    5. AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    6. context.register(SpringMVCConfig.class);
    7. return context;
    8. }
    9. @Override
    10. //设置哪些请求归属于SpringMVC处理
    11. protected String[] getServletMappings() {
    12. return new String[]{"/"};
    13. }
    14. @Override
    15. //加载Spring容器配置 SpringMVC底层会用到Spring
    16. protected WebApplicationContext createRootApplicationContext() {
    17. return null;
    18. }
    19. }

    启动Tomcat服务器,访问/save路径

    流程分析 

    bean加载控制

    我的目录结构

    Spring需要加载除controller外的所有包,SpringMVC需要加载controller包

    SpringMVCConfig

    SpringConfig

    方式1

    方式2

    这里会出现的一个问题是,由于SpringMVCConfig也用@Configuration注解,尽管SpringConfig已经把Controller排除了,但是SpringConfig  在扫描com.example包时   会调用SpringMVCConfig(里面加载了Controller)  把Controller重新加载回来,这样调用Spring的上下文对象仍然能得到Controller的实例化对象。测试代码和结果如下:

    解决方法:

    1.把这两个config都移到com.example包的外面,这样他们两个就不会被重复加载了。

    2.SpringConfig加载的时候过滤@Component注解

    方式3

    这种方式下不区分Spring和SpringMVC的环境(这句话的意思是我们不需要显式地用@Component去定义SpringMVC和Spring的bean了(或者都扫同一个包?),也就是Spring和SpringMVC整合起来了,SpringMVC会用到Spring的bean

    ServletConfig

    1. public class ServletConfig extends AbstractDispatcherServletInitializer {
    2. @Override
    3. //加载SpringMVC的容器
    4. protected WebApplicationContext createServletApplicationContext() {
    5. AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();//初始化web容器
    6. context.register(SpringMVCConfig.class);
    7. return context;
    8. }
    9. @Override
    10. //设置哪些请求归属于SpringMVC处理
    11. protected String[] getServletMappings() {
    12. return new String[]{"/"};
    13. }
    14. @Override
    15. //加载Spring容器配置 这里加载Spring,不区分Spring和SpringMVC环境
    16. protected WebApplicationContext createRootApplicationContext() {
    17. AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();//初始化springIoC容器
    18. context.register(SpringConfig.class);
    19. return context;
    20. }
    21. }

    ServletConfig优化(继承这个长长的东西)

    代码量更少了

    1. public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    2. @Override
    3. //加载Spring容器配置
    4. protected Class[] getRootConfigClasses() {
    5. return new Class[]{SpringConfig.class};
    6. }
    7. @Override
    8. //加载SpringMVC的容器
    9. protected Class[] getServletConfigClasses() {
    10. return new Class[]{SpringMVCConfig.class};
    11. }
    12. @Override
    13. //设置所有请求都归属于SpringMVC处理
    14. protected String[] getServletMappings() {
    15. return new String[]{"/"};
    16. }
    17. }

  • 相关阅读:
    每日一题js
    微服务概览
    2023下半年软考网管和网工考后分析!
    【轨道机器人】成功驱动伺服电机(学生电源、DCH调试软件、DH系列伺服驱动器)
    面试:Sqlite的线程、进程安全性
    springboot+敬老院管理系统 毕业设计-附源码161551
    Java Web(十二)--JSP
    lldb常用命令
    98%的人都不会使用这6种地图可视化方法,学会直接涨薪5K
    项目小结:使用Docker迁移服务到离线服务器
  • 原文地址:https://blog.csdn.net/c1tenj2/article/details/140957212