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

news/2024/11/26 2:45:07/

一、概述
在这里插入图片描述

二、请求

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

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

1、获取方式

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

** 1、服务端代码**

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

** 2、请求端**

在这里插入图片描述

(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、请求端

在这里插入图片描述
(三)实体参数: 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;@Overridepublic 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、请求端**
在这里插入图片描述

注意事项:
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、请求端**
在这里插入图片描述
在这里插入图片描述

(五)日期参数传递

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、请求端
在这里插入图片描述

(六)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;@Overridepublic 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;@Overridepublic 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、请求端

在这里插入图片描述

(七)路径参数传递

1、服务器端代码

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

2、请求端

在这里插入图片描述

三、响应

(一)概念: 全名为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;}@Overridepublic 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、请求端接收数据
在这里插入图片描述

四、分层解耦

(一)三层架构

在这里插入图片描述

  • 第一层: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的解决方案

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

http://www.ppmy.cn/news/421948.html

相关文章

基于Elasticsearch与Hbase组合框架的大数据搜索引擎

本项目为学校大数据工程实训项目&#xff0c;共开发4周&#xff0c;答辩成绩不错。代码仓库放文章尾&#xff0c;写的不好&#xff0c;代码仅供参考。 搜索 对于结构化数据&#xff0c;因为它们具有特定的结构&#xff0c;所以我们一般都是可以通过关系型数据库&#xff08;M…

对称加密DES加密算法原理、用户登录应用案例分享

更多知识 学习&#xff1a;https://www.processon.com/view/60504b5ff346fb348a93b4fa#map 目录&#xff1a; DES算法的工作原理DES算法的优点DES算法的缺点DES算法的应用场景DES算法性能分析用户登录实例总结 1. DES算法的工作原理 DES算法是一种对称加密算法&#xff0c;使…

php 进阶 - 反射的讲解

(1)反射有什么用:分析类,属性,方法等,帮助我们构建复杂可扩展的应用. php内置提供了一些类和函数让我们实现这些功能 如:判断某个类是否存在一个方法,动态执行一个方法等等 (2)具体用到哪些类或函数方法 具体查看php文档的介绍http://www.php.net/manual/zh/reflectionclas…

自媒体运营思路

通过冷门需求进行覆盖&#xff0c;然后整合宣发&#xff0c;最后进行链接或者其他方式进行倒流&#xff0c;从而获取流量

图像分割 vs Adobephotoshop(PS)

图像分割听起来是很难理解其和PS有什么关系呢&#xff1f;我们所熟知的PS是用来P图、抠图。图像分割可以理解为抠图&#xff0c;基于视觉AI的手段&#xff0c;实现一键式批量抠图。完全替代了重复性高的工作。 图像分割技术可以实现秒级全自动主体、场景像素级识别&#xff0c…

AdobePhotoshop2022闪退

先打开C盘&#xff0c;取消隐藏文件&#xff01;具体步骤是 在C盘打开窗口&#xff0c;如图&#xff0c;点击三个点那里&#xff0c;然后点击选项&#xff0c; 然后点击确定 下面根据这路径C:\Users\87126【这个是用户名&#xff0c;每个电脑不一样】\AppData\Roaming\Adobe\A…

一文详解Adobe Photoshop 2020安装教程

摘要&#xff1a;微信搜索【三桥君】 说明&#xff1a;三桥君要讲解的是关于Adobe Photoshop 2020安装教程。 一、资源下载 不清楚怎么下载的&#xff0c;可以到公众号【三桥君】回复【PS】免费下载安装包。 二、安装教程 1.鼠标右击【Set-up】选择【以管理员身份运行】 2…

Photoshop序列号

Adobe Photoshop CS5&#xff1a; 1330-1409-7892-5799-0412-7680 1330-1616-1993-8375-9492-6951查看原文&#xff1a;http://surenpi.com/2015/04/15/photoshop%e5%ba%8f%e5%88%97%e5%8f%b7/ 转载于:https://my.oschina.net/surenpi/blog/891695