Spring框架
SpringMVC
概述
SpringMVC相关组件
- 前端控制器:DispatcherServlet -重点
- 处理器映射器:HandlerMapping
- 处理器适配器:HandlerAdapter
- 处理器:Handler
- 视图解析器:View Resolver
- 视图:View
使用步骤
-
导入SpringMVC相关坐标
-
配置核心控制器DispathcerServlet(前端控制器)-web.xml
-
创建Controller和视图页面
-
将Controller使用注解配置到Spring容器中
-
配置组件扫描(配置spring-mvc.xml文件)
-
客服端发起请求
遇到问题
先查看报错的cause,如果整个步骤没有问题,可能是包版本不对应,这里把json的包版本改到2.9.4就可以运行了,查了好久才知道
SpringMVC执行流程
SpringMVC注解解析
@RequestMapping
Spring-mvc.xml配置
1.视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <--/qianzhui/xxx.jsp--> <property name="prefix" value="/qianzhui/"></property> <property name="suffix" value=".jsp"></property> </bean>
SpringMVC的数据响应
页面跳转
-
直接返回字符串
将返回的字符串与视图解析器的前后缀进行拼接后跳转
-
通过ModelAndView的对象返回
回写数据
- 直接返回字符串
- 通过SpringMVC框架注入的response对象,使用response.getWriter().print(“Hello”)回写数据,此时不需要视图跳转,业务方式为voi
//通过response域来回写数据 @RequestMapping("/quick6") public void save6(HttpServletResponse response) throws IOException { response.getWriter().print("Hello World by quick6"); }
- 将需要回写的字符串直接返回,此时需要通过@ResponseBody注解告知SpringMVC框架,是字符串不是跳转
@RequestMapping("/quick7") @ResponseBody //直接进行数据回写,而不是跳转 public String save7(){ return "Hello World by quick7"; }
-
返回对象或集合
json格式字符串
- 导入jackson-core坐标
-
使用转换工具将对象转换成json格式字符串返回
//回写json格式字符串 @RequestMapping("/quick8") @ResponseBody //直接进行数据回写,而不是跳转 public String save8() throws IOException { User user = new User(); user.setName("CherryLi"); //将对象转成json格式字符串返回 ObjectMapper objectMapper = new ObjectMapper(); //注意!这里的User类中一定要包含public的get()才能转json String json = objectMapper.writeValueAsString(user); return json; }
或
使用在SpringMVC中配置转换器 spring-mvc.xml
<!--配置处理器映射器--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> > <property name="messageConverters"> > <list> > <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> > </list> > </property> > </bean> > ```
//由Spring自动将对象转换为json(在Spring-mvc.xml中配置处理器映射器) @RequestMapping("/quick9") @ResponseBody //直接进行数据回写,而不是跳转 public User save9(){ //这里直接返回对象,会由Spring自动转换 User user = new User(); user.setName("CherryLi"); return user; }
3.使用注解方式代替2中的操作(重点)-spring-mvc.xml
SpringMVC三大组件,处理器适配器,处理器映射器,视图解析器。可以使用<mvc:annotation-driven/>
在mvc配置文件中代替映射器和适配器的配置(如2中的转换器就包含其中)
SpringMVC获得请求数据
获得请求参数
-
基本类型
Controller中的业务方法和参数名称与请求参数name一致,参数值就会自动映射匹配
localhost/user/quick11?username=xxx&age=xxx
-
POJO类型
Controller中的业务方法和POJO参数名称与请求参数name一致,参数值就会自动映射匹配
localhost:8080/user/quick11?name=cherryLi
-
数组类型
同上
localhost:8080/user/quick12?s=aaa&s=bbb&s=ccc
-
集合类型
VO类中包含了userLIst,那么在input中使用下图的方式来提交集合
或
获得集合参数类型
使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接受集合数据而无需使用POJO包装
注意参数里的@RequestBody
请求数据乱码问题
post请求使用中文,会出现乱码,可以设置一个过滤器来进行编码的过滤 -web.xml
<!--配置全局过滤filter-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
参数绑定@requestParam
当请求的参数名曾与Contriller的业务方法参数名称不一致时,需要通过@RequestParam注解显示的绑定
获得Restful风格的参数
Restful时架构风格、设计风格,提供了一组设计原则和约束条件。主要用于客户端和服务器交互类软件,基于这个风格设计的软件更加简洁,更有层次,易于实现缓存机制。
自定义类型转换器
spring自己提供的转换器并不能满足所有需求,所以有时候需要自己定义
Spring
- P命名空间(属性 properties)
- C命名空间(构造 Contructor)
SpringBoot
简化开发
约定大于配置
- 基于POJO的轻量级和最小侵入性编程,所有东西都是bean;
- 通过IOC,依赖注入(DI)和面向接口实现松耦合;
- 基于切面(AOP)和惯例进行声明式编程;
- 通过切面和模版减少样式代码,RedisTemplate,xxxTemplate;
@RestController
相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
@RequestMapping
@RequestMapping是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;在方法的级别表示进一步指定到处理方法的映射关系。
相应地,PUT 方式、POST 方式和 DELETE 方式对应的注解分别为 @PutMapping
、@PostMapping
和 DeleteMapping
。
- value 属性:指定请求的实际地址,value 可以省略不写
- method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET
- produces属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”
@PathVariable
@PathVariable
注解主要是用来获取 url 参数,Spring Boot 支持 restfull 风格的 url,比如一个 GET 请求携带一个参数 id 过来,我们将 id 作为参数接收,可以使用 @PathVariable
注解。
@GetMapping("/user/{idd}/{name}")
public String testPathVariable(@PathVariable(value = "idd") Integer id, @PathVariable String name) {
return "success";
}
@RequestParam
区别于PathVariable,@RequestParam
是从 request 里面获取参数值,即这种风格的 url:http://localhost:8080/user?id=1
。
@RequestMapping("/user")
public String testRequestParam(@RequestParam(value = "idd", required = false) Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
- required 属性:true 表示该参数必须要传,否则就会报 404 错误,false 表示可有可无。
- defaultValue 属性:默认值,表示如果请求中没有同名参数时的默认值。
@RequestBody
接收前端传来的实体
Demo
配置文件:
- application.properties (key=value)
- application.yml (key:value)
1.普通数据
ps: value之前有一个空格,键-值之间都有一个空格
字符串默认不用加引号:
“ ”:双引号:不会转义字符串里面的特殊字符,特殊字符会作为本身想表达的意思:
name: “zhangsan \n lisi” ==> 输出:zhangsan 换行 lisi
’ ':单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据:
name: ‘zhangsan \n lisi’ ==> 输出:zhangsan \n lisi
2.对象数据、map数据
# 1.对象数据示例
# @Value可以从此处获取值,适合量需要配置常用值的类
user:
uid: 1
nickname: Cherry
headIcon: cherry.jpg
gender: true
# 或者写成
#user: {uid: 1,nickname: Cherry, headIcon: cherry.jpg,gender: 1,achievement: 12}
#2.数组(List、Set)数据示例
city: [BeiJing,ShangHai,XiaMen]
country:
- CN
- US
- JP
@Value和ConfigurationProperties
@lombok.Data
@Component
// 该类必须要在容器中,才能使用@ConfigurationProperties
@ConfigurationProperties(prefix = "user")
public class Value {
// 效果同在此处加上,@Value{${user.uid}}
private Integer uid;
private String nickname;
private String headIcon;
private Boolean gender;
}
JSR303数据校验
![img](https://i-blog.csdnimg.cn/blog_migrate/ecb406d94394b36ab6eabd04435c9258.png)
@PropertySource 与 @ImportResource
- @PropertySource(默认不支持yml配置文件)
- @ImportResource:导入Spring的配置文件,让配置文件中内容生效
整合JDBC和事务
<!-- JDBC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
整合连接池
springboot 在jdbc中自带了一个HikariCP连接池,其他连接池通过导入依赖和更改设置配置文件上的一点差异就能完成
整合Mybatis
- 依赖导入
<!--mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
- 创建实体类
- 创建Mapper接口
- 对应映射文件(需要的话maven配置过滤)
- 完善Dao、Service、Controller
总结:整体上和SpringBoot没有太多关联的地方,原本需要配置的基本都由Springboot简化完成了
dbc中自带了一个HikariCP连接池,其他连接池通过导入依赖和更改设置配置文件上的一点差异就能完成
整合Mybatis
- 依赖导入
<!--mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
- 创建实体类
- 创建Mapper接口
- 对应映射文件(需要的话maven配置过滤)
- 完善Dao、Service、Controller
总结:整体上和SpringBoot没有太多关联的地方,原本需要配置的基本都由Springboot简化完成了