请求映射
rest的使用与原理
- @xxxMapping;
- Rest风格支持(使用 HTTP 请求方式动词来表示对资源的操作)
-
- 以前: /getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
- 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
- 核心Filter;HiddenHttpMethodFilter
-
-
- 用法: 表单method=post,隐藏域 _method=put
- SpringBoot中手动开启
-
-
- 扩展:如何把_method 这个名字换成我们自己喜欢的。
基于表单提交的RESTful原理
- 表单提交会带上[_method = put]
- 请求过来会被HiddenHttpMethodFilter拦截
- 处理请求(如果请求正常,才会放行)
- 然后内部进行处理,判断是否有请求。然后将请求转换为大写
- (包装原生request)将原生的request转换成为HttpMethodRequestWrapper请求,然后HttpMethodRequestWrapper会重写HttpRequest的个体、Method 方法
在控制层请求发起的流程
在请求处理之前,需要先执行Filter。然后HiddenHttpMethodFilter将原生请求的getMethod重写了变成delete。 然后此时当进行请求的时候。getMethod已经变成了delete/put/,,,就与请求匹配了。
DispatcherServlet请求原理
- 他是处理所有请求的开始
- 他没有重写了doGet和doPost,在FrameworkServelt中调用了doGet和doPost。然后又调用了processRequest()。
- processRequest又调用类中的doService方法 。最终在DispacherSerlvet中做了doService的实现
- 在DispacherServlet中有一个doDisptch()就是请求转发。然后再doDisptch中才是一些真正有功能的我们需要的方法
- 所以说doDispach()才是每个请求都会调用的方法
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;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// 找到当前请求使用哪个Handler(Controller的方法)处理
mappedHandler = getHandler(processedRequest);
//HandlerMapping:处理器映射。/xxx->>xxxx
- 在doDispach()中有getHandler方法,他会找到我们此时调用需要找到的请求
- 在getHandler()方法中可以看到有个handerMappings 它会加载所有的请求(在应用启动的时候就会加载保存)
- 在HandlerMapping中保存的我们写的所有请求
- 在AbstractHandlerMethodMapping中有lookupHandlerMethod方法,在这个方法中我们才能匹配到所要找的请求