SpringBootWeb请求响应

在SpringBoot进行web程序开发时,它内置了一个核心的Servlet程序 DispatcherServlet,称之为 核心控制器

简单参数

简单参数的SpringBoot方式:SpringBoot是对原始API的包装,让接受参数的形式变简单;

简单参数:参数名与形参变量名相同,定义同名的形参即可接收参数。

如果方法的形参名称与请求的参数不一致还有使用@RequestParam来完成映射。

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("username")String name , Integer age ){
    System.out.println(name+"  :  "+age);
    return "OK";
}

实体参数

如果请求参数比较多,一个一个接受比较繁琐,这时就可以将请求的参数装到一个POJO对象中,想要完成封装就要完成规则:

简单实体参数: 请求参数名与POJO属性名相同

复杂实体参数指定是实体类中有一个或多个属性

复杂实体参数:请求参数名与POJO属性名相同,按照对象层次结构关系就可以获得POJO属性参数

@RequestMapping("/simplePojo")
public String simplePojo(User user){
    System.out.println(user);
    return "OK";
}

数组集合参数

数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
    System.out.println(Arrays.toString(hobby));
    return "OK";
}

 

集合参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系

@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
    System.out.println(hobby);
    return "OK";
}

日期参数

日期类型的参数在进行封装的时,需要@DateTimeFormat注解pattern属性来设置日期的格式

@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
    System.out.println(updateTime);
    return "OK";
}

JSON参数

前后端交互时,如果参数太复杂会使用,就会使用JSON参数进行数据传输,传递JSON参数时我们通常会用实体类封装,封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody 标识。

@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
    System.out.println(user);
    return "OK";
}

路径参数

在请求体传递参数,在请求的url后面通过 ?xxx=xxx 的形式传递参数,直接在请求的URL中传递参数,被称为路径参数

路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用 @PathVariable 获取路径参数

@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
    System.out.println(id);
    return "OK";
}

@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id, @PathVariable String name){
    System.out.println(id+ " : " +name);
    return "OK";
}

响应

@ResponseBody

  • 名称:@ResponseBody
  • 类型:方法注解、类注解
  • 位置:SpringMVC控制器方法上/类上
  • 作用:将当前方法返回值直接返回,如果是 实体/集合 转换为JSON返回

我们没有使用@ResponseBody的原因是@RestController注解里面包装了@ResponseBody

统一响应结果

由于Controller的方法,返回值各种各样,所以我们要规定一个统一的项目,

A. 当前请求是成功,还是失败。

B. 当前给页面的提示信息。

C . 返回的数据。

对于上述的这些数据呢,我们一般都会定义在一个实体类Result中和javaBean差不多,

分层解耦

三层架构:

  • Controller:接收前端发送的请求,对请求进行处理,并响应数据
  • Service:处理具体的业务逻辑
  • Dao:负责数据的访问操作,包含数据的增、删、改、查

耦合问题:

我们首先需要了解软件开发领导涉及到的两个概念:内聚和耦合。

内聚:软件中各个功能模块内部的功能联系。

耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

软件设计原则:高内聚低耦合。

高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。

低耦合指的是:软件中各个层、模块之间的依赖关联程度越低越好。

高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。

解耦思路

将对象交给容器管理的过程 , 称之为 控制反转。 Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。 而这个容器, 称之为IOC容器,或者Spring容器。

应用程序运行时, 容器为其提供运行时所需要的资源, 这个过程我们称之为依赖注入。 Dependency Injection,简称DI

IOC容器中创建、管理的对象,称之为bean

IOC&DI

Service层 及 Dao层的实现类,交给IOC容器管理。

在类上加上 @Component 注解,就是将该类声明为IOC容器中的bean

为Controller及Service注入运行时依赖的对象。

在成员变量上加上 @Autowired 注解,表示在程序运行时,Springboot会自动的从IOC容器中找到UserService类型的bean对象,然后赋值给该变量。

bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 目前来说,我们使用以上四个注解都可以声明bean,但是在集成后端web开发之后,声明控制器bean只能用@Controller。

 但是需要注意:@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:

我们可以通过如下几种方案来解决:

1). @Primary 注解

当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

2). @Qualifier 注解

可以通过@Autowired ,配合@Qualifier 来指定我们当前要注入哪一个bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。

3). @Resource注解

通过@Resource注解,并指定其name属性,通过name指定要注入的bean的名称。这种方式呢,是按照bean的名称进行注入。

@Autowird 与 @Resource的区别:

  • @Autowird 属于spring框架,默认按照bean的类型注入。 可以配合 @Qualifier注解,实现按照名称注入。
  • @Resource是JavaEE自带的注解,根据bean的名称进行注入的。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值