分析講解SpringMVC注解配置如何實(shí)現(xiàn)
簡(jiǎn)介
使用配置類和注解代替web.xml和SpringMVC配置文件的功能
在Servlet3.0環(huán)境中,容器會(huì)在類路徑中查找實(shí)現(xiàn)javax.servlet.ServletContainerInitializer接口的類,如果找到的話就用它來(lái)配置Servlet容器。 Spring提供了這個(gè)接口的實(shí)現(xiàn),名為SpringServletContainerInitializer,這個(gè)類又會(huì)查找實(shí)現(xiàn)WebApplicationInitializer的類并將配置的任務(wù)交給它們來(lái)完成。Spring3.2引入了一個(gè)便利的WebApplicationInitializer基礎(chǔ)實(shí)現(xiàn),名為AbstractAnnotationConfigDispatcherServletInitializer,當(dāng)我們的類擴(kuò)展了AbstractAnnotationConfigDispatcherServletInitializer并將其部署到Servlet3.0容器的時(shí)候,容器會(huì)自動(dòng)發(fā)現(xiàn)它,并用它來(lái)配置Servlet上下文。
意思就是容器會(huì)自動(dòng)發(fā)現(xiàn)繼承了AbstractAnnotationConfigDispatcherServletInitializer的子類,并用它來(lái)配置servlet上下文。(用來(lái)代替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過(guò)濾器 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[]{"/"};
}
//注冊(cè)編碼過(guò)濾器
@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")
//開(kāi)啟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ù),可通過(guò)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寫(xiě):
<?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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
仿釘釘流程輕松實(shí)現(xiàn)JSON轉(zhuǎn)BPMN完整實(shí)現(xiàn)過(guò)程示例
這篇文章主要為大家介紹了仿釘釘流程輕松實(shí)現(xiàn)JSON轉(zhuǎn)BPMN完整實(shí)現(xiàn)過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
java?Web實(shí)現(xiàn)用戶登錄功能圖文教程
這篇文章主要給大家介紹了關(guān)于java?Web實(shí)現(xiàn)用戶登錄功能的相關(guān)資料,在開(kāi)發(fā)Web應(yīng)用程序中,用戶登錄是一個(gè)常見(jiàn)的功能,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
java存儲(chǔ)以及java對(duì)象創(chuàng)建的流程(詳解)
下面小編就為大家?guī)?lái)一篇java存儲(chǔ)以及java對(duì)象創(chuàng)建的流程(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Spring循環(huán)依賴實(shí)現(xiàn)過(guò)程揭秘
這篇文章主要介紹了Spring循環(huán)依賴實(shí)現(xiàn)過(guò)程,Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對(duì)象的創(chuàng)建過(guò)程和依賴注入的方式2023-01-01
JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送
這篇文章主要為大家詳細(xì)介紹了JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
java實(shí)現(xiàn)掃雷游戲控制臺(tái)版
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)掃雷游戲控制臺(tái)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Eclipse如何導(dǎo)入Maven項(xiàng)目詳解(新手初學(xué))
這篇文章主要介紹了Eclipse如何導(dǎo)入Maven項(xiàng)目詳解(新手初學(xué)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

