正在连接海拉鲁...

SpringMVC

概述

  1. 是Spring框架的一个模块,与Spring无缝集成(SSH)
  2. 是基于MVC设计模式实现的
  3. 是目前最流行的MVC框架
  4. Spring3.0之后全面超越了Struts2
  5. 解决的问题(JavaWeb)
    • 一个Servlet处理多个请求(不方便)
    • 请求参数的获取与转换

使用

  1. 导入jar包

    <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.3.22</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
            </dependency>
        </dependencies>
  2. 创建配置类

    @Configuration
    @EnableWebMvc//启用MVC的注解驱动
    @ComponentScan(basePackages = {"com.neu.controller"})
    public class SpringMVCConfig {
    
    }
  3. 初始化器

    public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[0];
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{SpringMVCConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    }
    • getRootConfigClasses():返回根应用上下文的配置类,根应用上下文是被所有Servlet共享的
    • getServletConfigClasses():返回Servlet应用上下文的配置类,这个配置类通常包含Web层的Bean定义,比如控制器和视图解析器
    • getServletMapping():返回一个或多个Servlet映射,通常返回”/“,使得DispatcherServlet(前端控制器)成为处理所有请求的默认Servlet
  4. 返回JSON数据需要配置jar包

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version> <!-- 使用适合你项目的版本 -->
    </dependency>

