请求、响应、分层解耦(黑马程序员第五天)

想要响应请求需要实现Servlet接口
springboot中DispatcherServlet实现了此接口

前端请求会被DispatcherServlet封装为HttpServletRequest对象
并通过HttpservletResponse对象响应数据
BS架构

请求

请求参数接收

简单参数接收

方法一:通过原始httpservletRequest(了解即可)
繁琐、手动类型转换

@RestController
public class RequestController {
    @RequestMapping("/simprequest")
    public String simpleParam(HttpServletRequest request){
        String name=request.getParameter("name");
        String age=request.getParameter("age");
        System.out.println(name+"你的年龄是:"+age);
        return "OK";
    }
}

方法二:springboot方式
简单参数:参数名与形参变量名相同、定义形参即可接收参数
如果参数名不相同则接收失败
但可以通过@RequestParam(name=“指定接收参数的名字”) String 自己定义的名字
默认参数true(必须传递这个参数)
按需要改为false

@RestController
public class RequestController {
    @RequestMapping("/simprequest")
    public String simpleParam(String name,Integer age){
        System.out.println(name+"你的年龄是:"+age);
        return "OK";
    }
}

实体参数接收

方法一:springboot方式
实体参数
简单实体对象:
请求参数名与形参对象属性名对应
应以POJO(普通的 Java 对象)接收即可

@RestController
public class RequestController {
    @RequestMapping("/simprequest")
    public String simpleParam(User user){
        System.out.println(user.getName()+"你的年龄是:"+user.getAge());
        return "OK";
    }
}

方法二:springboot方式
实体参数
复杂实体参数:
请求参数名与形参对象属性名对应
按照对象层次结构关系即可接收嵌套POJO属性参数

数组集合参数

方法一:数组参数
请求参数名与形参数组名称相同且请求参数为多个
定义数组类型形参即可接收

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

方法二:集合参数
请求参数名与形参集合名称相同且请求参数为多个
@RequestParam绑定参数关系

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

日期参数接收

使用@DataTimeFormat注解完成日期参数格式转换

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

json参数

JSON数据键名与形参对象属性名相同
定义POJO类型形参即可接收参数
需要使用@RequestBody标识

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

路径参数

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

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

响应

@ResponseBody
类型:方法注解、类注解
位置:Controller方法上、类上
作用:
将方法返回值直接响应
如果返回值类型是 实体对象、集合
将会转换为JSON格式响应
说明:@RestController=@Controller+@ResponseBody

虽然可以响应任何数据类型
但是前端解析成本较高
约定统一响应格式:

public class Result {
    //响应码
    private Integer code;
    //提示信息
    private String msg;
    //返回数据
    private Object data;
}

Result

分层解耦

三层架构

Dao(数据访问层):数据访问(增删改查)
service(业务逻辑层):逻辑处理
Controller(控制访问层):接收请求(相应数据)

分层解耦

内聚:软件中各个功能模块内部的功能联系
耦合:衡量软件中各个层、模块之间的依赖、关联程度
软件开发目标:高内聚、低耦合

控制反转:
IOC,对象的创建控制权由程序自身转移到外部(容器)、这种思想称为控制反转

依赖注入:
DI,容器为应用程序提供运行时所依赖的资源,称为依赖注入

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

IOC/DI入门步骤:
1、Service层及Dao层的实现类,交给IOC容器管理(加上@component注解)
2、为Controller及Service注入运行时,依赖的对象(加上@Autowired注解)
3、运行测试

IOC细节:
一般用component的衍生类
@Service
@Repository
@Controller

Bean组件扫描:
声明bean的四大注解,要想生效,还需要被扫描注解@ComponentScan扫描
@ComponentScan注解虽然没有显式配置,但实际已经包含在启动声明注解
@SpringBootApplication中,默认扫描的范围是启动类所在包以及子包

DI细节:
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,会报错

解决方案:
@Primary//优先级(重复时用谁)
@Qualifier//指定用谁(名字)默认类型首字母小写
@Resource//不要用@Autowired(不是一个体系),直接@Resource(name=“”)

@Resource与@Autowired的区别
1:前者是JDK提供的注解、后者是spring框架提供的注解
2:前者按照name注入,后者按照类型注入

你可能感兴趣的:(java,开发语言)