springboot请求响应

springboot请求响应

1.什么是请求?响应?

请求:获取请求数据

响应:设置响应数据

2.原始方法获取请求数据

Controller方法形参中声明HttpServletRequest对象
调用对象的getParameter(参数名)

这种方式复杂繁琐

 //    @RequestMapping("/simpleParam")
// 原始方式
//创建请求对象
// public String simpleParam(HttpServletRequest httpServletRequest){
//获取请求参数
//
// String name = httpServletRequest.getParameter("name");
// String ageStr = httpServletRequest.getParameter("age");
// int age=Integer.parseInt(ageStr);
// System.out.println(name+":"+age);
// return "ok";
// }

3.SpringBoot方法获取请求数据

3.1简单参数的获取

请求参数名与方法形参变量名相同SpringBoot能自动映射封装
封装的时候还会自动进行类型转换



//   方法形参和请求参数保持一致可以正常获取数据值
// @RequestMapping("/simpleParam")
// public String simpleParam(String name,int age){
// System.out.println(name+":"+age);//tom/41
// return "ok";
// }

3.2参数一致时简单参数的获取

方法形参名称与请求参数名称不匹配,通过该注解完成映射
该注解的required属性默认是true,代表请求参数必须传递

//       springboot提供了@RquestParam注解完成映射,required默认值为true表示是必须的,如果是可选的可以设置为falsedefaultValue设置默认值
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(value = "name",required = false,defaultValue = "cs") String username,int age){
System.out.println(username+":"+age);//Tom,41
return "ok";
}

当参数不一致时无法获取参数

//    当参数不一致时无法获取值
// @RequestMapping("/simpleParam")
// public String simpleParam(String username,int age){
// System.out.println(username+":"+age);//null,41
// return "ok";
// }
s
 
 

3.3简单实体

请求参数名与形参对象属性名相同,即可直接通过POJO接收

   简单参数作为数据传递方式时,前端传多少请求,接收就要写多少个形参,比较繁琐,可以将数据封装到一个实体对象中,完成传输
// 要求:请求参数名字和实体类属性一致,权限修饰符的原因可能需要导包
@RequestMapping("/simplePojo")
public String simpleParam(User user){
System.out.println(user);//User{name='Tom', age=41}
return "ok";
}

参数不一致的情况

//参数不一致的情况
@RequestMapping("/complexPojo")
public String simpeParam(User user){
System.out.println(user);//User{name='null', age=41}
return "ok";
}

3.4数组参数

数组:请求参数名与形参中数组变量名相同,可以直接使用数组封装

 接收一个参数名多个值时,可以定义数组接收参数
// @RequestMapping("/arrayParam")
// public String arrayParam(String[] hobby){
// System.out.println(Arrays.toString(hobby));//[basketball, football]
// return "ok";
// }

3.5集合参数

集合:请求参数名与形参中集合变量名相同,通过@RequestParam绑定参数关系

 

 @RequestMapping("/listParam")
// public String listParam(@RequestParam List<String> hobby){
// System.out.println(hobby);//[basketball, football]
// return "ok";
// }

3.5日期参数

要用@DateTimeFormat来定义格式化形式

  @RequestMapping("/dateParam")
// public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date){
// System.out.println(date);
// return "ok";
// }

3.6json

要接收json数据请求,必须要是post请求,并以josn的格式发送

1、Json的key要和POJO实体类的属性名相同。
2、@ResponseBody:写在形参中,表示将请求体中的json数据转换成java对象

   @RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println("user = " + user);
return "ok";

}

3.7路径

路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用 @PathVariable 获取路径参数

@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println("id = " + id);
return "ok";

}

 4.如何统一响应结果

定义Result实体类

/**
* 统一响应结果封装类
*/
public class Result {
private Integer code;
private String message;
private Object data;

public Result() {
}

//适用于增删改
public Result(Integer code, String message) {
this.code = code;
this.message = message;
}

//适用于查询
public Result(Integer code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public static Result success(){
Result result = new Result();
result.code=1;
result.message="success";
return result;
}
public static Result success( Object data){
Result result = new Result();
result.code=1;
result.message="success";
result.data=data;
return result;
}
public static Result error(){
Result result = new Result();
result.code=0;
result.message="failure";
return result;
}
public static Result error(String msg){
Result result=new Result();
result.code=0;
result.message=msg;
return result;
}

@Override
public String toString() {
return "Result{" +
"code=" + code +
", message='" + message + '\'' +
", data=" + data +
'}';
}

public Integer getCode() {
return code;
}

public void setCode(Integer code) {
this.code = code;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}
}

在Controller层方法中统一返回Result对象

@RequestMapping("/listEmp")
public Result listEmp() {


return Result.success(empService.listEmp());

}

 

5.三层架构

  • dao层(数据访问)

数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数

 

 

 @Repository
public class EmpDaoImpl implements EmpDao {


@Override
public List<Emp> listEmp() {
List<Emp> empList = XmlParserUtils.parse("emp.xml", Emp.class);

return empList;
}
}

  • service层(逻辑处理)

Service:业务逻辑层,处理具体的业务逻

 

 

 @Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpDao empDao;

@Override
public List<Emp> listEmp() {
EmpDao empDao = new EmpDaoImpl();
List<Emp> empList = empDao.listEmp();
empList.forEach(emp -> {
String gender = emp.getGender();
if ("1".equalsIgnoreCase(gender)){
emp.setGender("");
}else if ("2".equalsIgnoreCase(gender)){
emp.setGender("");
}
String job = emp.getJob();
if ("1".equalsIgnoreCase(job)){
emp.setJob("讲师");
}else if ("2".equalsIgnoreCase(job)){
emp.setJob("班主任");
}else if ("3".equalsIgnoreCase(job)){
emp.setJob("就业指导");
}
});
return empList;

}
}

  • controller(请求响应)

Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据

 

//处理员工请求
@RestController
public class EmpController {
@Autowired
private EmpService empService ;
@RequestMapping("/listEmp")
public Result listEmp() {


return Result.success(empService.listEmp());

}
}

6.分层解耦

6.1什么是内聚 耦合

内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚低耦合。

6.3控制反转和依赖注入

控制反转:将对象的创建控制权由程序自身转移给Spring,这种思想称为控制反转。
依赖注入: 由spring容器提供并注入对象数据
Bean对象:IOC容器中创建、管理的对象,称之为bean。
实现控制反转

第1步:删除Controller层、Service层中new对象的代码

 

 第2步:Service层及Dao层的实现类,交给IOC容器管理

使用Spring提供的注解:@Component ,就可以实现类交给IOC容器管理

第3步:为Controller及Service注入运行时依赖的对象

使用Spring提供的注解:@Autowired ,就可以实现程序运行时IOC容器自动注入需要的依赖对象

三个component衍生注解

@Controller 标注在控制器类上

 

@Service标注在业务类上

@Repository标注在数据访问类上(由于与mybatis整合,用的少)

@Component不属于以上三类时,用此注解

因为@RestController=@Controller+@ResponseBody 所以使用@RestController就行

其中声明控制器bean只能用@Controller和@RestController。

6.4组件扫描

使用四大注解声明的bean,要想生效,还需要被组件扫描注解@ComponentScan扫描

@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中,默认扫描的范围是SpringBoot启动类所在包及其子包

6.5当存在多个相同类型bean注入时的解决方案

1.@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

2.@Qualifier注解不能单独使用,必须配合@Autowired使用

3.使用@Resource注解

 

@Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解

  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入



posted on 2023-04-03 22:01  zl子路  阅读(159)  评论(0)    收藏  举报