Spring MVC 的核心知识点梳理
MVC 是什么MVC不是 Spring 发明的而是一种设计模式目的是“解耦”。MModel模型数据 业务逻辑。比如Teacher类TeacherService。VView视图展示数据的界面。比如 JSP、Thymeleaf 模板或者是现代返回 JSON 的前端页面。CController控制器接收用户请求调用 Model最后选择 View 来展示。流程用户点击一个链接 → Controller 拿到请求 → 调 Service 拿到数据Model→ 把数据交给 View 渲染 → 返回 HTML 给浏览器。Spring MVC 就是把这个流程在 Java Web 环境里落地的一套框架。核心组件与处理流程Spring MVC 最核心的就是一个前端控制器Front Controller——DispatcherServlet。组件作用常见实现DispatcherServlet统一入口调度一切Spring 提供我们只需配置HandlerMapping根据请求 URL 找到对应的处理器RequestMappingHandlerMappingHandlerAdapter执行找到的处理器Controller 方法RequestMappingHandlerAdapterHandlerInterceptor拦截器在处理方法前后做增强自定义ViewResolver根据视图名找到真正的视图文件InternalResourceViewResolver(JSP)HandlerExceptionResolver处理异常ExceptionHandlerExceptionResolver一个请求的完整生命周期回顾前面讲过的流程图请求到达DispatcherServlet。DispatcherServlet找HandlerMapping谁处理这个 URLHandlerMapping返回一个HandlerExecutionChain包含 Controller 方法 一堆拦截器。DispatcherServlet找HandlerAdapter谁能执行这个 Controller 方法HandlerAdapter执行具体方法期间会做参数绑定、类型转换、校验等。方法返回ModelAndView或ResponseBody直接返回数据。若有视图名ViewResolver解析出真正的 JSP 等视图。渲染视图响应给浏览器。Controller 与注解从入门到精通Controller RestControllerController// 声明这是一个控制器类方法通常返回视图名publicclassTeacherController{...}RestController// Controller ResponseBody所有方法默认返回 JSONpublicclassTeacherRestController{...}RequestMapping 及衍生注解RequestMapping(/teacher)// 类级别映射publicclassTeacherController{RequestMapping(value/list,methodRequestMethod.GET)publicStringlist(){...}// 等价于 GetMapping(/list)}GetMapping、PostMapping、PutMapping、DeleteMapping等都是RequestMapping的快捷方式。参数绑定注解重点对比注解从哪里拿数据示例RequestParamURL 问号后的参数或表单数据?nameTom→RequestParam(name) String namePathVariableURI 路径中的占位符/teacher/{id}→PathVariable(id) Long idRequestBody请求体中的 JSON/XMLPOST 的 JSON{name:Tom}自动转成 Teacher 对象ModelAttribute① 从 Model 中取② 把参数绑定到对象常用于表单提交自动封装对象RequestHeader请求头RequestHeader(User-Agent) String uaCookieValueCookieCookieValue(JSESSIONID) String sid把参数自动封装成对象Spring 可以直接将表单字段或 JSON 映射成一个 Java Bean。表单提交示例form action/teacher/save methodpost input namename/ !-- Teacher.name -- input nameage/ !-- Teacher.age -- input typesubmit/ /formPostMapping(/teacher/save)publicStringsave(ModelAttributeTeacherteacher){// teacher 对象已被自动填充 name 和 ageteacherService.save(teacher);returnredirect:/teacher/list;}底层原理DataBinderBeanWrapper负责属性拷贝。自定义类型转换器String → Date很多时候请求参数是String但你想转成Date、LocalDate或自定义类型。Spring 内置的转换器和格式化器ConverterS, T源类型 → 目标类型如StringToDateConverter。Formatter专为字符串和对象互转设计支持国际化适合String - Date。自定义一个 String → Date 的 Converter 示例ComponentpublicclassStringToDateConverterimplementsConverterString,Date{privatefinalSimpleDateFormatformatnewSimpleDateFormat(yyyy-MM-dd);OverridepublicDateconvert(Stringsource){try{returnformat.parse(source);}catch(ParseExceptione){thrownewIllegalArgumentException(日期格式必须为 yyyy-MM-dd);}}}在 Spring Boot 中只需让它被容器管理Component就会自动注册到转换器链。在传统 Spring MVC XML 中需要配置FormattingConversionServiceFactoryBean。使用场景GetMapping(/teacher/search)publicStringsearchByDate(RequestParam(date)Datedate){// /teacher/search?date2025-01-01 → date 直接转换好}如果转换失败会抛出TypeMismatchException我们可以用异常处理来统一返回友好信息。拦截器Interceptor和过滤器Filter两者都可以在请求前后做手脚但层级不同。对比维度Filter过滤器Interceptor拦截器归属Servlet 规范Java EESpring MVC 框架作用范围能拦截所有进入 Servlet 的请求包括静态资源只能拦截进到 Spring MVC 的请求DispatcherServlet 处理是否能用 Spring Bean不能直接注入可以迂回可以正常注入其他 Bean执行顺序先经过 Filter再进 DispatcherServlet在 DispatcherServlet 之后Controller 方法之前典型场景字符编码、跨域、权限安全检查登录检查、日志记录、性能监控、用户权限补充定义拦截器示例ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){// 检查 session 中是否有用户if(request.getSession().getAttribute(user)null){response.sendRedirect(/login);returnfalse;// 不放行}returntrue;}}注册拦截器ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateLoginInterceptorloginInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(loginInterceptor).addPathPatterns(/teacher/**)// 要拦截的.excludePathPatterns(/teacher/login);// 排除的}}异常处理优雅地给前端报错还记得我们之前聊过的“异常和错误”吗常用的处理方式是局部异常处理ControllerpublicclassTeacherController{ExceptionHandler(TeacherNotFoundException.class)publicStringhandleNotFound(TeacherNotFoundExceptionex,Modelmodel){model.addAttribute(msg,ex.getMessage());returnerror/404;// 返回错误视图}}全局异常处理推荐ControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(MethodArgumentNotValidException.class)ResponseStatus(HttpStatus.BAD_REQUEST)ResponseBodypublicMapString,StringhandleValidation(MethodArgumentNotValidExceptionex){// 返回校验失败信息如 {name:不能为空}...}ExceptionHandler(Exception.class)ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)ResponseBodypublicMapString,StringhandleGeneral(Exceptionex){returnMap.of(error,服务器内部错误);}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2603054.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!