手机网站建设行业分析,中国建设银行的网站,海报设计在线生成,书画网站 建站文章目录 [SpringBoot] 后端工程化1 需求2 开发流程3 RequestController 类#xff08;操作类#xff09;3.1 简单参数#xff08;形参名和请求参数名一致#xff09;3.2 简单参数#xff08;形参名和请求参数名不一致#xff09;3.3 复杂实体参数3.4 数组参数3.5 集合参… 文章目录 [SpringBoot] 后端工程化1 需求2 开发流程3 RequestController 类操作类3.1 简单参数形参名和请求参数名一致3.2 简单参数形参名和请求参数名不一致3.3 复杂实体参数3.4 数组参数3.5 集合参数3.6 时间参数3.7 json参数3.8 单个路径参数3.9 多个路径参数 4 RequestController 类查询类4.1 ResponseBody4.2 统一响应结果 5 分层解耦5.1 三层架构5.2 分层目录及代码5.2.1 数据访问层5.2.2 业务逻辑层5.2.3 控制层 5.3 分层解耦5.3.1 耦合问题5.3.2 解耦思路 5.4 IOC DI5.4.1 Bean的声明IOC5.4.2 组件扫描IOC5.4.3 DI [SpringBoot] 后端工程化
1 需求
需求基于SpringBoot的方式开发一个web应用浏览器发起请求“/hello”后给浏览器返回字符串 “Hello World ”。 2 开发流程
创建SpringBoot工程项目 第一步用 IDEA 基于Spring官方骨架创建SpringBoot工程。 第二步选择 SpringBoot 框架版本勾选web开发相关依赖。 定义RequestController类添加方法hello并添加注解 在主包名下创建 controller 包 pojo 包 package com.itheima.controller;
import org.springframework.web.bind.annotation.*;RestController
public class RequestController {RequestMapping(/hello)public String hello(){System.out.println(Hello World ~);return Hello World !;}
} 测试运行 运行 SprintBootWebObjectApplication 类 3 RequestController 类操作类
作用接收前端的表单数据
3.1 简单参数形参名和请求参数名一致
前端
- 请求方式GET
- URL: http://localhost:8080/simpleParam?namelisiage45后端
RestController
public class RequestController {// 第1个请求参数 nameTom 参数名:name参数值:Tom// 第2个请求参数 age10 参数名:age , 参数值:10//springboot方式RequestMapping(/simpleParam)public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致System.out.println(name : age);return OK; //返回数据}
}3.2 简单参数形参名和请求参数名不一致
前端
- 请求方式GET
- URL: http://localhost:8080/simpleParam?namelisiage45后端
RestController
public class RequestController {// 第1个请求参数 nameTom 参数名:name参数值:Tom// 第2个请求参数 age10 参数名:age , 参数值:10//springboot方式RequestMapping(/simpleParam)public String simpleParam(RequestParam(name name, required false) String username , Integer age ){// name:请求参数名required:参数是否必须System.out.println(username : age);return OK; //返回数据}
}3.3 复杂实体参数
前端
- 请求方式GET
- URL: http://localhost:8080/complexPojo?username李四age10address.province背景address.city上海后端
RestController
public class RequestController { //springboot方式RequestMapping(/complexPojo)public String complexPojo(User user) {System.out.println(user);return ok;}User{private String username;private int age;private Address address;Get 和 Set 方法;ToString 方法;}Address{private String province;private String city;Get 和 Set 方法;ToString 方法;}
}3.4 数组参数
前端
- 请求方式GET
- URL: http://localhost:8080/arrayParam?hobbystringhobbyjavahobbypython后端
RestController
public class RequestController {//springboot方式RequestMapping(/arrayParam)public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return ok,arrayParam;}
}3.5 集合参数
前端
- 请求方式GET
- URL: http://localhost:8080/listParam?hobbystringhobbyjavahobbypython后端
RestController
public class RequestController {//springboot方式RequestMapping(/listParam)public String listParam(RequestParam ListString hobby) {System.out.println(hobby);return ok,listParam;}
}3.6 时间参数
前端
- 请求方式GET
- URL: http://localhost:8080/dateParam?date2023-02-09 12:08:09后端
RestController
public class RequestController {//springboot方式RequestMapping(/dateParam)public String dateParam(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDateTime date) {System.out.println(date);return ok,dateParam;}
}3.7 json参数
前端
- 请求方式POST
- URL: http://localhost:8080/jsonParam
- 请求体
{username: lisi,age: 23,address: {province: beijing,city: 上海}
}后端
RestController
public class RequestController {// 第1个请求参数 nameTom 参数名:name参数值:Tom// 第2个请求参数 age10 参数名:age , 参数值:10//springboot方式RequestMapping(/jsonParam)public String jsonParam(RequestBody User user) {System.out.println(user);return ok,jsonParam;}
}3.8 单个路径参数
前端
- 请求方式GET
- URL: http://localhost:8080/path/1000后端
RestController
public class RequestController {//springboot方式RequestMapping(/path/{id})public String pathParam(PathVariable Integer id) {System.out.println(id);return ok,pathParam;}
}3.9 多个路径参数
前端
- 请求方式GET
- URL: http://localhost:8080/path/1000/Lisi后端
RestController
public class RequestController {//springboot方式RequestMapping(/path/{id}/{name})public String pathParam(PathVariable Integer id, PathVariable String name) {System.out.println(id);System.out.println(name);return ok,pathParam;}
}4 RequestController 类查询类
4.1 ResponseBody
由于 RestController Controller ResponseBody 所以不用重复添加。
4.2 统一响应结果
定义在一个实体类 Result 来包含以上信息。代码如下
public class Result {private Integer code;//响应码1 代表成功; 0 代表失败private String msg; //响应码 描述字符串private Object data; //返回的数据public Result() { }public Result(Integer code, String msg, Object data) {this.code code;this.msg msg;this.data data;}public Integer getCode() {return code;}public void setCode(Integer 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;}//增删改 成功响应(不需要给前端返回数据)public static Result success(){return new Result(1,success,null);}//查询 成功响应(把查询结果做为返回数据响应给前端)public static Result success(Object data){return new Result(1,success,data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
}5 分层解耦
5.1 三层架构
请求处理、响应数据Controller控制层。负责接收页面的请求给页面响应数据。逻辑处理Service业务逻辑层。负责业务逻辑处理的代码。数据访问Dao数据访问层(Data Access Object)也称为持久层。负责业务数据的维护操作包括增、删、改、查等操作。 5.2 分层目录及代码 5.2.1 数据访问层 负责数据的访问操作包含数据的增、删、改、查 数据访问接口
//数据访问层接口制定标准
public interface EmpDao {//获取员工列表数据public ListEmp listEmp();
}数据访问实现类
//数据访问实现类
public class EmpDaoA implements EmpDao {Overridepublic ListEmp listEmp() {//1. 加载并解析emp.xmlString file this.getClass().getClassLoader().getResource(emp.xml).getFile();System.out.println(file);ListEmp empList XmlParserUtils.parse(file, Emp.class);return empList;}
}5.2.2 业务逻辑层 处理具体的业务逻辑 业务接口
//业务逻辑接口制定业务标准
public interface EmpService {//获取员工列表public ListEmp listEmp();
}业务实现类
//业务逻辑实现类按照业务标准实现
public class EmpServiceA implements EmpService {//dao层对象private EmpDao empDao new EmpDaoA();Overridepublic ListEmp listEmp() {//1. 调用dao, 获取数据ListEmp empList empDao.listEmp();//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp - {//处理 gender 1: 男, 2: 女String gender emp.getGender();if(1.equals(gender)){emp.setGender(男);}else if(2.equals(gender)){emp.setGender(女);}//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job emp.getJob();if(1.equals(job)){emp.setJob(讲师);}else if(2.equals(job)){emp.setJob(班主任);}else if(3.equals(job)){emp.setJob(就业指导);}});return empList;}
}5.2.3 控制层
接收前端发送的请求对请求进行处理并响应数据
RestController
public class EmpController {//业务层对象private EmpService empService new EmpServiceA();RequestMapping(/listEmp)public Result list(){//1. 调用service层, 获取数据ListEmp empList empService.listEmp();//3. 响应数据return Result.success(empList);}
}5.3 分层解耦
5.3.1 耦合问题 内聚软件中各个功能模块内部的功能联系。 耦合衡量软件中各个层/模块之间的依赖、关联的程度。 软件设计原则高内聚低耦合。 高内聚一个模块中的代码各个代码块之间关系越紧密则内聚性越高。 低耦合软件中各个层、模块之间的依赖相互关联性越低则耦合度越低。 5.3.2 解耦思路 解决思路 提供一个容器容器中存储一些对象(例EmpService对象)controller程序从容器中获取EmpService类型的对象 解耦操作 控制反转[ Inversion Of Control ]简称IOC。对象的创建控制权由程序自身转移到外部容器这种思想称为控制反转。 对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为IOC容器或Spring容器 依赖注入[ Dependency Injection ]简称DI。容器为应用程序提供运行时所依赖的资源称之为依赖注入。 程序运行时需要某个资源此时容器就为其提供这个资源。 例EmpController程序运行时需要EmpService对象Spring容器就为其提供并注入EmpService对象
5.4 IOC DI
5.4.1 Bean的声明IOC
ICO 容器管理IOC控制反转就是将对象的控制权交给Spring的IOC容器由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。 把某个对象交给IOC容器管理需要在类上添加一个注解Component 注解说明位置Component声明bean的基础注解全部类通用注解除控制类ControllerComponent的衍生注解标注在控制器类上ServiceComponent的衍生注解标注在业务逻辑类上RepositoryComponent的衍生注解标注在数据访问类上由于与mybatis整合用的少 注 RestController Controller ResponseBody声明bean的时候可以通过value属性指定bean的名字如果没有指定默认为类名首字母小写。使用以上四个注解都可以声明bean但是在springboot集成web开发中声明控制器bean只能用Controller。 5.4.2 组件扫描IOC
Bean 想要生效还需要被组件扫描。
// 使用四大注解声明的 Bean要想生效还需要被组件扫描注解 ComponentScan 扫描
ComponentScan(dao, com.Jiacheng)
SpringBootApplication
public class SprintBootWebObjectApplication {public static void main(String[] args) {SpringApplication.run(SprintBootWebObjectApplication.class, args);}
}注不推荐组件扫描按照 SprintBoot 项目结构创建目录即可 5.4.3 DI
依赖注入IOC容器要为应用程序去提供运行时所依赖的资源而资源指的就是对象。
// 依赖注入Autowired注解按照类型进行自动装配。
Autowired
private EmpService empService;依赖冲突在 IOC 容器中存在多个相同类型的 Bean 对象程序运行会报错。
注解说明位置Autowired按照类型自动装配 Bean 对象类内Primary让当前类的 Bean 生效类上Qualifier(“serviceA”)指定注入的 Bean 对象搭配Autowired类内Resource(name “serviceB”)按照 Bean的名称进行注入类内
// 1.Autowired 注入
Autowired
private EmpService empService;// 2.Primary 注入
Primary
public class EmpServiceA implements EmpService {}// 3.Qualifier() 注入指定当前要注入的bean对象
Autowired
Qualifier(empServiceA)
private EmpService empService;// 4.Resource() 注入
Resource(name empServiceB)
private EmpService empService;面试题 Autowird 与 Resource的区别 Autowired 是spring框架提供的注解而Resource是JDK提供的注Autowired 默认是按照类型注入而Resource是按照名称注入
文章转载自: http://www.morning.rbtny.cn.gov.cn.rbtny.cn http://www.morning.nyqb.cn.gov.cn.nyqb.cn http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn http://www.morning.zlgr.cn.gov.cn.zlgr.cn http://www.morning.lhygbh.com.gov.cn.lhygbh.com http://www.morning.cknrs.cn.gov.cn.cknrs.cn http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn http://www.morning.gqflj.cn.gov.cn.gqflj.cn http://www.morning.bwttj.cn.gov.cn.bwttj.cn http://www.morning.bwrbm.cn.gov.cn.bwrbm.cn http://www.morning.qxlhj.cn.gov.cn.qxlhj.cn http://www.morning.jrksk.cn.gov.cn.jrksk.cn http://www.morning.kyytt.cn.gov.cn.kyytt.cn http://www.morning.mkfhx.cn.gov.cn.mkfhx.cn http://www.morning.jzmqk.cn.gov.cn.jzmqk.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn http://www.morning.xxrgt.cn.gov.cn.xxrgt.cn http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.jtqxs.cn.gov.cn.jtqxs.cn http://www.morning.svrud.cn.gov.cn.svrud.cn http://www.morning.wgxtz.cn.gov.cn.wgxtz.cn http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn http://www.morning.qwbht.cn.gov.cn.qwbht.cn http://www.morning.rzbgn.cn.gov.cn.rzbgn.cn http://www.morning.jgzmr.cn.gov.cn.jgzmr.cn http://www.morning.dhbyj.cn.gov.cn.dhbyj.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.tpnx.cn.gov.cn.tpnx.cn http://www.morning.sgpny.cn.gov.cn.sgpny.cn http://www.morning.dytqf.cn.gov.cn.dytqf.cn http://www.morning.lcjw.cn.gov.cn.lcjw.cn http://www.morning.wkcl.cn.gov.cn.wkcl.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.mtdfn.cn.gov.cn.mtdfn.cn http://www.morning.rdmz.cn.gov.cn.rdmz.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.rkjz.cn.gov.cn.rkjz.cn http://www.morning.xysxj.com.gov.cn.xysxj.com http://www.morning.bqrd.cn.gov.cn.bqrd.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.kcdts.cn.gov.cn.kcdts.cn http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn http://www.morning.hfyll.cn.gov.cn.hfyll.cn http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn http://www.morning.wmglg.cn.gov.cn.wmglg.cn http://www.morning.ctwwq.cn.gov.cn.ctwwq.cn http://www.morning.skql.cn.gov.cn.skql.cn http://www.morning.clkjn.cn.gov.cn.clkjn.cn http://www.morning.zqwqy.cn.gov.cn.zqwqy.cn http://www.morning.myxps.cn.gov.cn.myxps.cn http://www.morning.rksg.cn.gov.cn.rksg.cn http://www.morning.xbxks.cn.gov.cn.xbxks.cn http://www.morning.xlbyx.cn.gov.cn.xlbyx.cn http://www.morning.smj78.cn.gov.cn.smj78.cn http://www.morning.nhpmn.cn.gov.cn.nhpmn.cn http://www.morning.bzwxr.cn.gov.cn.bzwxr.cn http://www.morning.lzqtn.cn.gov.cn.lzqtn.cn http://www.morning.nwtmy.cn.gov.cn.nwtmy.cn http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn http://www.morning.ywqw.cn.gov.cn.ywqw.cn http://www.morning.jcwhk.cn.gov.cn.jcwhk.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn http://www.morning.zcsch.cn.gov.cn.zcsch.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.tthmg.cn.gov.cn.tthmg.cn http://www.morning.pcshb.cn.gov.cn.pcshb.cn http://www.morning.bpmmq.cn.gov.cn.bpmmq.cn http://www.morning.rdzgm.cn.gov.cn.rdzgm.cn http://www.morning.wkknm.cn.gov.cn.wkknm.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn http://www.morning.ychoise.com.gov.cn.ychoise.com http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.mhnxs.cn.gov.cn.mhnxs.cn