JavaWeb学习路线(4)——请求响应与分层解耦

这篇具有很好参考价值的文章主要介绍了JavaWeb学习路线(4)——请求响应与分层解耦。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述
JavaWeb学习路线(4)——请求响应与分层解耦

二、请求

(一)概念: 全名为HttpServletRequest,其目标是获取请求数据。

(二)简单请求: web端发送基本数据类型数据到服务器进行处理。

1、获取方式

(1)原始方法: 通过参数HttpServletRequest获取请求数据

** 1、服务端代码**

    @RequestMapping("/hello")
    public Map<String, String[]> hello(HttpServletRequest request){
        return request.getParameterMap();
    }

** 2、请求端**

JavaWeb学习路线(4)——请求响应与分层解耦

(2)SpringBoot接收参数:形参名与请求数据名相同,即可获取对应值 或 添加@RequestParam注解映射参数

** 1、服务端代码**

    /**
    * 使用@RequestParam(name = "xxxx",required = true) String name 表示请求端的名称与接口的参数映射并且参数必须传递,name和required属性都默认为参数名和true,当我们需要做出改变时才使用。
    * 注解的意思是“请求端发送的请求数据 xxxx 映射到 服务端的 name 参数,并且这个参数必须在请求体中”
	*/
    @RequestMapping("/hello")
    public int hello(@RequestParam(name="name",required=true) String name,Integer age){
        System.out.println(name + " " +age);
        return 200;
    }

2、请求端

JavaWeb学习路线(4)——请求响应与分层解耦
(三)实体参数: web端发送数据,且符合实体对象属性,则使用实体参数接收

** 1、服务端代码**

@RestController
public class UserController {
    @RequestMapping("/regist")
    public int regist(User user){
        System.out.println(user);
        return 200;
    }
}

class User{
    private String name;
    private String age;

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

    public User() {
    }

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

** 2、请求端**
JavaWeb学习路线(4)——请求响应与分层解耦

注意事项:
1、简单参数可以使用 @RequestParam(name,required) 注解规定接收的参数名和传递必须性。
2、实体参数在请求端中必须与服务端的实体对象的属性名相同。
3、多实体参数在请求端中必须使用“ 实体名.属性名=属性值 ”的结构传递。

(四)集合参数传递

** 1、服务端代码**

@RestController
public class UserController {
    //数组接收参数
    @RequestMapping("/arrayParam")
    public int arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return 200;
    }

    //集合接收参数
    @RequestMapping("/collectionParam")
    public int collectionParam(@RequestParam List<String> hobby){
        System.out.println(Arrays.toString(hobby.toArray()));
        return 200;
    }
}

/*打印结果*/
[,, Rap, 篮球]
[,, Rap, 篮球]

** 2、请求端**
JavaWeb学习路线(4)——请求响应与分层解耦
JavaWeb学习路线(4)——请求响应与分层解耦

(五)日期参数传递

1、服务端代码

@RestController
public class DateController {
    @RequestMapping("/dateParam")
    public int dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date){
        System.out.println(date.toString());
        return 200;
    }
}

/*打印输出*/
2023-06-14T15:47:30

2、请求端
JavaWeb学习路线(4)——请求响应与分层解耦

(六)JSON参数传递

1、服务端代码

@RestController
public class JsonController {
    @RequestMapping("/JsonParam")
    public int JsonParam(@RequestBody User user){
        System.out.println(user);
        return 200;
    }
}

class User{
    private String name;
    private String age;

    private Address address;

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

    public Address getAddress() {
        return address;
    }

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

class Address{
    private String province;
    private String city;

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

/*打印输出*/
User{name='惊喜', age='23', address=Address{province='浙江', city='杭州'}}

2、请求端

JavaWeb学习路线(4)——请求响应与分层解耦

(七)路径参数传递

1、服务器端代码

@RestController
public class PathController {
    @RequestMapping("/pathParam/{id}")
    public int pathParam(@PathVariable Integer id){
        System.out.println(id);
        return 200;
    }
}

/*打印输出*/
1024

2、请求端

JavaWeb学习路线(4)——请求响应与分层解耦

三、响应

(一)概念: 全名为HttpServletResponse,其目标是设置响应数据。

(二)设置响应数据

1、关键注解:@ResponseBody

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

2、封装响应数据

public class Result {
    //状态码
    private int code;
    //返回描述
    private String msg;
    //返回数据
    private Object data;

