Spring-实习期笔记

Spring框架

Spring体系结构图

SpringMVC

概述

SpringMVC相关组件

  • 前端控制器:DispatcherServlet -重点
  • 处理器映射器:HandlerMapping
  • 处理器适配器:HandlerAdapter
  • 处理器:Handler
  • 视图解析器:View Resolver
  • 视图:View

使用步骤

  1. 导入SpringMVC相关坐标

    image-20211116141220578

  2. 配置核心控制器DispathcerServlet(前端控制器)-web.xml

    image-20211116142224358

  3. 创建Controller和视图页面

    image-20211116142442972

    image-20211116142451058

  4. 将Controller使用注解配置到Spring容器中

    image-20211116142302613

  5. 配置组件扫描(配置spring-mvc.xml文件)

    image-20211116142652847

  6. 客服端发起请求

遇到问题

image-20211116173112135

image-20211116173052443

先查看报错的cause,如果整个步骤没有问题,可能是包版本不对应,这里把json的包版本改到2.9.4就可以运行了,查了好久才知道

SpringMVC执行流程

image-20211116174433926

image-20211116174457585

SpringMVC注解解析

@RequestMapping

image-20211116180600707

image-20211116180521617

Spring-mvc.xml配置

1.视图解析器

image-20211116220635664

<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的数据响应

页面跳转

  • 直接返回字符串

    将返回的字符串与视图解析器的前后缀进行拼接后跳转

    image-20211116222424934

  • 通过ModelAndView的对象返回

    image-20211116224450705

    image-20211116225336881

回写数据

  • 直接返回字符串
  1. 通过SpringMVC框架注入的response对象,使用response.getWriter().print(“Hello”)回写数据,此时不需要视图跳转,业务方式为voi
//通过response域来回写数据
@RequestMapping("/quick6")
public void save6(HttpServletResponse response) throws IOException {
 response.getWriter().print("Hello World by quick6");
}
  1. 将需要回写的字符串直接返回,此时需要通过@ResponseBody注解告知SpringMVC框架,是字符串不是跳转
@RequestMapping("/quick7")
@ResponseBody  //直接进行数据回写,而不是跳转
public String save7(){
  return "Hello World by quick7";
}
  • 返回对象或集合

    json格式字符串

  1. 导入jackson-core坐标

image-20211117162655456

  1. 使用转换工具将对象转换成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中的转换器就包含其中)
image-20211117171835663

SpringMVC获得请求数据

获得请求参数

  • 基本类型

    Controller中的业务方法和参数名称与请求参数name一致,参数值就会自动映射匹配

    localhost/user/quick11?username=xxx&age=xxx

    image-20211117172937057

  • POJO类型

    Controller中的业务方法和POJO参数名称与请求参数name一致,参数值就会自动映射匹配

    localhost:8080/user/quick11?name=cherryLi

    image-20211117173328945

  • 数组类型

    同上

    localhost:8080/user/quick12?s=aaa&s=bbb&s=ccc

    image-20211117174412089

  • 集合类型

    VO类中包含了userLIst,那么在input中使用下图的方式来提交集合

    image-20211117180156789

    获得集合参数类型

    ​ 使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接受集合数据而无需使用POJO包装

    image-20211117220646866

    image-20211117220737373

    注意参数里的@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注解显示的绑定

image-20211117222207968

获得Restful风格的参数

Restful时架构风格、设计风格,提供了一组设计原则和约束条件。主要用于客户端和服务器交互类软件,基于这个风格设计的软件更加简洁,更有层次,易于实现缓存机制。

image-20211117222451749

image-20211117224228038

自定义类型转换器

spring自己提供的转换器并不能满足所有需求,所以有时候需要自己定义

Spring

  1. P命名空间(属性 properties)
  2. C命名空间(构造 Contructor)

SpringBoot

简化开发

约定大于配置

  1. 基于POJO的轻量级和最小侵入性编程,所有东西都是bean;
  2. 通过IOC,依赖注入(DI)和面向接口实现松耦合;
  3. 基于切面(AOP)和惯例进行声明式编程;
  4. 通过切面和模版减少样式代码,RedisTemplate,xxxTemplate;
@RestController

相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

@RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;在方法的级别表示进一步指定到处理方法的映射关系。

相应地,PUT 方式、POST 方式和 DELETE 方式对应的注解分别为 @PutMapping@PostMappingDeleteMapping

  • 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

image-20220214164839197

@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

img

image-20220214170534599

image-20220214170430395

@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>
整合连接池

image-20220214112844213

springboot 在jdbc中自带了一个HikariCP连接池,其他连接池通过导入依赖和更改设置配置文件上的一点差异就能完成

整合Mybatis
  1. 依赖导入
<!--mybatis -->
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.3.2</version>
</dependency>
  1. 创建实体类
  2. 创建Mapper接口
  3. 对应映射文件(需要的话maven配置过滤)
  4. 完善Dao、Service、Controller

总结:整体上和SpringBoot没有太多关联的地方,原本需要配置的基本都由Springboot简化完成了
dbc中自带了一个HikariCP连接池,其他连接池通过导入依赖和更改设置配置文件上的一点差异就能完成

整合Mybatis
  1. 依赖导入
<!--mybatis -->
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.3.2</version>
</dependency>
  1. 创建实体类
  2. 创建Mapper接口
  3. 对应映射文件(需要的话maven配置过滤)
  4. 完善Dao、Service、Controller

总结:整体上和SpringBoot没有太多关联的地方,原本需要配置的基本都由Springboot简化完成了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值