设计思想
IOC
- 解释:Inversion of Control 控制反转
- 含义:将设计好的对象交给容器控制。
- 好处:
- 解耦:因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
- 可维护性和灵活性
- 使得组件可以依赖于接口,而不是依赖于实现。
理解
解释:Dependency Injection,依赖注入
- 含义:由IOC容器动态的将某个组件依赖的对象注入到组件之中
理解
Bean是什么:类的代理或代言人
Bean管理
(注解分为两类,注册Bean和使用Bean)
- 注册Bean:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解(如@Component , @Repository , @ Controller , @Service , @Configration)。这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。
- 使用Bean:把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;
注解
- @Controller
- 作用:
- 在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面,若返回json等内容到页面,则需要加@ResponseBody注解。
- 标注控制层组件
- 作用:
- @Autowired
- 作用:@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配。
- @Data
- 作用:
- @ToString、 @EqualsAndHashCode、所有属性的@Getter、所有non-final属性的@Setter和@RequiredArgsConstructor的组合,即会生成这些函数。
- 通常情况下,我们在entity使用这个注解就足够了。
- 作用:
- @RestController
- 作用:相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,因为视图解析器无法解析jsp,html页面。
- @RequestMapping
- 作用:为控制器指定可以处理哪些URL 请求
- 参数:
- value:请求URL
- method:请求方法(默认支持get:查和post:增删改)
- params:请求参数
- consumes、
- produces:表示返回数据格式
- headers:请求头
- 示例
- @RequestMapping(“/sys”)
- @RequestMapping(value=”/testParamsAndHeaders”, params={“username”, “age!=20”})
- @RequestMapping(value= “/login”, method=RequestMethod.GET, consumes=”application/json”, produces=”application/json”,params=”myParam=myValue”, headers=”Referer=http://www.ifeng.com/“)
- @GetMapping
- 作用:@RequestMapping和method=RequestMethod.GET的组合注解
- @RequestBody
- 作用:接收post请求传来的json参数(因为get请求传不了json)
- ps:
- 在传json字符串给后端时,如果某个参数没有value的话,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或””都行。千万不能有类似”stature”:,这样的写法。
- @RequestBody和@RequestParam可以同时使用,前者会接收请求体中的Json对象,后者会接收通过url返回的表单格式的key-value数据。
- 实例: ```java //通过一个对象接收 @PostMapping(“test”) public String test(@RequestBody User user){ }
//通过一个字符串接收 @PostMapping(“test”) public String test(@RequestBody String str){ }
8. @ResponsonBody
- 作用: 将Controller需要返回的Java对象转换为Json对象返回
- 示例:
```java
@GetMapping("/sys")
@ResponseBody
public Result<?> helloWorld() {
return"Hello World";
}
@PathVariable
- 作用:获取url中的动态参数
- 示例:
@GetMapping(value="/{id}/queryNum")
public String test(@PathVariable("id") int id){
System.out.println(id);
}
@RequestParam
- 作用:接收前端通过url返回的普通参数,并对这些普通参数有所限制。
- ps:
- 接收前端通过url返回的普通参数时,该注解可写不可写,只写注解而不更改其默认参数,会导致一些限制,比如必传。接收json参数时不可写。
- @RequestBody和@RequestParam可以同时使用,前者会接收请求体中的Json对象,后者会接收通过url返回的表单格式的key-value数据。
- 参数:
- required
- @RequestParam(required=false)
- 默认为true,表示必传(如果不传报400);若为false,可传可不传
- defaultValue
- @RequestParam(defaultValue=”0”)
- 给传过来的参数设置默认值,若前端没有传该参数或值为空,会默认赋值为0(一会儿试试字符串)
- value
- @RequestParam(value=”id”)
- 接收url的参数名,相当于key值
- required
- 示例:
@GetMapping("/sys")
public String targetAdd(@RequestParam(value = "id",required = false) int indexId,
@RequestParam("arrays") List<String> arrays){}
@Mapper
- 作用:标注Mybatis负责的组件(用于告诉spring框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。)
- @Repository
- 作用:标注数据访问组件
- @Service
- 作用:标注业务层组件
- @Component
- 作用:泛指组件,当组件不好归类时,我们使用这个注释进行标注。(反正就是个注入Bean)
- @CrossOrigin
- 作用:使后端可以与来自不同域的请求进行交互
- 使用
- springMVC的版本要在4.2或以上版本
- 放在@Controller注解的上方
- 在@RequestMapping注解中指定Get、Post方式
前后端交互实例
- 分类
- Content-Type:application/json
- post
- 要点
- 直接传json只能使用post
- 后端使用@RequestBody注解绑定json到实体类
- 代码 ```javascript //前端 let p = { “a”:1, “b”:2 }
- 要点
- post
- Content-Type:application/json
this.$axios.post(‘/eloise/indexChoice’,p).then(res=>{ console.log(res.data); })
```java
//后端
//没有对应的实体类时使用map
@PostMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(@RequestBody Map map){
System.out.println(map.get("a"));
System.out.println(map.get("b"));
return base.getIndexChoice();
}
//有对应的实体类时使用该类
//前端:(注意必须一一对应)
// let p = {
// "indexChoiceId":1,
// "indexChoiceName":"anna",
// "picturePlace":"罗马"
// }
@PostMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(@RequestBody IndexChoice i){
System.out.println(i.getIndexChoiceId());
//前端如果不传该实体类中的某个属性,其值会为null;
System.out.println(i.getPicturePlace());//null
return base.getIndexChoice();
}
- 放在data里传:注意一定要用实体去接收 ```java //前端 let p = { “indexChoiceId”:1 }
console.log(p); this.$axios({ url: ‘/eloise/indexChoice’, method: ‘POST’, data:p }).then(res=>{ console.log(res.data); })
```java
//后端
@PostMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(@RequestBody IndexChoice i){
System.out.println(i);
return base.getIndexChoice();
}
- 通过params之缩写版
- 要点
- 简写只能用get,扩写都可以
- 前端要设置params属性
- 该数据是加在请求url上的:http://localhost:8080/eloise/indexChoice?a=1
- 代码
- 简写 ```javascript //前端-缩写版 let p = { params:{ “a”:1 //前后端的名字一定要保持一致 } } this.$axios.get(‘/eloise/indexChoice’,p).then(res=>{ console.log(res.data); })
- 要点
//前端-扩写版 let p = { “indexChoiceId”:1 } this.$axios({ url:’/eloise/indexChoice’, method:”POST”, params:p }).then(res=>{ console.log(res.data); })
```java
//后端
//枚举参数
@GetMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(int a){
//如果是数组:String[] keywords
System.out.println(a);
return base.getIndexChoice();
}
//封装为实体
//前端:(注意必须一一对应)
// let p = {
// params:{
// "indexChoiceId":1,
// "indexChoiceName":"anna",
// "picturePlace":"罗马"
// }
// }
@GetMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(IndexChoice i){
System.out.println(i);
System.out.println(i.getPicturePlace());
return base.getIndexChoice();
}
- 通过params之扩写版
- 。。。。
- Content-Type: multipart/form-data;
- 应用
- 传输文件
- 要点
- form-data只能使用post
- 后端不需要额外加标注 ```java //前端-缩写版 let p = new FormData(); p.append(‘a’,1);
- 应用
this.$axios.post(‘/eloise/indexChoice’,p).then(res=>{ console.log(res.data); })
//前端扩写版 let p = new FormData(); p.append(‘a’, 1); this.$axios({ url: ‘/eloise/indexChoice’, method: ‘POST’, headers: { ‘Content-Type’: ‘multipart/form-data’ //这一行可有可无 }, data: p })
```java
//后端
@PostMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(int a){
System.out.println(a);
return base.getIndexChoice();
}
- Content-Type:application/x-www-form-urlencoded;
- 应用
- 传输键值对
- 后端怎么接收这个键值对??
- 还有一种方法是什么??
- 要点
- 只能使用post ```java //前端 let p = new URLSearchParams(); p.append(‘a’, 1);
- 应用
this.$axios({ url: ‘/eloise/indexChoice’, method: ‘post’, headers: { //可有可无的一项 ‘Content-Type’: ‘application/x-www-form-urlencoded’ }, data: p })
```java
//后端
@PostMapping("/indexChoice")
public List<IndexChoice> getIndexChoice(int a){
System.out.println(a);
return base.getIndexChoice();
}
- put和delete
- SpringBoot 2.2.X默认不支持put,delete等请求方式
Mybatis专题
标签
- mapper标签
- 作用:基础标签
- 属性
- namespace:与该xml文件映射的接口文件路径
resultMap标签
- 作用:如果要接收一个list,且数据库列名和entity中的属性名不对应,需要用resultMap将两者对应起来
- 属性
- id:该resultMap的标识
- type:该resultMap对应的entity路径
- 子标签
- id:主键映射
- result:非主键映射
- 子标签的属性
- property:程序中的实体属性名
- column:数据库对应的列名
- 示例
<mapper namespace="com.zyh.eloisesecret.mapper.BaseMapper">
<resultMap id="IndexChoiceMap" type="com.zyh.eloisesecret.entity.IndexChoice">
<id property="indexChoiceId" column="index_choice_id"/>
<result property="indexChoiceName" column="index_choice_name"/>
<result property="picturePlace" column="picture_place"/>
</resultMap>
<select id="getIndexChoice" resultMap="IndexChoiceMap">
select * from indexchoice
</select>
</mapper>
resultType标签
- 。
- 。
- 。
- 。
- 。
- 。
- 。。
- 。
- 。
- 。