Spring MVC工作原理图
image.png
Controller and RestController
@Slf4j
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/index")
public String index(HttpServletRequest request, HttpServletResponse response) {
return ...;
}
}
@Slf4j
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/index")
public String index(HttpServletRequest request, HttpServletResponse response) {
return ...;
}
}
@ResponseBody
@Slf4j
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/index")
@ResponseBody
public String index(HttpServletRequest request, HttpServletResponse response) {
return ...;
}
}
@ResponseBody 等于 @RestController 效果
@RequestParam & @ModelAttribute
@Slf4j
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/index")
@ResponseBody
public String index(String name,String password,Model model) {
return ...;
}
/**
@RequestParam 在参数不一致时会报错
**/
@GetMapping("/index")
@ResponseBody
public String index2(@RequestParam String name,@RequestParam String password,Model model) {
return ...;
}
}
/**
@ModelAttribute注解放在处理方法的形参上时,
用于将多个请求参数封装到一个实体对象,
从而简化数据绑定流程,而且自动暴露为模型数据用于视图页面展示时使用
**/
@ApiOperation(value = "addSign", notes = "添加短信签名")
@PostMapping("/addSign")
public ScResult<Boolean> addSign(
@RequestHeader(Constants.PLATFORM_HEADER) String platformId, @ModelAttribute SmsSignDTO smsSignDTO) throws IOException {
//TODO 参数校验
return smsService.addSign(platformId, smsSignDTO);
}
@Data
public class SmsSignDTO implements Serializable {
@ApiModelProperty("短信签名")
public String signName;
@ApiModelProperty("材料文件")
public MultipartFile[] signFileList;
}
重定向
@GetMapping("/index")
@ResponseBody
public String index(String name,String password,Model model) {
return"redirect:/html/my.html";
}
重定向是由浏览器进行跳转的
转发
@GetMapping("/index")
@ResponseBody
public String index(String name,String password,Model model) {
return"forward:/html/my.html";
}
转发是由服务器进行跳转的
转发和重定向的区别是:1、请求次数不同;2、重定向时地址栏会发生变化,而转发时地址栏不会发生变化;3、重定向两次请求不共享数据,转发一次请求共享数据。
@ModelAttribute方法
@Slf4j
@Controller
@RequestMapping("/hello")
public class HelloController {
@ModelAttribute
public void isLogin(HttpSession session){
if(session.getAttribute("user")==null){
throw new Exception("没有权限");
}
}
@GetMapping("/index")
@ResponseBody
public String index(String name,String password,Model model) {
return ...;
}
}
被@ModelAttribute注解的方法,将在每次调用该控制器类的请求处理方法前被调用。
interceptor
public class AllInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("===========AllInterceptor preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("===========AllInterceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("===========AllInterceptor afterCompletion");
}
}
feign请求参数
@PostMapping("/api/gateway/v1/createPlatform")
@ResponseBody
Result<String> createPlatform(@RequestHeader(Constants.PLATFORM_HEADER) String header, @RequestBody AddPlatformRequst params);
@GetMapping("/api/gateway/v1/platformPage")
@ResponseBody
Result<Page<PlatformVo>> platformPage(@RequestHeader(Constants.PLATFORM_HEADER) String header,@SpringQueryMap QueryPlatformRequest params);
produces 和 consumes
@RequestMapping(value = "/produces", produces = "application/json"):表示将功能处理方法将生产json格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/json”时即可匹配;
@RequestMapping(value = "/produces", produces = "application/xml"):表示将功能处理方法将生产xml格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/xml”时即可匹配。
@RequestMapping(value = "/msgId", method = RequestMethod.POST, consumes="application/json") 服务器仅处理request Content-Type为“application/json”类型的请求