JavaWeb学习——请求响应、分层解耦

目录

一、请求响应学习

1、请求

简单参数

实体参数

数组集合参数

日期参数

Json参数

路径参数

总结

2、响应

@ResponseBody&统一响应结果

二、分层解耦

1、三层架构

三层架构含义

架构划分

2、分层解耦

引入概念

容器认识

3、IOC&DI入门

4、IOC详解

5、DI详解


一、请求响应学习

1、请求

在学习请求这一内容时,我使用的工具是IDEA和Postman,所以后面进行展示请求示例的都是Postman来调试出的。

此部分内容包括:简单参数、实体参数、数组集合参数、日期参数、Json参数、路劲参数。

简单参数

注:在postman中,使用上面的代码,postman里的KEY变量名要与代码的一致,否则IDEA后端部分接受值将为null。

下面是示例代码:

java 复制代码
@RestController
public class RequestController {

    //原始方式
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        //获取请求参数
        String name=request.getParameter("name");
        String ageStr=request.getParameter("age");

        int age=Integer.parseInt(ageStr);
        System.out.println(name+":"+age);
        return  "OK";
    }

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

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

}

实体参数

实体参数里采用了Java的封装,能更好地实现多元素变量的接收使用。

代码示例:

java 复制代码
@RestController
public class RequestController {

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

}

public class User {
    private String name;
    private Integer age;
    private Address address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

public class Address {
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

数组集合参数

数组集合参数可以实现统一元素变量的多个数值传递获取,更加高效,且在已有集合的情况下,最好多使用集合,数组在一些方面会降低效率,且开发普遍用的是集合。

代码示例:

java 复制代码
@RestController
public class RequestController {

//数组集合参数
    @RequestMapping("/arrayParams")
    public String arrayParams(String[] hobby) {
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }
    //数组集合参数
        @RequestMapping("/listParams")
        public String listParams(@RequestParam List<String> hobby){
            System.out.println(hobby);
            return "OK";
    }

}

日期参数

注:想要前端部分的日期数据能完整反馈到后端上,后端的代码要遵循标准格式,前端的数据格式也要相同,且如果月份、日为个位数时,前面要加个0。

代码示例:

java 复制代码
@RestController
public class RequestController {

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

}

Json参数

在Postman里使用Json参数时就得进行部分切换操作,且Json的输出格式也不同。

代码示例:

java 复制代码
@RestController
public class RequestController {

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

}

package org.start.pro;

public class User {
    private String name;
    private Integer age;
    private Address address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

package org.start.pro;

public class Address {
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

路径参数

图中上面是一个路径参数的传递,下面是两个路径参数的传递,如果要实现多个路径参数的传递,可以参考下面部分。

代码示例:

java 复制代码
@RestController
public class RequestController {

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

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

总结

2、响应

@ResponseBody&统一响应结果

学习响应数据的设置。

注:对于响应结果的设置我们一般有统一的模板规范,以便于后续前后端交流。

代码示例:

java 复制代码
package org.start.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.start.pro.Address;
import org.start.pro.Result;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ResponseController {

//    @RequestMapping("/hello")
//    public String hello(){
//        System.out.println("Hello World!");
//        return "Hello World~";
//    }
//
//    @RequestMapping("/getAddr")
//    public Address getAddr(){
//        Address addr=new Address();
//        addr.setProvince("广东");
//        addr.setCity("深圳");
//        return addr;
//    }
//
//    @RequestMapping("/listAddr")
//    public List<Address> listAddr(){
//        List<Address> list=new ArrayList<>();
//        Address addr=new Address();
//        addr.setProvince("广东");
//        addr.setCity("深圳");
//
//        list.add(addr);
//        return list;
//    }

    @RequestMapping("/hello")
    public Result hello(){
        System.out.println("Hello World!");
        //return new Result(1,"success","Hello World~");
        return Result.success("Hello World~");
    }

    @RequestMapping("/getAddr")
    public Result getAddr(){
        Address addr=new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");
        return Result.success(addr);
    }

    @RequestMapping("/listAddr")
    public Result listAddr(){
        List<Address> list=new ArrayList<>();
        Address addr=new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");

        list.add(addr);
        return Result.success(list);
    }
}

上面内容提供了普通书写的设置代码和标准化后的设置代码。

二、分层解耦

1、三层架构

三层架构含义

三层架构就是为了符合"高内聚,低耦合"思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。

三层架构区分层次的目的是为了 "高内聚,低耦合"。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。

架构划分

以后的后端开发大多都遵循这一体系。

2、分层解耦

引入概念

分层解耦也是软件架构设计中经常会接触到的概念。其关键思想在于将整个系统分离为不同的层级,每一层都对一个特定的关注点进行抽象。常见的分层解耦架构包括表示层、业务逻辑层和数据访问层,每一层都有其独立的功能,而且层与层之间只通过接口交互,减少相互之间的依赖关系。

容器认识

当service层的代码内容发生改变时,controller层也要同步改变,这时就出现了耦合,此时就要引入容器了。

在Java Web开发中,容器(Container)是一个服务器扩展,允许处理 Servlet、JSP、JSF、filters等。根据处理的内容,我们可以将容器主要划分为两类,他们是:Servlet 容器和 EJB 容器。

Servlet 容器,又称为Web 容器,它是运行在Web服务器上的一个组件,主要负责管理并执行Web应用中的Servlet和JSP等内容。

EJB 容器或企业级JavaBeans容器则是位于业务层的服务,并主要负责执行如安全性和事务管理等的服务器级服务。

这两种容器均为Java EE规范的一部分。容器通过对组件的生命周期进行管理来帮助实现分层和解耦。

3、IOC&DI入门

使用注解便可实现功能。

4、IOC详解

注:代码缺失,建议去找代码案例看看。

5、DI详解

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习