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表示是必须的,如果是可选的可以设置为false,defaultValue设置默认值
@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是按照名称注入