SpringMVC底层基于Servlet
1. 环境问题
tomcat和JDK版本不匹配时,会出现很多奇奇怪怪的bug,,所以,得使用匹配的JDK版本。Tomcat10以前用的javax,不是Jakarta
javax.servlet是jdk8以及以前的版本原生的api
2.RequestMapping注解不允许重复
Controller类中在方法上加上RequestMapping注解不允许重复。也可以在类上加上统一路径。
3.Controller类中的方法需要传参方法
Controller类中的方法需要传参时,通过访问地址栏加上?传参形式。RequestMapping有value和请求方法两个值。后面有使用到Restful风格来编写地址映射
4.springMVC接收客户端的请求的五种类型
1.普通参数
2.对象参数
3.嵌套对象参数
4.数组参数
5.集合普通参数
1. 普通参数:若地址栏传递的参数名称和Controller方法中的形参名称不一致,可以通过在方法参数前面加上RequestParam注解来绑定参数,还可以在后面设置是否必须传递该参数。
2. 在Controller类中的方法上若传递的参数为一个对象,则只需要在地址栏中传递的参数和对象中成员属性方法对上即可。若控制类中,有其它类的对象作为成员属性,则再传递参数时,用对象.成员属性的方式来传递。
4. 直接传递多个参数即可。参数名称与方法中形参参数名称相同即可。若使用List集合来接收,需要加上注解RequestParam
接收json数据:
以Map接收:参数和上面差不多,就是改为Map<String,Object> mapParam;
List不能接收键值对。
5.@RestController注解
在Controller类上加上RestController注解表示该类下所有方法返回json数据。
6.获取到HttpServletRequest
可以通过SpringMVC来获取到HttpServletRequest,它是自动缓存到ThreadLocal里面的。
@RequestMapping("/demo05")
@ResponseBody
public String demo05(@RequestBody UserEntity user){ //该注解@RequestBody挺好理解的。和RequestParam差不多一个意思
HttpServletRequest httpServletRequest = ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest();
System.out.println(httpServletRequest);
return user.toString();
}
7.restful风格
查询使用get请求,新增数据使用post请求,更新操作使用put请求,删除操作使用delete请求。
8.RequestMapping注解
第一个参数value为映射地址,第二个参数为请求方法,若不写第二个参数,则默认为所有都行。
@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
public void deleteUser(@PathVariable(name = "id") String id){
System.out.println("delete"+id);
}
这样可实现同一个路径通过不同的请求方式来实现不同的功能。
也可用GetMapping、DeleteMapping等特定的注解方式来映射路径。如:
9.接口统一返回规范
package com.lzx.controller;
import java.util.HashMap;
public class BaseController {
/**
* 提供处理请求响应成功的情况下
*
* @param data
* @return
*/
public HashMap<String, Object> setResultOk(Object data) {
return setResult(200, "ok", data);
}
public HashMap<String, Object> setResultSuccess(String msg) {
return setResult(200, msg, null);
}
/**
* 提供处理请求失败情况下
*
* @param msg
* @return
*/
public HashMap<String, Object> setResultError(String msg) {
return setResult(500, msg, null);
}
/**
* @param code code 200 处理成功 500 处理失败
* @param msg 响应错误内容
* @param data 响应的数据
* @return
*/
public HashMap<String, Object> setResult(Integer code, String msg, Object data) {
HashMap<String, Object> result = new HashMap<>();
result.put("code", code);
result.put("msg", msg);
result.put("data", data);
return result;
}
}
返回JSON数据格式,
{
"code":200,
"msg":"ok",
"data":{
}
}
在controller层里面添加一个方法专门用来格式化该响应结果。
10.SpringMVC全局捕获异常
package com.lzx.controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
/**
* @author 梁志雄
* @Goal Mercedes-Benz C260
* @date 2023/8/15 15:45
*/
@ControllerAdvice //加上该注解表示该类为全局捕获异常类
public class GlobalExceptionHandler extends BaseController {
@ResponseBody
@ExceptionHandler(value = Exception.class) //表示拦截所有异常
public HashMap<String,Object> handleException(Exception exception){
System.out.println("自定义异常"+exception.getMessage());
return setResultError("系统发生了错误");
}
}
11. 引入jquery的CDN
src="https://code.jquery.com/jquery-1.12.4.js"
integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU="
crossorigin="anonymous