踩坑笔记(后端)
一、前端 往 后端传参的六种方式
1. 请求体在url中(2)
2. 请求体以单个参数 或 JSON对象的方式传送 (2)
3. 请求体以表单的形式传送:简单表单、复杂表单 (2)
一. 请求体在url中
1.1 url: "/yourUrl/"+yourData
==>
@RequestMapping("/yourUrl/{yourDataName}")
public String yourUrl(@PathVariable("yourDataName") String yourData) {
// @PathVariable("yourDataName")必不可少,因为他指定链接中某个位置代表着名为yourDataName的变量
}
1.2 url: "/yourUrl?yourDataName=" + yourData
==>
@RequestMapping("/yourUrl")
public String yourUrl(@RequestParam("yourDataName") String yourData) {
//@RequestParam("yourDataName")是必不可少的,因为他指定了链接中的参数名称
}
二、请求体以单个参数 或 JSON对象的方式传送
2.1 url: "/yourUrl",
data: {
"username": "admin",
"password": "admin"
}
==>
@RequestMapping("/yourUrl")
public String yourUrl(@RequestParam("username") String username,
@RequestParam("password") String password) {}
2.1 url: "/yourUrl",
data: JSON.stringify(conceptMap),
==>
@RequestMapping("/yourUrl")
public String yourUrl(@RequestBody()ConceptMap conceptMap) {}
三、请求体以表单的形式传送:简单表单、复杂表单
3.1 url: "/yourUrl",
data:formData.serialize() // 对表单数据进行序列化并传递到后台
==>
@RequestMapping("/yourUrl")
public String yourUrl(@RequestParam("user") String jsonObject){
User user= JSON.parseObject(jsonObject, User.class);
// 接收表单时 无法使用 @RequestBody
}
序列化 与 反序列化
对象 → 字节 → 对象
3.2 var formData = new FormData();
formData.append("upGeoIcon",$('#fileInput')[0].files[0]);
formData.appen("geoIcon",JSON.stringify(geoIcon));
...
url: "/yourUrl",
data:formData.serialize()
==>
@RequestMapping("/yourUrl")
public String yourUrl(@RequestParam("upGeoIcon") MultipartFile mfile,
@RequestParam("geoIcon") String jsonObject){
GeoIcon geoIcon = JSON.parseObject(jsonObject, GeoIcon.class);
// 接收表单时 无法使用 @RequestBody
}
二、前端 传 数组,后端List<Object> 接收
1、需要将数组先转成字符串,后端再将字符串解析成ModelParam类型的List<>列表
modelParams = [{...},{...}];
...
url: "/saveIntegratedTask",
data: JSON.stringify(modelParams),
==>
@RequestMapping(value = "/saveIntegratedTask")
JsonResult saveIntegratedTask(@RequestParam("modelParams") String modelParams){
List<ModelParam> params = JSON.parseArray(modelParams,ModelParam.class);
...
}
三、@RequestParam、@RequestBody 和 @PathVariable
-
@RequestBody ajax中声明contentType: “application/json; charset=utf-8”,也就是json数据;
注意:
-
前后参数必须一致;
高级的表达:将http的输入流装配到目标类时,会根据json的key来匹配目标类的属性 -
一般使用在post请求中;
- @RequestParam ajax没有声明contentType,即默认时,用这个。
- 注意:
- 可以使用在get、post请求中
- @PathVariable 参数放url中时
- @RequestMapping("/yourUrl/{yourDataName}")
对比:
- 一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
- RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数。
四、java 浅拷贝与深拷贝
@Data
public class Student implements Cloneable {
String subj;
String name;
@Override
public Object clone() {
Student stu =(Student)super.clone();
return stu;
}
}
...
Student stu1 = new Student({"chinese","ming"});
Student stu2 = (Student) stu1.clone(); //深拷贝
五、spring boot 配置静态文件
spring.mvc.static-path-pattern=/static/** //定义访问模式
resourcePath=D:/upload
spring.http.multipart.locations=${resourcePath}
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,
classpath:/static/, classpath:/public/, file:${spring.http.multipart.locations}
六、MongoDB 更新记录
save() 、 insert()、 find()、 delete()
- save() 方法更新一个已存在的文件或者插入一条数据,取决于主键id,否则save直接调用insert
- 如果实体没有 id 属性,mongodb会自动生成一个 _id 作为主键
@Data
public class ConceptMap{
String id; //主键
String geoId;
String name;
String description;
}