原理
在做其他自动配置时回导入 EnableWebMvcConfiguration.class,其父类是重点 public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware { } public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite(); // 从容器中获取所有的WebMvcConfigurer就是自己写的全托管配置类,然后把其赋值内部的configurers @Autowired( required = false ) public void setConfigurers(List<WebMvcConfigurer> configurers) { if (!CollectionUtils.isEmpty(configurers)) { this.configurers.addWebMvcConfigurers(configurers); } } // 举例刚才的视图解析器,这方法添加视图映射 protected void addViewControllers(ViewControllerRegistry registry) { this.configurers.addViewControllers(registry); } // 进去configurers.addViewControllers(registry); // delegates内部遍历,注入类WebMvcConfigurer // 把自己配的WebMvcConfigurer遍历里面的viewController全调用起作用 // 这里遍历就包括了自己覆盖的,已经没有覆盖的 public void addViewControllers(ViewControllerRegistry registry) { Iterator var2 = this.delegates.iterator(); while(var2.hasNext()) { WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next(); delegate.addViewControllers(registry); } } }3)全面接管@EnableWebMvc,所有都是我们自己配
原理就是@EnableWebMvc注解里面导入了WebMvcConfiguration.class类
而我们的总的Mvc自动配置类上要先判断,否则不生效 ConditionOnMissingBean(WebMvcConfiguration.class)4)SpringBoot中会有很多很多的xxxCustomizer帮助我们进行定制配置
11. 拦截器实现登录拦截
实现 HandlerInterceptor 接口,并在自己的配置类中注册
public class LoginHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if(user == null){ request.getRequestDispatcher("http://www.likecs.com/").forward(request,response); return false; } return true; } } @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 已经boot做好了静态资源放行 registry.addInterceptor(new LoginHandlerInterceptor()) .addPathPatterns("/**") .excludePathPatterns("http://www.likecs.com/","/user/login"); } @Override public void addViewControllers(ViewControllerRegistry registry) { // 浏览器发送/howl请求,也来到success页面 registry.addViewController("/howl").setViewName("success"); } }12. Restful 普通 Restful
查询 /user/get /user --GET
添加 /user/create /user --POST
修改 /user/update /user/{id} --PUT
删除 /user/delete /user/{id} --DELETE
实际操作
URI: /资源名称/资源表示 HTTP请求方式区分对资源的CURD
请求url 请求方式查询所有用户 /users GET
查询某个用户 /user/{id} GET
添加用户 /user POST
修改用户 /user PUT
删除用户 /user{id} DELETE
// 查询所有 @GetMapping(value = "/users") public String list(){ return employeeDao.getAll().toString(); } // 查询单个 @GetMapping(value = "/user/{id}") public String listById(@PathVariable(value = "id") Integer id){ return id + " 单个用户查询"; } // 添加 @PostMapping(value = "/user") public String addUser(){ return "这里是添加员工"; } @PutMapping(value = "/user") public String updateUser(){ return "这里是put更新用户"; } @DeleteMapping(value = "/user/{id}") public String deleteUser(@PathVariable(value = "id") Integer id){ return "这里是删除用户" + id; }
13. 错误处理
1)错误页面
错误处理的自动配置:ErrorMvcAutoConfiguration
给容器添加了
DefaultErrorAttributes、
BasicErrorController:处理默认的/error请求
ErrorPageCustomizer:系统出现错误来到error请求进行处理
步骤:一旦系统出现4xx或5xx的错误,ErrorPageCustomizer会生效(定制错误的相应规则)