原理先不瞭解,只記錄經常使用方法css
用法:html
@EnableWebMvcjava
開啓MVC配置,至關於git
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven/> </beans>
Conversion and Formattingweb
配置convert和formatter的方法有兩種,分別使用ConverterRegistry和FormatterRegistry ajax
使用註冊工廠spring
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterRegistry; import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; @Configuration public class MyConverterRegistry { @Autowired private ConverterRegistry converterRegistry; @PostConstruct public void init() { converterRegistry.addConverter(new StringToListConvert()); } private static class StringToListConvert implements Converter<String, List<String>> { @Override public List<String> convert(String source) { if (source == null) { return Arrays.asList(); } else { String[] split = source.split(","); return Arrays.asList(split); } } } }
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.format.Formatter; import org.springframework.format.FormatterRegistry; import javax.annotation.PostConstruct; import java.text.ParseException; import java.util.List; import java.util.Locale; @Configuration public class MyFormatterRegistry { @Autowired private FormatterRegistry formatterRegistry; @PostConstruct public void init() { formatterRegistry.addFormatter(new StringDateFormatter()); } public static class StringDateFormatter implements Formatter<List> { //解析接口,根據Locale信息解析字符串到T類型的對象; @Override public List parse(String text, Locale locale) throws ParseException { return null; } //格式化顯示接口,將T類型的對象根據Locale信息以某種格式進行打印顯示(即返回字符串形式); @Override public String print(List object, Locale locale) { return "我是格式化的日期"; } } }
WebMvcConfigurerAdapterjson
import com.lf.web.convert.StringToListConvert; import com.lf.web.formatter.StringDateFormatter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan//組件掃描 public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addFormatters(FormatterRegistry registry) { super.addFormatters(registry); registry.addFormatter(new StringDateFormatter()); registry.addConverter(new StringToListConvert()); } }
使用XML配置segmentfault
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.web.convert.StringToListConvert"/> </set> </property> <property name="formatters"> <set> <bean class="com.web.formatter.StringDateFormatter"/> </set> </property> <property name="formatterRegistrars"> <set> <bean class="com.web.formatter.StringDateFormatter"/> </set> </property> </bean> </beans>
Interceptorsapi
攔截器的實現
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyHandlerInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("===========HandlerInterceptor1 preHandle"); return super.preHandle(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); System.out.println("===========HandlerInterceptor1 postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { super.afterCompletion(request, response, handler, ex); System.out.println("===========HandlerInterceptor1 afterCompletion"); } }
XML配置
<bean id="handlerInterceptor1" class="com.lf.web.MyHandlerInterceptor"/> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="handlerInterceptor1"/> <ref bean="handlerInterceptor2"/> </list> </property> </bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/admin/**"/> <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/secure/*"/> <bean class="org.example.SecurityInterceptor"/> </mvc:interceptor> </mvc:interceptors>
使用Java配置
import com.lf.web.convert.StringToListConvert; import com.lf.web.formatter.StringDateFormatter; import com.lf.web.interceptor.MyHandlerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan//組件掃描 public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/").excludePathPatterns("/admin"); } }
ConfigureContentNegotiation
ContentNegotiatingViewResolver是ViewResolver使用所請求的媒體類型的一個實現(基於文件類型擴展,輸出格式URL參數指定類型或接受報頭)來選擇一個合適的視圖一個請求。ContentNegotiatingViewResolver自己並不解決視圖,只不表示爲其餘的ViewResolver,您能夠配置來處理特定的視圖(XML,JSON,PDF,XLS,HTML,..)。
@Configuration @EnableWebMvc @ComponentScan//組件掃描 public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.mediaType("json", MediaType.APPLICATION_JSON); } }
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="mediaTypes"> <value> json=application/json xml=application/xml </value> </property> </bean>
View
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("home"); } }
<mvc:view-controller path="/" view-name="home"/>
View Resolvers
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.enableContentNegotiation(new MappingJackson2JsonView()); registry.jsp(); } }
<mvc:view-resolvers> <mvc:content-negotiation> <mvc:default-views> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> </mvc:default-views> </mvc:content-negotiation> <mvc:jsp/> </mvc:view-resolvers>
Resources
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/"); } }
<mvc:resources mapping="/resources/**" location="/public-resources/"/>
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
<mvc:default-servlet-handler/>
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable("myCustomDefaultServlet"); } }
Path Matching
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer .setUseSuffixPatternMatch(true) .setUseTrailingSlashMatch(false) .setUseRegisteredSuffixPatternMatch(true) .setPathMatcher(antPathMatcher()) .setUrlPathHelper(urlPathHelper()); } @Bean public UrlPathHelper urlPathHelper() { //... } @Bean public PathMatcher antPathMatcher() { //... } }
Message Converters
@Configuration @EnableWebMvc public class WebConfiguration extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() .indentOutput(true) .dateFormat(new SimpleDateFormat("yyyy-MM-dd")) .modulesToInstall(new ParameterNamesModule()); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); converters.add(new MappingJackson2XmlHttpMessageConverter(builder.xml().build())); } }
以上示例代碼:https://gitee.com/jim.zhan/SpringLearning
下面是基於零配置的項目示例:
一、建立一個動態Web項目(無需web.xml)
二、右鍵項目添加幾個package: com.easyweb.config(保存項目配置)、com.easyweb.controller(保存Spring MVC Controller)
三、在com.easyweb.config新建一個類WebApplicationStartup,這個類實現WebApplicationInitializer接口,是項目的入口,做用相似於web.xml,具體代碼以下:
import javax.servlet.MultipartConfigElement; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; /** * 服務器啓動入口類 * * @author Administrator * */ public class WebApplicationStartup implements WebApplicationInitializer { private static final String SERVLET_NAME = Spring-mvc; private static final long MAX_FILE_UPLOAD_SIZE = 1024 * 1024 * 5; // 5 Mb private static final int FILE_SIZE_THRESHOLD = 1024 * 1024; // After 1Mb private static final long MAX_REQUEST_SIZE = -1L; // No request size limit /** * 服務器啓動調用此方法,在這裏能夠作配置 做用與web.xml相同 */ @Override public void onStartup(ServletContext servletContext) throws ServletException { // 註冊springMvc的servlet this.addServlet(servletContext); // 註冊過濾器 // servletContext.addFilter(arg0, arg1) // 註冊監聽器 // servletContext.addListener(arg0); } /** * 註冊Spring servlet * * @param servletContext */ private void addServlet(ServletContext servletContext) { // 構建一個application context AnnotationConfigWebApplicationContext webContext = createWebContext(SpringMVC.class, ViewConfiguration.class); // 註冊spring mvc 的 servlet Dynamic dynamic = servletContext.addServlet(SERVLET_NAME, new DispatcherServlet(webContext)); // 添加springMVC 容許訪問的Controller後綴 dynamic.addMapping(*.html, *.ajax, *.css, *.js, *.gif, *.jpg, *.png); // 所有經過請用 「/」 // dynamic.addMapping(/); dynamic.setLoadOnStartup(1); dynamic.setMultipartConfig(new MultipartConfigElement(null, MAX_FILE_UPLOAD_SIZE, MAX_REQUEST_SIZE, FILE_SIZE_THRESHOLD)); } /** * 經過自定義的配置類來實例化一個Web Application Context * * @param annotatedClasses * @return */ private AnnotationConfigWebApplicationContext createWebContext(Class<!--?-->... annotatedClasses) { AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext(); webContext.register(annotatedClasses); return webContext; } }
四、在com.easyweb.config下添加類SpringMVC繼承WebMvcConfigurerAdapter,這個類的做用是進行SpringMVC的一些配置,代碼以下:
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableWebMvc //指明controller所在的包名 @ComponentScan(basePackages = {com.easyweb.controller}) public class SpringMVC extends WebMvcConfigurerAdapter { /** * 非必須 */ @Override public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { configurer.enable(); } /** * 若是項目的一些資源文件放在/WEB-INF/resources/下面 * 在瀏覽器訪問的地址就是相似:https://host:port/projectName/WEB-INF/resources/xxx.css * 可是加了以下定義以後就能夠這樣訪問: * https://host:port/projectName/resources/xxx.css * 非必須 */ @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**/*").addResourceLocations("/WEB-INF/resources/"); } }
五、添加View配置文件com.easyweb.config下新建類ViewConfiguration,裏面能夠根據本身的須要定義視圖攔截器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.UrlBasedViewResolver; import org.springframework.web.servlet.view.tiles2.TilesConfigurer; import org.springframework.web.servlet.view.tiles2.TilesView; @Configuration public class ViewConfiguration { @Bean public ViewResolver urlBasedViewResolver() { UrlBasedViewResolver viewResolver; viewResolver = new UrlBasedViewResolver(); viewResolver.setOrder(2); viewResolver.setPrefix(/WEB-INF/); viewResolver.setSuffix(.jsp); viewResolver.setViewClass(JstlView.class); // for debug envirment viewResolver.setCache(false); return viewResolver; } @Bean public ViewResolver tilesViewResolver() { UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver(); urlBasedViewResolver.setOrder(1); urlBasedViewResolver.setViewClass(TilesView.class); //urlBasedViewResolver. return urlBasedViewResolver; } @Bean public TilesConfigurer tilesConfigurer() { TilesConfigurer tilesConfigurer = new TilesConfigurer(); tilesConfigurer.setDefinitions(new String[] { classpath:tiles.xml }); return tilesConfigurer; } }
參考:
http://blog.csdn.net/L_Sail/article/details/71436392(以上大部份內容轉自此篇文章)
https://www.2cto.com/kf/201508/432280.html
https://segmentfault.com/a/1190000004343063?_ea=575820(以上小部份內容轉自此篇文章)