3 请求参数处理
3.1 请求映射
- @xxxMapping
- Rest风格支持(使用HTTP请求方式动词来表示对资源的操作
- 以前:
/getUser
获取用户、/deleteUser
删除用户、/editUser
修改用户 - 现在:
/user
GET-获取用户、DELETE-删除用户、PUT-修改用户、POST-保存用户 - 核心Filter;HiddenHttpMethodFilter
- 用法:表单method=post,隐藏域_method=put
- 以前:
package com.study.boot05web01.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String getUser(){
return "GET-张三";
}
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String saveUser(){
return "POST-张三";
}
@RequestMapping(value = "/user", method = RequestMethod.PUT)
public String putUser(){
return "PUT-张三";
}
@RequestMapping(value = "/user", method = RequestMethod.DELETE)
public String deleteUser(){
return "DELETE-张三";
}
}
3.2 请求映射原理
所有请求都会经过DispatcherServlet:
SpringMVC功能分析都从org.springframework.web.servlet.DispatcherServlet
的doDispatch
方法开始
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
//找到哪个handler进行处理
mappedHandler = this.getHandler(processedRequest);
//handlerMappings:处理器映射。 /xxx ->>> xxxxx
}
}
}
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
RequestMappingHandlerMapping
:保存了所有@RequestMapping
和handler
的映射规则。
所有的请求映射都在HandlerMapping中
- Springboot自动配置欢迎页的HandlerMapping。访问
/
能访问到index.html - 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息
- 如果有就找到这个请求对应的handler
- 如果没有就是下一个HandlerMapping
- 我们需要一些自定义的映射原理,我们也可以自己给容器中放HandlerMapping