    public Result() {
    }

    public Result(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
    
    public static Result success(int code,String msg,Object data){
        return new Result(code,msg,data);
    }
    
    public static Result success(){
        return success(200,"success",null);
    }
    
    public static Result error(){
        return new Result(400,"客户端出现错误",null);
    }

    public int getCode() {
        return code;
    }

    public void setCode(int 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;
    }
}

3、返回响应数据

@RestController
public class NewController {
    @RequestMapping("/testParam")
    public Result testParam(){
        String data = "这里有返回数据";
        return Result.success(200,"成功接收",data);
    }
}

4、请求端接收数据
JavaWeb学习路线(4)——请求响应与分层解耦

四、分层解耦

(一)三层架构

JavaWeb学习路线(4)——请求响应与分层解耦

  • 第一层:Contoller: 控制层,负责接收客户端发送的请求,对请求进行处理,并响应数据。
  • 第二次:Service: 业务逻辑层,负责处理具体的业务逻辑
  • 第三层:Dao 数据访问层(Data Access Object)(持久层),负责数据访问操作。

(二)分层解耦

1、两个概念

  • 内聚: 软件各个功能模块内部的功能联系。(只调用不改变)
  • 耦合: 衡量软件中各个层/模块之间的依赖、关联程度。(模块改变不影响其它模块使用)

2、软件设计原则: 高内聚,低耦合

3、Spring如何实现解耦?

(1)相关概念

  • 控制反转 IOC(Inversion Of Control): 对象的创建控制权由程序自身转移到外部(容器)。
  • DI依赖注入(Dependency Injection): 容器为应用程序提供运行时,所依赖的资源。
  • Bean对象: IOC容器中创建、管理的对象。

(2)改写三层架构

  • 步骤一: Service层及Dao层实现类交给IOC容器管理。(类上添加注解@Component)
  • 步骤二: 为Controller及Service注入运行时,依赖的对象。(引用对象上添加注解@Autowired)
  • 步骤三: 运行测试。

(三) IOC

1、Bean对象的管理注解

注解 说明 位置
@Component 声明bean的基础注解 除以下几类注解位置的位置
@Controller 声明为控制层,@Component衍生注解 标注于控制器类
@Service 声明为服务层,@Component衍生注解 标注于业务实现类
@Repository 声明为数据访问层,@Component衍生注解 标注于数据访问实现类

注意:

  • 声明bean时,可通过value属性指定bean的名字,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但在Springboot集成开发中,声明控制器bean只能用@Controller。

2、Bean对象的组件扫描

(1)使用原因: Bean对象的四大注解并未生效。
(2)使用方法: 启动类上添加@ComponentScan注解,并添加扫描的具体包名集合。

@ComponentScan({xxx.dao,xxx.service....})
@SpringBootApplication
public class SpringbootWebRegRespApplicaiton{
	public static void main(String[] args){
		SpringApplication.run(SpringbootWebRegRespApplicaiton.class,args);
	}
}

注意: 启动类上 @SpringBootApplication 注解已经默认添加了注解扫描,其范围为启动类所在包

(四) DI

1、作用: 当IOC容器中的引用对象冲突(比如有多个实现同个接口的实现类,那么控制器调用接口时会发生错误),@Autowired就会发生异常,为明确引用对象,则通过明确的注解进行声明。

2、DI的解决方案文章来源地址https://www.toymoban.com/news/detail-491369.html

注解 说明
@Primary 强制注解注入
@Qualifier 注入指定名称的注解,需要配合@Autowired注解
@Resource 按照Bean名称进行注入

到了这里,关于JavaWeb学习路线(4)——请求响应与分层解耦的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Javaweb中的Request(请求)和Response(响应)

