1.SpringBoot WebMvcConfigurer详解
2.springmvcç®åä¾å(springspringmvc)
3.Springboot2(5)WebMvcConfigurer讲解
4.springåspring web mvcçåºå«
5.一直在用SpringMVC?不妨认识下SpringWebflux
SpringBoot WebMvcConfigurer详解
WebMvcConfigureré ç½®ç±»å ¶å®æ¯ Spring å é¨çä¸ç§é ç½®æ¹å¼ï¼éç¨ JavaBean çå½¢å¼æ¥ä»£æ¿ä¼ ç»ç xml é ç½®æ件形å¼è¿è¡é对æ¡æ¶ä¸ªæ§åå®å¶ï¼å¯ä»¥èªå®ä¹ä¸äºHandlerï¼Interceptorï¼ViewResolverï¼MessageConverterãåºäºjava-basedæ¹å¼çspring mvcé ç½®ï¼éè¦å建ä¸ä¸ªé 置类并å®ç°WebMvcConfigurer æ¥å£ï¼å¨Spring Boot 1.5çæ¬é½æ¯é éåWebMvcConfigurerAdapterçæ¹æ³æ¥æ·»å èªå®ä¹æ¦æªå¨ï¼æ¶æ¯è½¬æ¢å¨çãSpringBoot 2.0 åï¼è¯¥ç±»è¢«æ 记为@Deprecatedï¼å¼ç¨ï¼ãå®æ¹æ¨èç´æ¥å®ç°WebMvcConfigureræè ç´æ¥ç»§æ¿WebMvcConfigurationSupportï¼æ¹å¼ä¸å®ç°WebMvcConfigureræ¥å£ï¼æ¨èï¼ï¼æ¹å¼äºç»§æ¿WebMvcConfigurationSupportç±»ï¼å ·ä½å®ç°å¯çè¿ç¯æç« ã /fmwind/article/details/
常ç¨çæ¹æ³ï¼
以ååSpringMVCçæ¶åï¼å¦æéè¦è®¿é®ä¸ä¸ªé¡µé¢ï¼å¿ é¡»è¦åControllerç±»ï¼ç¶åååä¸ä¸ªæ¹æ³è·³è½¬å°é¡µé¢ï¼æè§å¥½éº»ç¦ï¼å ¶å®éåWebMvcConfigurerä¸çaddViewControllersæ¹æ³å³å¯è¾¾å°ææäº
å¼çæåºçæ¯ï¼å¨è¿ééåaddViewControllersæ¹æ³ï¼å¹¶ä¸ä¼è¦çWebMvcAutoConfigurationï¼Springbootèªå¨é ç½®ï¼ä¸çaddViewControllersï¼å¨æ¤æ¹æ³ä¸ï¼Spring Bootå°â/âæ å°è³index.htmlï¼ï¼è¿ä¹å°±æå³çèªå·±çé ç½®åSpring Bootçèªå¨é ç½®åæ¶ææï¼è¿ä¹æ¯æ们æ¨èæ·»å èªå·±çMVCé ç½®çæ¹å¼ã
æ¯å¦ï¼æ们æ³èªå®ä¹éæèµæºæ å°ç®å½çè¯ï¼åªééåaddResourceHandlersæ¹æ³å³å¯ã
注ï¼å¦æ继æ¿WebMvcConfigurationSupportç±»å®ç°é ç½®æ¶å¿ é¡»è¦éå该æ¹æ³ï¼å ·ä½è§å ¶å®æç«
æ¤æ¶ä¼æ³¨åä¸ä¸ªé»è®¤çHandlerï¼DefaultServletHttpRequestHandlerï¼è¿ä¸ªHandlerä¹æ¯ç¨æ¥å¤çéææ件çï¼å®ä¼å°è¯æ å°/ãå½DispatcherServeltæ å°/æ¶ï¼/ å/ æ¯æåºå«çï¼ï¼å¹¶ä¸æ²¡ææ¾å°åéçHandleræ¥å¤ç请æ±æ¶ï¼å°±ä¼äº¤ç»DefaultServletHttpRequestHandler æ¥å¤çã注æï¼è¿éçéæèµæºæ¯æ¾ç½®å¨webæ ¹ç®å½ä¸ï¼èéWEB-INF ä¸ã
ããå¯è½è¿éçæè¿°æç¹ä¸å¥½æï¼æèªå·±ä¹è¿ä¹è§å¾ï¼ï¼æ以ç®å举个ä¾åï¼ä¾å¦ï¼å¨webrootç®å½ä¸æä¸ä¸ªå¾çï¼1.png æ们ç¥éServeltè§èä¸webæ ¹ç®å½ï¼webrootï¼ä¸çæ件å¯ä»¥ç´æ¥è®¿é®çï¼ä½æ¯ç±äºDispatcherServleté ç½®äºæ å°è·¯å¾æ¯ï¼/ ï¼å®å ä¹æææç请æ±é½æ¦æªäºï¼ä»è导è´1.png 访é®ä¸å°ï¼è¿æ¶æ³¨åä¸ä¸ªDefaultServletHttpRequestHandler å°±å¯ä»¥è§£å³è¿ä¸ªé®é¢ãå ¶å®å¯ä»¥ç解为DispatcherServletç ´åäºServletçä¸ä¸ªç¹æ§ï¼æ ¹ç®å½ä¸çæ件å¯ä»¥ç´æ¥è®¿é®ï¼ï¼DefaultServletHttpRequestHandleræ¯å¸®å©åå½è¿ä¸ªç¹æ§çã
è¿ä¸ªæ¹æ³æ¯ç¨æ¥é ç½®è§å¾è§£æå¨çï¼è¯¥æ¹æ³çåæ°ViewResolverRegistry æ¯ä¸ä¸ªæ³¨åå¨ï¼ç¨æ¥æ³¨åä½ æ³èªå®ä¹çè§å¾è§£æå¨çãViewResolverRegistry 常ç¨çå 个æ¹æ³ï¼ /fmwind/article/details/
è·¨åèµæºå ±äº«åæ¥é½æ¯çé¨çéæ±ï¼æ们å¯ä»¥ä½¿ç¨ CORS æ¥å¿«éå®ç° è·¨å访é®ï¼åªéè¦å¨æå¡ç«¯è¿è¡ææå³å¯ï¼æ éå¨å端添å é¢å¤ç设置
ç®å说ï¼CORSæ¯ä¸ç§è®¿é®æºå¶ï¼è±æå ¨ç§°: Cross-Origin Resource Sharingï¼å³æ们说çè·¨åèµæºå ±äº«ãå½ä¸ä¸ªèµæºä»ä¸è¯¥èµæºæ¬èº«æå¨æå¡å¨ä¸åçåæ端å£è¯·æ±ä¸ä¸ªèµæºæ¶ï¼èµæºä¼åèµ·ä¸ä¸ªè·¨åHTTP请æ±ãæ¯å¦ï¼å¨ä¸ä¸ªååä¸çç½é¡µä¸ï¼è°ç¨å¦ä¸ä¸ªååä¸çèµæºã
å¯¹äº CORSçè·¨å请æ±ï¼ä¸é¢çæ¹å¼æ¯éåwebMvcConfigurerå®ç°å ¨å±é ç½®ï¼è¿éå±å¼ä¸ä¸ï¼ä¸»è¦æ以ä¸å ç§æ¹å¼å¯ä¾éæ©ï¼
å¨ä»»æé 置类ï¼è¿åä¸ä¸ª æ°ç CorsFIlter Bean ï¼å¹¶æ·»å æ å°è·¯å¾åå ·ä½çCORSé 置路å¾ã
åèä¸é¢ï¼æ¤å¤çç¥
å¨æ§å¶å¨ä¸ä½¿ç¨æ³¨è§£ @CrossOrigin:
å¨Controlleræ¹æ³ä¸ä½¿ç¨æ³¨è§£ @CrossOrigin:
ä½¿ç¨ HttpServletResponse 对象添å ååºå¤´(Access-Control-Allow-Origin)æ¥ææåå§åï¼è¿é Originçå¼ä¹å¯ä»¥è®¾ç½®ä¸º "*",源码è¡¨ç¤ºå ¨é¨æ¾è¡ã
springmvcç®åä¾å(springspringmvc)
SpringMVC
1ãSpringMVCæ¯ä¸ç§åºäºJavaçå®ç°MVC设计模åç请æ±é©±å¨ç±»åçè½»é级Webæ¡æ¶ï¼å±äºSpringFrameWorkçåç»äº§åï¼å·²ç»èåå¨SpringWebFlowä¸ã
2ãç¨æ·åé请æ±è³å端æ§å¶å¨DispatcherServletãDispatcherServletæ¶å°è¯·æ±è°ç¨HandlerMappingå¤çå¨æ å°å¨ã
3ãspringmvcæ¯ä¸ä¸ªè¡¨ç°å±çæ¡æ¶ç»å ¸ä¸å±æ¶æï¼è¡¨ç°å±ï¼serviceå±ï¼daoå±ãSpringMVCåStruts2ä¸æ ·ï¼é½æ¯ä¸ºäºè§£å³è¡¨ç°å±é®é¢çwebæ¡æ¶ï¼å®ä»¬é½æ¯åºäºMVC设计模å¼çã
4ãSpringMVCæ¯å½åæä¼ç§çMVCæ¡æ¶ï¼èªä»Spring5çæ¬åå¸åï¼ç±äºæ¯æ注解é ç½®ï¼æç¨æ§æäºå¤§å¹ 度çæé«ãSpring0æ´å å®åï¼å®ç°äºå¯¹Struts2çè¶ è¶ãç°å¨è¶æ¥è¶å¤çå¼åå¢ééæ©äºSpringMVCã
5ãspringmvcçå·¥ä½åçæ¯ï¼æä¾äºæ建Webåºç¨ç¨åºçå ¨åè½MVC模åã使ç¨Springå¯æå ¥çMVCæ¶æï¼å¯ä»¥éæ©æ¯ä½¿ç¨å ç½®çSpringWebæ¡æ¶è¿æ¯Strutsè¿æ ·çWebæ¡æ¶ã
æä¹è¿è¡ä¸ä¸ªspringmvc1ãç¨æ·å起请æ±å°å端æ§å¶å¨ï¼DispatcherServletï¼ï¼è¯¥æ§å¶å¨ä¼è¿æ»¤åºåªäºè¯·æ±å¯ä»¥è®¿é®Servletãåªäºä¸è½è®¿é®ãå°±æ¯url-patternçä½ç¨ï¼å¹¶ä¸ä¼å è½½springmvc.xmlé ç½®æ件ã
2ãç¨æ·åæå¡ç«¯åéä¸æ¬¡è¯·æ±ï¼è¿ä¸ªè¯·æ±ä¼å å°å端æ§å¶å¨DispatcherServlet(ä¹å«ä¸å¤®æ§å¶å¨)ãDispatcherServletæ¥æ¶å°è¯·æ±åä¼è°ç¨HandlerMappingå¤çå¨æ å°å¨ã
3ãç¨åºè¿è¡çæ¶åï¼è¿æ ·çæ§è¡æµç¨ä¸»è¦å°±æ¯é¦å è¦è¿è¡æ°æ®ç»è®¡ï¼ç¶åå®æåæ°è°è¯æ¨¡å¼ï¼æåè¿è¡æ°æ®çè¾åºå®æèæµç¨æä½ã
4ãæå¼web.xmlæ件ï¼éè¦å¨è¿éè¿è¡å¯¹æ¦æªå¨çé ç½®ã对äºæ¦æªå¨ä¸è¬é½éè¦é ç½®çæ¯servletåservlet-mapping两个æ件ï¼å 为è¿é使ç¨çæ¯springmvcçæ¦æªå¨ãæ以å¨servlet-classä¸éæ©springmvcä¸çåæ´¾æ¦æªå¨ã
5ãæªå¾ççä½ çspringmvcç项ç®ç»æã
æ±ä¸ªwebsocketåspringmvcç»åçä¾åå,ç½ä¸æ¾çé½ä¸é è°±1ãè¶ çº§è¯¦ç»çspring+websocketä¾åï¼è¿é对spring0åwebsocketçjarå å²çªbugï¼ç»åºäºè§£å³æ¹æ¡ã
2ãwebsocketæ¯ä¸ç§é¿è¿æ¥åè®®ï¼å®å¯ä»¥å¨æµè§å¨åæå¡å¨ä¹é´å»ºç«ä¸ä¸ªä¸åéçååå®æ¶éä¿¡çééãå主æ¥æçä¸å¡ç³»ç»ä¸ï¼æä¸ä¸ªspringmvc项ç®ä½¿ç¨å°äºwebsocketï¼æ以è¿é使ç¨äºspringmvcæ¥æ´åwebsocketã
3ãå·é误ï¼æ¯è¦éº»ç¦ä¸ç¹ï¼è¯´æåå°æé误ããããã
4ãååä¿®æ¹åè½å¼å(springmvcç¬è®°)1ãä¸é¢æ们就å¯ä»¥é¨ç½²å·¥ç¨ï¼ä½¿ç¨å°åhttpï¼//localhostï¼/springmvc-mybatis/queryItems.actionè¿è¡è®¿é®ï¼æ¤æ¶ç¹å»é¡µé¢ä¸çä¿®æ¹é¡µé¢ï¼å°±ä¼æ¾å°editItems.actionï¼æ们å¯ä»¥çå°ä¿®æ¹é¡µé¢ä¸åæ¾äºæ们éæ©è¦ä¿®æ¹ååçä¿¡æ¯ã
2ãå¨å¤§æ°æ®å¹è®ç主è¦å¹è®å 容æï¼è¯¾ç¨å 容æå¦ã
3ãå¦ä¹ 大æ°æ®é¦å è¦å¦ä¹ Javaåºç¡Javaæ¯å¤§æ°æ®å¦ä¹ éè¦çç¼ç¨è¯è¨åºç¡ï¼å 为大æ°æ®çå¼ååºäºå¸¸ç¨çé«çº§è¯è¨ã
æ没æ大ç¥ç»æ讲ä¸ä¸springmvcæä½æ°æ®åº
Springæä¾äºWebåºç¨å¼åçä¸æ´å¥æµç¨ï¼èä¸ä» ä» æ¯MVCï¼ä»ä»¬ä¹é´å¯ä»¥å¾æ¹ä¾¿çç»åå¨ä¸èµ·ãä¸é¢æä¸ä¸ªèªå·±åå¾ä¾åï¼åå®è¿ä¸ªä¾ååççä½ä¼å°äºSpringMVCç强大ã
å¨ã对象èµæºç®¡çå¨ãçªå£ä¸å±å¼æå¡å¨ï¼ç¶åéæ©ãæ°æ®åºãèç¹å³é®åå»ãæ°æ®åºãèç¹ï¼ä»å¼¹åºæ¥çå¿«æ·èåä¸éæ©ãæ°å»ºæ°æ®åºãå½ä»¤ãæ§è¡ä¸è¿°æä½åï¼ä¼å¼¹åºãæ°å»ºæ°æ®åºã对è¯æ¡ã
springä¸æä¾äºä¸ä¸ªspring-jdbcï¼å°±æ¯å¯¹jdbcç使ç¨ç®ååæ©å±ï¼å¢å ä¸äºå¼åæçãå¦æè¦äºè§£æ´è¯¦ç»ï¼å¯ä»¥æç´¢spring-jdbc使ç¨è¯¦æ ã
é¦å ï¼ä½ çç¡®å®æ°æ®ç主é®æ¯å¦å¯ä»¥ä½¿ç¨åºåèªå¢ãå¦æå¯ä»¥é£ä¹ä½ å¯ä»¥å¨æå ¥æ°æ®çæ¶åè·ååºåéçå¼ï¼è¿æ ·æ°æ®å°±ä¸ä¼éå¤äºã
springmvcå¯ä»¥è¿æ¥æ°æ®åºï¼ç¨springçspringtemplateãç®åæ°æ®åºæä½ã
å¨é ç½®æ件ä¸è®¾ç½®ä¸ä¸å°±å¯ä»¥ããä¾å¦ï¼ä»¥ä¸æ¯springé ç½®æ件ä¸çå 容ï¼ä¸æå¯ä»¥ç»§ç»é®ãã
springmvcææ ·å¼æ¥å¤ç1ãæµè§å¨å起请æ±ï¼Webæå¡å¨å¼ä¸ä¸ªçº¿ç¨å¤çï¼å¤çå®æå¤çç»æè¿åæµè§å¨ã好å没ä»ä¹å¥½è¯´çäºï¼ç»å¤§å¤æ°Webæå¡å¨é½å¦æ¤è¬å¤çãç°å¨æ³æ³å¦æå¤ççè¿ç¨ä¸éè¦è°ç¨å端çä¸ä¸ªä¸å¡é»è¾æå¡å¨ã
2ãæ¯ç´æ¥å®ç°èªå·±çHandlerExceptionResolverãHandlerExceptionResolveræ¯ä¸ä¸ªæ¥å£ï¼springMVCæ¬èº«å·²ç»å¯¹å ¶æäºä¸ä¸ªèªèº«çå®ç°ââDefaultExceptionResolverï¼è¯¥è§£æå¨åªæ¯å¯¹å ¶ä¸çä¸äºæ¯è¾å ¸åçå¼å¸¸è¿è¡äºæ¦æªå¤çã
3ãæ¨è使ç¨è¿ä¸ªæ¥å®ç°ãä¸æ说å°ï¼éæ¾Servlet线ç¨ï¼äº¤ç±æå®ç线ç¨æ± å»å¤çï¼é£ä¹å¦ä½å»å®ä¹æå®ç线ç¨æ± ï¼æ³¨æï¼æ¹æ³è¿åçæ¯Callableã
Springboot2(5)WebMvcConfigurer讲解
Spring Boot 2 WebMvcConfigurer 实现详解
请求与视图映射
通过 `ViewController` 实现将请求转至特定视图。例如:通过 `@Override` 和 `addViewControllers` 方法配置视图控制器,源码让访问特定路径时自动返回指定的源码视图页面。例如访问 `.0.0.1:/login` 时,源码直接返回 `login.html` 页面。源码静态资源映射
使用 `ResourceHandlers` 配置静态资源映射,源码直播源源码如、源码JS、源码CSS 等。源码通过 `addResourceHandlers` 方法指定资源的源码映射路径和存储位置,如返回 `resources/web/home.html` 页面。源码注意静态资源存放于 WEB-INF 目录下。源码消息内容转换
配置 `MessageConverter` 实现将 JSON 实体对象转换为 JSON 字符串返回。源码使用 `FastJson` 作为转换器,源码实现返回实体类数据的源码同时,能进行数据的重写和格式化。通过自定义 `FastJsonHttpMessageConverter` 类,设置转换规则,如日期格式、discuzX 源码分析过滤 null 值等。CORS 跨域请求配置
Spring Boot 集成了 CORS 支持,简化了前后端分离的开发。通过 `addCorsMappings` 方法配置 CORS 属性,如允许的请求方法、请求头等。实现如访问 `http://.0.0.1:/web/cors.html` 时,不报跨域异常。拦截器配置
在 Spring Boot 中使用 `WebMvcConfigurer` 的互联php源码 `addInterceptors` 方法配置拦截器,实现请求前、后以及完成后的处理逻辑。通过实现 `HandlerInterceptor` 接口,自定义拦截器逻辑,如记录日志、权限验证等。配置拦截规则,如 `addPathPatterns` 方法定义拦截路径,`excludePathPatterns` 方法排除不拦截的fftw源码解析路径。springåspring web mvcçåºå«
åªè¦ä½ ç项ç®æ¯web项ç®çè¯å°±è¦ç¨å°spring-webï¼å¨web.xmlä¸è¦å®ä¹springçé ç½®æ件
spring-webmvcæ¯mvcçå®ç°æ¹å¼ï¼æ³strutsä¸æ ·
一直在用SpringMVC?不妨认识下SpringWebflux
Spring-webflux是Spring框架在5.0版本后提供的响应式编程风格的web开发框架。它包含spring-framework和spring mvc,运行在包括Netty、Undertow和Servlet容器在内的多个环境。你可以在项目中同时使用spring-webmvc和spring-webflux,或者选择其中一个来开发web应用。
响应式编程意味着异步非阻塞的流式编程。在API调用获取数据时,无需阻塞等待数据返回,dlopen源码解析而是当数据可用时进行通知。这提高了系统吞吐量,因为CPU在等待数据时可以执行其他任务。
Reactor框架是Spring-webflux的基础,提供了Mono和Flux两种API类型。Spring-webflux能够与其他响应式框架并存,如RxJava。选择使用Spring-webmvc还是Spring-webflux取决于应用需求。Spring-webflux支持在各种服务器上运行,比如Netty、Undertow等,并默认使用Netty,因为Netty是基于非阻塞模型的。
与Spring-webmvc相比,Spring-webflux采用非阻塞的并发模型。Webmvc基于Servlet,实现为阻塞式IO,使用线程池处理请求,限制了系统的吞吐量。而Spring-webflux基于NIO框架,如Netty,使用很少的几个工作线程就能处理请求,无需阻塞等待,CPU资源得到更有效利用。
Spring-webflux提高的是并发处理请求的能力,而不是程序执行速度。代码示例展示,使用Springboot构建一个webflux应用非常简单,只需添加依赖,并定义对象和控制器。通过RouterFunctions.route().GET()方法声明路由,处理HTTP请求。Spring-webflux默认使用Netty提供HTTP服务,项目启动后访问指定URL即可验证应用正常运行。