JavaWeb_请求参数,设置响应数据,分层解耦

使用SpringBoot方式完成请求响应:

传递简单参数:

复制代码

复杂实体对象:

数组集合参数:

使用数组进行封装:

使用集合进行封装:

日期参数:

JSON参数:

路径参数:

java 复制代码
package com.sayonara.controller;

import com.sayonara.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

//请求处理类
@RestController
public class RequestController {
    //简单参数
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name", required = false) String username, String age) {
        System.out.println(username + age);
        return "ojbk";
    }

    //实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        System.out.println(user);
        return "ojbk2";
    }

    //数组接受参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby) {
        System.out.println(Arrays.toString(hobby));
        return "ojbk3";
    }

    //集合接收参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby) {
        System.out.println(hobby);
        return "ojbk4";
    }

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

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

    //路径参数
    @RequestMapping("path/{id}/{name}")
    public String pathParam(@PathVariable Integer id,@PathVariable String name){
        System.out.println(id + ":" + name);
        return "ojbk8";
    }
}

响应数据:

统一响应结果:

java 复制代码
package com.itheima.pojo;

/**
 * 统一响应结果封装类
 */
public class Result {
    private Integer code ;//1 成功 , 0 失败
    private String msg; //提示信息
    private Object data; //数据 date

    public Result() {
    }
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }

    public static Result success(Object data){
        return new Result(1, "success", data);
    }
    public static Result success(){
        return new Result(1, "success", null);
    }
    public static Result error(String msg){
        return new Result(0, msg, null);
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

例:

java 复制代码
    @RequestMapping("/simpleParam")
    public Result result(@RequestParam(name = "name", required = false) String username, String age) {
        System.out.println(username + age);
        //return new Result(1,"success","ojbk");
        //由于Result有静态方法,所以也可以这么做
        return Result.success();
    }

Result的静态方法:

java 复制代码
    public static Result success(Object data){
        return new Result(1, "success", data);
    }
    public static Result success(){
        return new Result(1, "success", null);
    }
    public static Result error(String msg){
        return new Result(0, msg, null);
    }

分层解耦:

三层架构:

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

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

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

java 复制代码
@Component    //将当前类交给IOC容器管理,成为IOC容器中的Bean
java 复制代码
@Autowired    //运行时,IOC容器会提供该类型的Bean对象,并赋值给该变量 - 依赖注入

*当有两个类同时实现了一个接口时,需要哪个类的对象直接将 @Component注解放在它上面就行

Bean的声明:

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

@Component下的三个注解分别对应Controller,Service,Dao三层的bean对象

在SpringBoot集成Web开发中,声明控制器bean只能用@Controller

Bean的名字默认是类名的首字母小写

如果需要自定义Bean名称,可以:

java 复制代码
@Respository(value = "daoA")

或者:

java 复制代码
@Respository("daoA")

前面声明Bean的四大注解,要想生效,还要被组件扫描注解 @ComponentScan扫描

@ConponentScan 注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描范围是启动类所在包及其子包

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

可以通过以下几种方案解决:

@Primary:

直接在类上加上此注解,即可让此类型生效

@Qualifier:

通过与@Autowired 注解配合使用来指定当前Bean

java 复制代码
@RestController
public class Empcontroller{
    @Autowired
    @Qualifier("empService_A")
    private EmpService empservice;
}

@Resource:

由JDK提供,按照名称来进行注入,在注解后指定类型名即可

java 复制代码
@RestController
public class Empcontroller{
    @Resource(name = "empService_A")
    private EmpService empservice;
}

@Resource与@Autowired区别:

1.@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解

2.@Autowired默认是按照类型注入,而@Resource默认是按照名称注入

相关推荐
2301_819414302 小时前
C++与区块链智能合约
开发语言·c++·算法
不想看见4042 小时前
Valid Parentheses栈和队列--力扣101算法题解笔记
开发语言·数据结构·c++
炸膛坦客2 小时前
单片机/C/C++八股:(十五)内存对齐、结构体内存对齐
c语言·开发语言·单片机
娇娇yyyyyy2 小时前
QT编程(13): Qt 事件机制eventfilter
开发语言·qt
bcbobo21cn2 小时前
C# byte类型和byte数组的使用
开发语言·c#·字节数组·byte类型
计算机安禾2 小时前
【C语言程序设计】第37篇:链表数据结构(一):单向链表的实现
c语言·开发语言·数据结构·c++·算法·链表·蓝桥杯
阿贵---2 小时前
C++构建缓存加速
开发语言·c++·算法
Dxy12393102162 小时前
CSS常用样式详解:从基础到进阶的全面指南
前端·css
IT_陈寒3 小时前
SpringBoot自动配置揭秘:5个让开发效率翻倍的隐藏技巧
前端·人工智能·后端