分析講解SpringMVC注解配置如何實(shí)現(xiàn)
簡介
使用配置類和注解代替web.xml和SpringMVC配置文件的功能
在Servlet3.0環(huán)境中,容器會(huì)在類路徑中查找實(shí)現(xiàn)javax.servlet.ServletContainerInitializer接口的類,如果找到的話就用它來配置Servlet容器。 Spring提供了這個(gè)接口的實(shí)現(xiàn),名為SpringServletContainerInitializer,這個(gè)類又會(huì)查找實(shí)現(xiàn)WebApplicationInitializer的類并將配置的任務(wù)交給它們來完成。Spring3.2引入了一個(gè)便利的WebApplicationInitializer基礎(chǔ)實(shí)現(xiàn),名為AbstractAnnotationConfigDispatcherServletInitializer,當(dāng)我們的類擴(kuò)展了AbstractAnnotationConfigDispatcherServletInitializer并將其部署到Servlet3.0容器的時(shí)候,容器會(huì)自動(dòng)發(fā)現(xiàn)它,并用它來配置Servlet上下文。
意思就是容器會(huì)自動(dòng)發(fā)現(xiàn)繼承了AbstractAnnotationConfigDispatcherServletInitializer的子類,并用它來配置servlet上下文。(用來代替web.xml)
注解類代替web.xml
package com.hxut.rj1192.annoation; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import javax.servlet.Filter; //代替web.xml filter過濾器 spring springmvc的配置類 dispracture的映射路徑 public class webXml extends AbstractAnnotationConfigDispatcherServletInitializer { // 指定spring配置類 @Override protected Class<?>[] getRootConfigClasses() { return new Class[] {SpringConfig.class}; } // 指定springmvc配置類 @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } // 指定dispracture的映射路徑 即url-pattern @Override protected String[] getServletMappings() { return new String[]{"/"}; } //注冊編碼過濾器 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter(); encodingFilter.setEncoding("UTF-8"); encodingFilter.setForceRequestEncoding(true); HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); return new Filter[]{encodingFilter, hiddenHttpMethodFilter}; } }
注解類代替Spring-mvc.xml
Spring-mvc配置文件(不管是xml還是注解的類)有如下八個(gè)功能
- 視圖解析器
- 掃描包的范圍(組件掃描)
- view-controller(只返回視圖的控制方法)
- defalut-servlet-handler 靜態(tài)資源處理
- mvc注解驅(qū)動(dòng)
- 文件上傳解析器
- 異常處理
- 攔截器
package com.hxut.rj1192.annoation; import com.hxut.rj1192.InterceptorRegistry01; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver; import org.thymeleaf.spring5.SpringTemplateEngine; import org.thymeleaf.spring5.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ITemplateResolver; import org.thymeleaf.templateresolver.ServletContextTemplateResolver; import java.util.List; import java.util.Properties; //1視圖解析器 2掃描包的范圍(組件掃描) 3view-controller(只返回視圖的控制方法) 4defalut-servlet-handler 靜態(tài)資源處理和 //5 mvc注解驅(qū)動(dòng) 6文件上傳解析器 7異常處理 8攔截器 //代替springmvc的配置文件 //掃描包的范圍(組件掃描) @ComponentScan("com.hxut.rj1192") //開啟MVC注解驅(qū)動(dòng) @EnableWebMvc @Configuration public class SpringMvcConfig implements WebMvcConfigurer { //配置視圖解析器 // 這個(gè)注解是將類放進(jìn)ioc容器中 因?yàn)閣eb.xml中就是嵌套的, @Bean public ITemplateResolver templateResolver() { WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); // ServletContextTemplateResolver需要一個(gè)ServletContext作為構(gòu)造參數(shù),可通過WebApplicationContext 的方法獲得 ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver( webApplicationContext.getServletContext()); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); templateResolver.setCharacterEncoding("UTF-8"); templateResolver.setTemplateMode(TemplateMode.HTML); return templateResolver; } //生成模板引擎并為模板引擎注入模板解析器 @Bean public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } //生成視圖解析器并未解析器注入模板引擎 @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setCharacterEncoding("UTF-8"); viewResolver.setTemplateEngine(templateEngine); return viewResolver; } //default-servlet configuure @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { WebMvcConfigurer.super.configureDefaultServletHandling(configurer); } @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistry01 interceptorRegistry=new InterceptorRegistry01(); // addPathPatterns("/");是設(shè)置攔截的url // excludePathPatterns(); 是設(shè)置不攔截的url registry.addInterceptor(interceptorRegistry).addPathPatterns("/"); } //視圖控制器 @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/hello").setViewName("succes"); } //配置文件上傳解析器 @Bean public CommonsMultipartResolver multipartResolver(){ CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(); return commonsMultipartResolver; } //配置異常映射 @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver(); Properties prop = new Properties(); prop.setProperty("java.lang.ArithmeticException", "error"); //設(shè)置異常映射 exceptionResolver.setExceptionMappings(prop); //設(shè)置共享異常信息的鍵 exceptionResolver.setExceptionAttribute("ex"); resolvers.add(exceptionResolver); } }
全用xml寫:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--2.掃描包的范圍(組件掃描)--> <context:component-scan base-package="com.hxut.rj1192.zyk"/> <!-- 1.配置Thymeleaf視圖解析器 --> <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="order" value="1"/> <property name="characterEncoding" value="UTF-8"/> <property name="templateEngine"> <bean class="org.thymeleaf.spring5.SpringTemplateEngine"> <property name="templateResolver"> <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"> <property name="prefix" value="/WEB-INF/templates/"/> <property name="suffix" value=".html"/> <property name="templateMode" value="HTML5"/> <property name="characterEncoding" value="UTF-8"/> </bean> </property> </bean> </property> </bean> <!--4.靜態(tài)資源處理--> <mvc:default-servlet-handler/> <!--5.mvc注解驅(qū)動(dòng)--> <mvc:annotation-driven/> <mvc:interceptors> <bean class="com.hxut.rj1192.zyk.interceptor.interceptor01"/> </mvc:interceptors> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.ArithmeticException">error</prop> </props> </property> <property name="exceptionAttribute" value="ex"></property> </bean> <! --3.view-controller--> <mvc:view-controller path="/testView" view-name="success"></mvc:view-controller> <! --4.文件上傳解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean> <! --7.異常處理--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.ArithmeticException">error</prop> </props> </property> <!-- 將錯(cuò)誤信息放到ex這個(gè)變量中,并放進(jìn)model中--> <property name="exceptionAttribute" value="ex"></property> </bean> <! --8.攔截器--> <mvc:interceptors> <ref bean="first"></ref> <ref bean="second"></ref> </mvc:interceptors> </beans>
攔截器文件
package com.hxut.rj1192; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class InterceptorRegistry01 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("prehandle 執(zhí)行"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("posthandle 執(zhí)行"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterhandle 執(zhí)行"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
到此這篇關(guān)于分析講解SpringMVC注解配置如何實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringMVC注解配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot下使用shiro自定義filter的個(gè)人經(jīng)驗(yàn)分享
這篇文章主要介紹了springboot下使用shiro自定義filter的個(gè)人經(jīng)驗(yàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot實(shí)現(xiàn)自定義線程池的方法
這篇文章主要介紹了SpringBoot中的自定義線程池解析,實(shí)現(xiàn)自定義線程池重寫spring默認(rèn)線程池的方式使用的時(shí)候,只需要加@Async注解就可以,不用去聲明線程池類,需要的朋友可以參考下2023-11-11spring boot 日志/頁面處理、實(shí)體類構(gòu)建、后臺(tái)管理功能的實(shí)現(xiàn)
這篇文章主要介紹了spring boot 日志/頁面處理、實(shí)體類構(gòu)建、后臺(tái)管理功能的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08SpringBoot整合Mybatis實(shí)現(xiàn)高德地圖定位并將數(shù)據(jù)存入數(shù)據(jù)庫的步驟詳解
這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)高德地圖定位并將數(shù)據(jù)存入數(shù)據(jù)庫的步驟詳解,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05