SpringMVC的详细配置

  1. @RequestMapping

    • 既可以添加到类上,也可以添加到处理器方法上

      • 添加到类上的时候,提供的初步请求映射,路径相对于Web应用程序根目录
      • 添加到方法上,提供进一步的细分映射信息,相对于类定义处的url,若类定义处没有该注解,则相对于web应用的根目录
    • method属性:表示能处理的请求方法,默认能处理get和post请求

      • @RequestMapping(value = "getAll",method = {RequestMethod.GET})//只能处理get请求
        
        
             - 其他同理
        
           - value:指定请求的url,默认属性(如果只有value属性需要赋值,可以省略`value=`)
        
           - params:指定请求中必须包含某些请求参数或参数值
        
        2. GetMapping
        
        3. PostMapping
        
        4. PutMapping
        
        5. DeleteMapping
        
        6. 请求参数绑定
        
           - 定义:把请求参数的key/value绑定到处理器方法的形参上,默认形参名与请求参数名相同,就可以自动绑定
           - @RequestParam:手工映射请求参数
             - value:请求参数名,默认属性
             - required:必须的,默认值为true
             - defaultValue:默认值
        
        7. @RequestBody:从请求体中得到数据,适用于前端传递的是JSON数据
        
        ## SSM集成
        
        1. 创建一个maven项目,打包方式为war包
        
           ~~~xml
           <?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>com.neu</groupId>
               <artifactId>ssmDemo1</artifactId>
               <version>1.0-SNAPSHOT</version>
               <packaging>war</packaging>
           
               <properties>
                   <maven.compiler.source>8</maven.compiler.source>
                   <maven.compiler.target>8</maven.compiler.target>
                   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                   <spring.version>5.3.22</spring.version>
                   <aop.version>1.7.3</aop.version>
               </properties>
               <build>
                   <plugins>
                       <!-- 资源文件拷贝插件 -->
                       <plugin>
                           <groupId>org.apache.maven.plugins</groupId>
                           <artifactId>maven-resources-plugin</artifactId>
                           <version>2.7</version>
                           <configuration>
                               <encoding>UTF-8</encoding>
                           </configuration>
                       </plugin>
                       <!-- java编译插件 -->
                       <plugin>
                           <groupId>org.apache.maven.plugins</groupId>
                           <artifactId>maven-compiler-plugin</artifactId>
                           <version>3.2</version>
                           <configuration>
                               <source>1.8</source>
                               <target>1.8</target>
                               <encoding>UTF-8</encoding>
                           </configuration>
                       </plugin>
                   </plugins>
                   <resources>
                       <!-- 标签定义了项目中资源文件的位置和类型 -->
                       <resource>
                           <directory>src/main/java</directory>
                           <includes>
                               <!-- 这里的**表示任意多层目录,*.xml表示任意名称的.xml文件。这样一来,这个配置会递归地从src/main/java目录开始,包含所有.xml扩展名的文件。 -->
                               <include>**/*.xml</include>
                           </includes>
                       </resource>
                       <resource>
                           <directory>src/main/resources</directory>
                       </resource>
                   </resources>
               </build>
               <dependencies>
                   <dependency>
                       <groupId>com.fasterxml.jackson.core</groupId>
                       <artifactId>jackson-databind</artifactId>
                       <version>2.9.8</version> <!-- 使用适合你项目的版本 -->
                   </dependency>
                   <dependency>
                       <groupId>org.projectlombok</groupId>
                       <artifactId>lombok</artifactId>
                       <version>1.18.24</version>
                   </dependency>
                   <dependency>
                       <groupId>org.springframework</groupId>
                       <artifactId>spring-webmvc</artifactId>
                       <version>5.3.22</version>
                   </dependency>
                   <dependency>
                       <groupId>javax.servlet</groupId>
                       <artifactId>javax.servlet-api</artifactId>
                       <version>4.0.1</version>
                   </dependency>
                   <dependency>
                       <groupId>org.springframework</groupId>
                       <artifactId>spring-jdbc</artifactId>
                       <version>${spring.version}</version>
                   </dependency>
                   <dependency>
                       <groupId>org.mybatis</groupId>
                       <artifactId>mybatis-spring</artifactId>
                       <version>1.3.1</version>
                   </dependency>
                   <dependency>
                       <groupId>org.mybatis</groupId>
                       <artifactId>mybatis</artifactId>
                       <version>3.5.6</version>
                   </dependency>
                   <dependency>
                       <groupId>mysql</groupId>
                       <artifactId>mysql-connector-java</artifactId>
                       <version>8.0.22</version>
                   </dependency>
                   <dependency>
                       <groupId>commons-dbcp</groupId>
                       <artifactId>commons-dbcp</artifactId>
                       <version>1.4</version>
                   </dependency>
                   <dependency>
                       <groupId>org.projectlombok</groupId>
                       <artifactId>lombok</artifactId>
                       <version>1.18.20</version>
                       <scope>provided</scope>
                   </dependency>
                   <dependency>
                       <groupId>junit</groupId>
                       <artifactId>junit</artifactId>
                       <version>4.12</version>
                   </dependency>
                   <dependency>
                       <groupId>org.springframework</groupId>
                       <artifactId>spring-context</artifactId>
                       <version>${spring.version}</version>
                   </dependency>
           
                   <dependency>
                       <groupId>org.springframework</groupId>
                       <artifactId>spring-test</artifactId>
                       <version>${spring.version}</version>
                   </dependency>
                   <!--<dependency>
                       <groupId>org.aspectj</groupId>
                       <artifactId>aspectjweaver</artifactId>
                       <version>${aop.version}</version>
                   </dependency>
                   <dependency>
                       <groupId>org.aspectj</groupId>
                       <artifactId>aspectjrt</artifactId>
                       <version>${aop.version}</version>
                   </dependency>-->
               </dependencies>
           </project>
  2. 配置项目结构

    • Facet(特性):web、Spring
  3. 配置SpringMVC

    • web初始化器:让web服务器启动时,能够启动SpringMVC组件的容器

      public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
      
          @Override
          protected Class<?>[] getRootConfigClasses() {
              return new Class[]{DBConfig.class, MyBatisConfig.class};
          }
      
          @Override
          protected Class<?>[] getServletConfigClasses() {
              return new Class[]{SpringMVCConfig.class};
          }
      
          @Override
          protected String[] getServletMappings() {
              return new String[]{"/"};
          }
      }
    • 添加SpringMVC容器的配置类

      @Configuration
      @EnableWebMvc//启用MVC的注解驱动
      @ComponentScan(basePackages = {"com.neu.controller"})
      public class SpringMVCConfig {
      
      }
  4. 配置数据访问层

    • 配置数据源

      • 添加db.properties文件到resources目录,该文件写入了数据库连接池的参数

        jdbc.username=root
        jdbc.password=pj2689777
        jdbc.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
        jdbc.driverClassName=com.mysql.cj.jdbc.Driver
        
        jdbc.maxActive=20
        jdbc.maxWait=2000
        jdbc.maxIdle=5
      • 通过配置类读取配置文件的数据,并创建一个数据源:DBConfig

        @Configuration
        @PropertySource("classpath:db.properties")
        public class DBConfig {
            @Value("${jdbc.username}")
            private String username;
            @Value("${jdbc.password}")
            private String password;
            @Value("${jdbc.url}")
            private String url;
            @Value("${jdbc.driverClassName}")
            private String driverClassName;
            @Value("${jdbc.maxActive}")
            private Integer maxActive;
            @Value("${jdbc.maxWait}")
            private Integer maxWait;
            @Value("${jdbc.maxIdle}")
            private Integer maxIdle;
            @Bean
            public DataSource dataSource(){
                BasicDataSource bs = new BasicDataSource();
                bs.setUsername(username);
                bs.setPassword(password);
                bs.setUrl(url);
                bs.setDriverClassName(driverClassName);
                bs.setMaxActive(maxActive);
                bs.setMaxWait(maxWait);
                bs.setMaxIdle(maxIdle);
        
                return bs;
            }
        
        }
    • 配置SQLSessionFactory组件,并且扫描mapper包:MyBatisConfig

      @Configuration
      @MapperScan("com.neu.mapper")
      @ComponentScan("com.neu.service")
      public class MyBatisConfig {
          @Bean
          public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
              SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
              //设置数据源
              sqlSessionFactoryBean.setDataSource(dataSource);
      
              return sqlSessionFactoryBean.getObject();
          }
      
      }
  5. 配置业务逻辑层

    • 编写业务逻辑接口和实现类,在实现类中注入数据访问层组件,并且把业务逻辑的实现类配置为Spring容器的组件

      @Component
      public class DeptServiceImpl implements DeptService {
          private DeptMapper deptMapper;
          @Autowired
          public void setDeptMapper(DeptMapper deptMapper) {
              this.deptMapper = deptMapper;
          }
      
          @Override
          public Dept getById(Long deptno) {
              Dept dept = deptMapper.selectByPrimaryKey(deptno);
              return dept;
          }
      }
    • 把业务逻辑层所在包加入组件扫描中

      @ComponentScan("com.neu.service")
      public class MyBatisConfig {}
  6. 两个容器的配置

    • 业务逻辑层组件和数据访问层组件放到父容器中

    • SpringMVC组件放到子容器中

    • 子容器可以访问父容器,父容器不能访问子容器

    • public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
      
          @Override
          protected Class<?>[] getRootConfigClasses() {
              return new Class[]{DBConfig.class, MyBatisConfig.class};
          }
      
          @Override
          protected Class<?>[] getServletConfigClasses() {
              return new Class[]{SpringMVCConfig.class};
          }
      
          @Override
          protected String[] getServletMappings() {
              return new String[]{"/"};
          }
      }