当前位置:   article > 正文

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

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

目录

一、请求响应学习

 1、请求

简单参数

实体参数

数组集合参数

日期参数

Json参数

路径参数

总结

2、响应

@ResponseBody&统一响应结果

二、分层解耦

1、三层架构

三层架构含义

架构划分

2、分层解耦

引入概念

容器认识

3、IOC&DI入门

4、IOC详解

5、DI详解


一、请求响应学习

 1、请求

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

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

简单参数

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

下面是示例代码:

  1. @RestController
  2. public class RequestController {
  3. //原始方式
  4. @RequestMapping("/simpleParam")
  5. public String simpleParam(HttpServletRequest request){
  6. //获取请求参数
  7. String name=request.getParameter("name");
  8. String ageStr=request.getParameter("age");
  9. int age=Integer.parseInt(ageStr);
  10. System.out.println(name+":"+age);
  11. return "OK";
  12. }
  13. //SpringBoot方式
  14. @RequestMapping("/simpleParam")
  15. public String simpleParam(String name,Integer age){
  16. System.out.println(name+":"+age);
  17. return "OK";
  18. }
  19. //SpringBoot方式
  20. @RequestMapping("/simpleParam")
  21. public String simpleParam(@RequestParam(name="name") String username, Integer age){
  22. System.out.println(username+":"+age);
  23. return "OK";
  24. }
  25. }

实体参数

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

代码示例:

  1. @RestController
  2. public class RequestController {
  3. //实体参数
  4. @RequestMapping("/simpleProa")
  5. public String simpleProa(User user){
  6. System.out.println(user);
  7. return "OK";
  8. }
  9. }
  10. public class User {
  11. private String name;
  12. private Integer age;
  13. private Address address;
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public Integer getAge() {
  21. return age;
  22. }
  23. public void setAge(Integer age) {
  24. this.age = age;
  25. }
  26. public Address getAddress() {
  27. return address;
  28. }
  29. public void setAddress(Address address) {
  30. this.address = address;
  31. }
  32. @Override
  33. public String toString() {
  34. return "User{" +
  35. "name='" + name + '\'' +
  36. ", age=" + age +
  37. ", address=" + address +
  38. '}';
  39. }
  40. }
  41. public class Address {
  42. private String province;
  43. private String city;
  44. public String getProvince() {
  45. return province;
  46. }
  47. public void setProvince(String province) {
  48. this.province = province;
  49. }
  50. public String getCity() {
  51. return city;
  52. }
  53. public void setCity(String city) {
  54. this.city = city;
  55. }
  56. @Override
  57. public String toString() {
  58. return "Address{" +
  59. "province='" + province + '\'' +
  60. ", city='" + city + '\'' +
  61. '}';
  62. }
  63. }

数组集合参数

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

代码示例:

  1. @RestController
  2. public class RequestController {
  3. //数组集合参数
  4. @RequestMapping("/arrayParams")
  5. public String arrayParams(String[] hobby) {
  6. System.out.println(Arrays.toString(hobby));
  7. return "OK";
  8. }
  9. //数组集合参数
  10. @RequestMapping("/listParams")
  11. public String listParams(@RequestParam List<String> hobby){
  12. System.out.println(hobby);
  13. return "OK";
  14. }
  15. }

日期参数

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

代码示例:

  1. @RestController
  2. public class RequestController {
  3. //日期时间参数
  4. @RequestMapping("/datePramaw")
  5. public String datePramaw(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime ut){
  6. System.out.println(ut);
  7. return "OK";
  8. }
  9. }

Json参数

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

代码示例:

  1. @RestController
  2. public class RequestController {
  3. //json参数
  4. @RequestMapping("/jsonParam")
  5. public String jsonParam(@RequestBody User user){
  6. System.out.println(user);
  7. return "OK";
  8. }
  9. }
  10. package org.start.pro;
  11. public class User {
  12. private String name;
  13. private Integer age;
  14. private Address address;
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public Integer getAge() {
  22. return age;
  23. }
  24. public void setAge(Integer age) {
  25. this.age = age;
  26. }
  27. public Address getAddress() {
  28. return address;
  29. }
  30. public void setAddress(Address address) {
  31. this.address = address;
  32. }
  33. @Override
  34. public String toString() {
  35. return "User{" +
  36. "name='" + name + '\'' +
  37. ", age=" + age +
  38. ", address=" + address +
  39. '}';
  40. }
  41. }
  42. package org.start.pro;
  43. public class Address {
  44. private String province;
  45. private String city;
  46. public String getProvince() {
  47. return province;
  48. }
  49. public void setProvince(String province) {
  50. this.province = province;
  51. }
  52. public String getCity() {
  53. return city;
  54. }
  55. public void setCity(String city) {
  56. this.city = city;
  57. }
  58. @Override
  59. public String toString() {
  60. return "Address{" +
  61. "province='" + province + '\'' +
  62. ", city='" + city + '\'' +
  63. '}';
  64. }
  65. }

路径参数

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

代码示例:

  1. @RestController
  2. public class RequestController {
  3. //路径参数
  4. @RequestMapping("/path/{id}")
  5. public String pathParam(@PathVariable Integer id){
  6. System.out.println(id);
  7. return "OK";
  8. }
  9. @RequestMapping("/path/{id}/{name}")
  10. public String pathParamq(@PathVariable Integer id,@PathVariable String name){
  11. System.out.println(id+":"+name);
  12. return "OK";
  13. }
  14. }

总结

2、响应

@ResponseBody&统一响应结果

        学习响应数据的设置。

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

代码示例:

  1. package org.start.controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import org.start.pro.Address;
  5. import org.start.pro.Result;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. @RestController
  9. public class ResponseController {
  10. // @RequestMapping("/hello")
  11. // public String hello(){
  12. // System.out.println("Hello World!");
  13. // return "Hello World~";
  14. // }
  15. //
  16. // @RequestMapping("/getAddr")
  17. // public Address getAddr(){
  18. // Address addr=new Address();
  19. // addr.setProvince("广东");
  20. // addr.setCity("深圳");
  21. // return addr;
  22. // }
  23. //
  24. // @RequestMapping("/listAddr")
  25. // public List<Address> listAddr(){
  26. // List<Address> list=new ArrayList<>();
  27. // Address addr=new Address();
  28. // addr.setProvince("广东");
  29. // addr.setCity("深圳");
  30. //
  31. // list.add(addr);
  32. // return list;
  33. // }
  34. @RequestMapping("/hello")
  35. public Result hello(){
  36. System.out.println("Hello World!");
  37. //return new Result(1,"success","Hello World~");
  38. return Result.success("Hello World~");
  39. }
  40. @RequestMapping("/getAddr")
  41. public Result getAddr(){
  42. Address addr=new Address();
  43. addr.setProvince("广东");
  44. addr.setCity("深圳");
  45. return Result.success(addr);
  46. }
  47. @RequestMapping("/listAddr")
  48. public Result listAddr(){
  49. List<Address> list=new ArrayList<>();
  50. Address addr=new Address();
  51. addr.setProvince("广东");
  52. addr.setCity("深圳");
  53. list.add(addr);
  54. return Result.success(list);
  55. }
  56. }

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

二、分层解耦

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/909337
推荐阅读
相关标签
  

闽ICP备14008679号