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默认是按照名称注入

相关推荐
hrhcode15 分钟前
【java工程师快速上手go】二.Go进阶特性
java·golang·go
wjs202418 分钟前
JavaScript 语句
开发语言
OpenTiny社区1 小时前
重磅预告|OpenTiny 亮相 QCon 北京,共话生成式 UI 最新技术思考
前端·开源·ai编程
前端老实人灬1 小时前
web前端面试题
前端
Moment1 小时前
AI 全栈指南:NestJs 中的 Service Provider 和 Module
前端·后端·面试
IT_陈寒1 小时前
为什么我的JavaScript异步回调总是乱序执行?
前端·人工智能·后端
Moment1 小时前
AI全栈入门指南:NestJs 中的 DTO 和数据校验
前端·后端·面试
cmpxr_1 小时前
【C】局部变量和全局变量及同名情况
c语言·开发语言
小码哥_常1 小时前
告别RecyclerView卡顿!8个优化技巧让列表丝滑如德芙
前端
小村儿2 小时前
Harness Engineering:为什么你用 AI 越用越累?
前端·后端·ai编程