Spring学习三:spring-web及spring-webmvc
spring-web:spring与web集成
spring-web的作用:包含web应用开发时,用到spring框架时所需的核心类,包括自动载入webapplicationcontext特性的类、struts与jsf集成类、文件上传的支持类、filter类和大量工具辅助类。
通过spring获取应用上下文对象
-
在仅仅使用spring的时候,应用上下文的获取如下图:
弊端:每次从容器中获取bean都要编写new ClassPathXmlApplicationContext
,每次获取都要加载一次核心配置文件,应用上下文创建多次。
-
自己写工具类实现(模拟spring获取app原理)
在web项目中,可以使用ServletContextListener监听web应用的启动,在tomcat启动的时候加载一次spring配置文件并创建应用上下文对象,并将其存储在最大的域servletContext域中,这样就可以在任意位置从域中获取上下文对象了。
-
spring-web提供获取应用上下文的工具
本功能使用依赖:<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-web</artifactId> <version>5.2.7.RELEASE</version> </dependency>
spring-web提供了一个监听器ContextLoaderListener,该监听器内部加载spring配置文件,创建应用上下文对象,并存储在ServletContext域中,提供一个客户端工具WebApplicationContextUtils供使用者获取应用上下文对象。
spring-webmvc
本功能使用依赖:
<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.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
spring-webmvc所依赖的包:(包含spring-context,spring-web)
在使用springmvc之前,我们都需要写servlet接口的实现类。现在使用springmvc,通过一套注解,可以让一个简单的java类成为处理请求的控制器,无需实现任何接口。
springmvc快速入门
开发步骤:
1. 导入springmvc坐标
2. 配置springmvc核心前端控制器DispathcerServlet,让servlet去加载springmvc配置文件
3. 使用注解配置Controller类中业务方法的映射地址
4. 配置springmvc核心配置文件spring-mvc.xml(可任意命名)
5. 客户端发起请求
概念理解:Spring父容器与子容器
父子容器的主要作用应该是划分框架边界。有点单一职责的味道。查看文章:spring和springmvc父子容器的理解 父子容器概念
springmvc执行流程
springmvc框架是使用servlet充当前端控制器。
- 流程图示
- 完整执行流程
springmvc响应返回
- 重点是springmvc自动将对象转化为json字符串返回数据
- 需要引入jackson包
- @ResponseBody声明告知mvc,不进行视图跳转,而是直接进行数据响应
- 配置mvc的注解驱动:
<mvc:annotation-driven/>
在springmvc的各个组件中,处理器映射器,处理器适配器,视图解析器称为springmvc的三大组件。 使用<mvc:annotation-driven/>自动加载RequestMappingHandlerMapping(处理器映射器)和RequestMappingHandlerAdpter(处理器适配器)。 可以在spring-mvc.xml配置文件中配置<mvc:annotation-driven/>代替注解处理器和适配器的配置, 同时使用<mvc:annotation-driven/>默认底层就会集成jsckson进行对象或集合的json字符串转换。
springmvc获得请求数据
-
获得基本类型参数
- Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配
- Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配
-
获得POJO类型参数
- Controller中的业务方法的POJO参数的属性名要与请求参数的name一致,参数值会自动映射匹配
- Controller中的业务方法的POJO参数的属性名要与请求参数的name一致,参数值会自动映射匹配
-
获得数组类型参数
- Controller中的业务方法的数组名称要与请求参数的name一致,参数值会自动映射匹配
- Controller中的业务方法的数组名称要与请求参数的name一致,参数值会自动映射匹配
-
获得集合类型参数
- 前端发起ajax请求时,可以指定contentType为json形式,那么在方法参数位置使用
@RequestBody
可以直接接收集合数据,二无需使用POJO包装
- 前端发起ajax请求时,可以指定contentType为json形式,那么在方法参数位置使用
-
参数绑定:@RequestParam
- 当请求参名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示绑定
- 当请求参名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示绑定
-
占位符参数获取:@PathVariable
-
获取请求头信息
-
解决请求中文乱码