SpringBoot进阶 (4)

原理

在做其他自动配置时回导入 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会生效(定制错误的相应规则)


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydsdg.html