SpringMVC
概述
- 是Spring框架的一个模块,与Spring无缝集成(SSH)
- 是基于MVC设计模式实现的
- 是目前最流行的MVC框架
- Spring3.0之后全面超越了Struts2
- 解决的问题(JavaWeb)
- 一个Servlet处理多个请求(不方便)
- 请求参数的获取与转换
使用
导入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>
创建配置类
@Configuration @EnableWebMvc//启用MVC的注解驱动 @ComponentScan(basePackages = {"com.neu.controller"}) public class SpringMVCConfig { }
初始化器
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
返回JSON数据需要配置jar包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> <!-- 使用适合你项目的版本 --> </dependency>
SpringMVC的详细配置
@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>
配置项目结构
- Facet(特性):web、Spring
配置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 { }
配置数据访问层
配置数据源
添加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(); } }
配置业务逻辑层
编写业务逻辑接口和实现类,在实现类中注入数据访问层组件,并且把业务逻辑的实现类配置为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 {}
两个容器的配置
业务逻辑层组件和数据访问层组件放到父容器中
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[]{"/"}; } }