当前位置: 首页 > news >正文

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

目录

一、请求响应学习

 1、请求

简单参数

实体参数

数组集合参数

日期参数

Json参数

路径参数

总结

2、响应

@ResponseBody&统一响应结果

二、分层解耦

1、三层架构

三层架构含义

架构划分

2、分层解耦

引入概念

容器认识

3、IOC&DI入门

4、IOC详解

5、DI详解


一、请求响应学习

 1、请求

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

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

简单参数

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

下面是示例代码:

@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的封装,能更好地实现多元素变量的接收使用。

代码示例:

@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;}@Overridepublic 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;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}

数组集合参数

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

代码示例:

@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。

代码示例:

@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的输出格式也不同。

代码示例:

@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;}@Overridepublic 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;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}

路径参数

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

代码示例:

@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&统一响应结果

        学习响应数据的设置。

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

代码示例:

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详解

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 昇思25天学习打卡营第22天|CycleGAN图像风格迁移互换
  • 代码随想录 day 25 回溯
  • Docker 制作java8镜像
  • 橙单前端项目下载编译遇到的问题与解决
  • 02 MySQL数据库管理
  • LabVIEW汽车动态信号模拟系统
  • 基于微信小程序+SpringBoot+Vue的刷题系统(带1w+文档)
  • 【C#】 CancellationTokenSource 与Thread的启动、取消的区别?
  • 打卡第27天------贪心算法
  • 探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6
  • 算能端侧 AI 盒子 Stable Diffusion 一秒一张图:AirBox BM1684X
  • 【RHCE】实战练习
  • 物联网在电力行业的应用
  • React hook 之 useState
  • 基于opencv[python]的人脸检测
  • [译]如何构建服务器端web组件,为何要构建?
  • 03Go 类型总结
  • 4个实用的微服务测试策略
  • DataBase in Android
  • ES2017异步函数现已正式可用
  • isset在php5.6-和php7.0+的一些差异
  • JDK9: 集成 Jshell 和 Maven 项目.
  • node 版本过低
  • Python学习之路13-记分
  • Vue2.x学习三:事件处理生命周期钩子
  • vue--为什么data属性必须是一个函数
  • vue总结
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 给github项目添加CI badge
  • 规范化安全开发 KOA 手脚架
  • 如何编写一个可升级的智能合约
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我是如何设计 Upload 上传组件的
  • Java数据解析之JSON
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #window11设置系统变量#
  • (1)Jupyter Notebook 下载及安装
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二十四)Flask之flask-session组件
  • (算法)Game
  • (转)http-server应用
  • **PHP二维数组遍历时同时赋值
  • ..回顾17,展望18
  • .gitignore文件设置了忽略但不生效
  • .md即markdown文件的基本常用编写语法
  • .net mvc部分视图
  • .net wcf memory gates checking failed
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化