    目录 一、概念 二、请求(Request) 1.例子简介 2.Request继承体系 3.Request获取请求数据   (1)请求行 (2)请求头 (3)请求体  4.优化请求体参数的获取 5.解决请求参数乱码问题  6.请求转发  请求转发的特点 三、响应(Response) 1.Response继承体系 2.设置响应数据功能介绍 (

    2024年02月08日
    浏览(37)
  • [JavaWeb]【六】web后端开发-请求响应

    目录 一  引子 二 请求 2.1 Postman 2.1.1 安装 2.1.2 创建工作空间  2.1.3 添加接口 2.2 简单参数 2.2.1 原始方式(不推荐)  2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)  2.2.3 SpringBoot方式-POST(参数名与形参变量名相同) 2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同) 2.2.5 @Req

    2024年02月12日
    浏览(46)
  • 分层解耦、IOC和DI

    学习教程:【黑马程序员2023新版JavaWeb开发教程,实现javaweb企业开发全流程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p=161share_source=copy_webvd_source=2c07d62293f5003c919b2df9b2e0549e 在进行软件设计和软件开发时,需要让每个接口、类或方法的职责更加单

    2024年02月14日
    浏览(46)
  • JavaWeb学习路线(11)—— Maven延伸

    一、分模块设计 (一)概念: 将项目按功能拆分出若干个子模块。 (二)作用: 方便项目管理维护、扩展,也方便模块间相互调用,资源共享。 (三)具体实现 1、抽取公共包作成模块(以pojo实体类为例) 2、向使用的项目添加依赖 3、向使用类中引用 (四)注意事项 分

    2024年02月12日
    浏览(39)
  • Unity3D 服务器逻辑和传输如何分层/解耦详解

    Unity3D 是一款强大的游戏开发引擎,它提供了丰富的功能和工具,使得开发者可以轻松地创建高质量的游戏。在游戏开发过程中,服务器逻辑和传输是非常重要的组成部分。本文将详细介绍如何在Unity3D中实现服务器逻辑和传输的分层和解耦。 对啦!这里有个游戏开发交流小组

    2024年01月16日
    浏览(46)
  • 【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数

    目录 前言:认识Spring MVC 🌷1、什么是MVC? 一、建立连接(5个注解) 🌷1、@RequestMapping注解:注册接⼝的路由映射(默认返回页面) 🌷2、@ResponseBody注解:表示返回的是数据 🌷 3、组合注解@RestController = @ResponseBody + @Controller 🌷4、支持Get请求的2种写法@GetMapping + @RequestMapp

    2024年02月16日
    浏览(39)
  • Go学习第十四章——Gin请求与响应

    在Gin中,我们可以使用不同的方法设置请求的响应值,包括String、JSON、HTML和XML等。 1.1 String 使用String方法 返回字符串 类型的响应内容。 当我们访问http://localhost:8080/users时,就能够在浏览器上看到输出了\\\"Users\\\"。 补充:这里的http.StatusOK,是可以修改的,可以直接写200,因为

    2024年02月06日
    浏览(41)
  • 【Django学习】(十一)APIView_请求与响应_GenericAPIView

      继承DRF中APIView之后,那么当前视图就具备了认证、授权、限流等功能  继承DRF中APIView之后,每一个实例方法中的request为Request对象  Request类拓展了Django中的HttpRequest类,具备很多额外优秀的功能 Request类与HttpRequest类中的所有功能兼容 查询字符串参数: request.GET、request.q

    2024年02月13日
    浏览(44)
  • 命令模式-请求发送者与接收者解耦

     去小餐馆吃饭的时候,顾客直接跟厨师说想要吃什么菜,然后厨师再开始炒菜。去大点的餐馆吃饭时,我们是跟服务员说想吃什么菜,然后服务员把这信息传到厨房,厨师根据这些订单信息炒菜。为什么大餐馆不省去这个步骤,像小餐管那样点菜呢?原因主要有以下几点:

    2024年02月14日
    浏览(36)
  • 命令模式——请求发送者与接收者解耦

    在软件开发中,经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。此时,特别希望能够以一种松耦合的方式来设计软件,使得请求发送者与请求接收者能够消除彼此之间的耦合,让对象之间的调用

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包