SpringBoot学习(四)——WEB开发
2017-10-06 02:13
579 查看
一.WEB开发支持
SpringBoot提供了spring-boot-starter-web为web开发予以支持。而spring-boot-starter-web嵌入了Tomcat及SpringMVC的依赖。查看org.springframework.boot.autoconfigure.web包,其中:ServerPropertiesAutoConfiguration与ServerProperties自动配置内嵌servlet容器 HttpEncodingAutoConfiguration与HttpEncodingProperties用来自动配置http编码 JacksonHttpMessageConvertersConfiguration用于配置mappingJackson2HttpMessageConverterConfiguration与mappingJackson2XmlHttpMessageConverterConfiguration WebMvcAutoConfiguration与WebMvcProperties用于配置SpringMVC
二.WEB相关配置
1.SpringMVC自动配置
Spring Boot为Spring MVC提供的auto-configuration适用于大多数应用,并在Spring默认功能上添加了以下特性:[b]1). 引入 ContentNegotiatingViewResolver 和 BeanNameViewResolver[/b]
beans(查看WebMvcAutoConfiguration类)。
[b]2). 对静态资源的支持,包括对WebJars的支持。[/b]
①对静态资源的支持
Spring Boot 默认配置的/映射到/static(或/public ,/resources,/META-INF/resources),/webjars/会映射到classpath:/META-INF/resources/webjars/。
注意:上面的目录都是相对classpath:下面。
以下时默认配置:
#该值只能有一个值,不像大多数可以配置多个用逗号隔开的。 spring.mvc.static-path-pattern=/** # Path pattern used for static resources. spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ # Locations of static resources.
如果想增加如/mystatic/**映射到classpath:/mystatic/,可以让配置类继承WebMvcConfigurerAdapter,然后重写如下方法:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/mystatic/**").addResourceLocations("classpath:/mystatic/"); }
这种方式会在默认的基础上增加/mystatic/**映射到classpath:/mystatic/,不会影响默认的方式,可以同时使用。
②对WebJars的支持
Web前端使用了越来越多的JS或CSS,如jQuery, 和Bootstrap等。一般情况下,我们是将这些Web资源拷贝到Java的目录下,通过手工进行管理,这种通方式容易导致文件混乱、版本不一致等问题。
WebJars是将这些通用的Web前端资源打包成Java的Jar包,然后借助Maven工具对其管理,保证这些Web资源版本唯一性,升级也比较容易。关于webjars资源,有一个专门的网站http://www.webjars.org/,我们可以到这个网站上找到自己需要的资源,在自己的工程中添加入maven依赖,即可直接使用这些资源了。
以下是引入jquery的例子,在pom文件中添加相关依赖
<dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>1.11.3</version> </dependency>
查看引入的jar包的目录结构
通过访问路径”localhost:8080/webjars/jquery/1.11.3/jquery.min.js”可以查看引入的jquery.min.js文件
[b]3). 自动注册 Converter , GenericConverter , Formatter beans。[/b]
[b]4). 对 HttpMessageConverters 的支持。[/b]
①自动配置
在WebMvcAutoConfiguration类中的内部类WebMvcAutoConfigurationAdapter有字段messageConverters(HttpMessageConverters类型),而该对象(即messageConverters)在HttpMessageConvertersAutoConfiguration类中定义(其中添加了@ConditionalOnMissingBean注解)
②使用Spring Boot的 HttpMessageConverters 类添加或自定义转换类:
import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.*; import org.springframework.http.converter.*; @Configuration public class MyConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = ... HttpMessageConverter<?> another = ... return new HttpMessageConverters(additional, another); } }
上下文中出现的所有 HttpMessageConverter bean都将添加到converters列表,
③通过配置类继承WebMvcConfigurerAdapter后重写configureMessageConverters方法:
@Component public class Config extends WebMvcConfigurerAdapter{ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8")); super.configureMessageConverters(converters); } }
方式②、方式③会覆盖默认的转换器列表(converters)。
[b]5). 自动注册 MessageCodeResolver 。[/b]
[b]6). 对静态 index.html 的支持。[/b]
默认的欢迎页面检测将切换到您的自定义位置(默认是spring.resources.static-locations),因此,如果您在启动时的任何位置都有一个index.html,它将是应用程序的主页。
[b]7). 对自定义 Favicon 的支持。[/b]
[b]8). 自动使用 ConfigurableWebBindingInitializer bean。[/b]
2.添加Servlets, Filters和listeners
[b]1).通过@Bean注解添加[/b]想要添加 Servlet , Filter 或Listener ,只需要为它提供一个 @Bean 定义,案例如下:
@Bean public TestServlet createTestServlet(){ return new TestServlet(); } @Bean public TestFilter createTestFilter(){ return new TestFilter(); } @Bean public TestListener createTestListener(){ return new TestListener(); } @Bean public ServletRegistrationBean addServlet(TestServlet testServlet){ //参数一:需要注册的Servlet //参数二:Servlet的拦截路径 ServletRegistrationBean registrationBean = new ServletRegistrationBean(testServlet,"/test"); registrationBean.setEnabled(false); return registrationBean; } @Bean public FilterRegistrationBean addFilter(TestFilter testFilter){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(testFilter); return registrationBean; } @Bean public ServletListenerRegistrationBean<EventListener> addRequestListener(TestListener testListener){ ServletListenerRegistrationBean<EventListener> listener = new ServletListenerRegistrationBean<EventListener>(new TestListener()); return listener; }
[b]2).扫描注解的方式[/b]
通过把 @ServletComponentScan 注解到一个 @Configuration 类并指定包含要注册组件的package(s),可以将@WebServlet,@WebFilter和@WebListener 注解的类自动注册到内嵌servlet容器。默认情况下,@ServletComponentScan将从被注解类的package开始扫描。
[b]3).禁止Servlet或Filter的注册[/b]
任何 Servlet 或 Filter beans都将自动注册到servlet容器。不过,为特定的 Filter 或 Servlet bean创建一个registration,并将它标记为disabled,可以禁用该filter或servlet。例如:
@Bean public ServletRegistrationBean addServlet(TestServlet testServlet){ ServletRegistrationBean registrationBean = new ServletRegistrationBean(testServlet); registrationBean.setEnabled(false); return registrationBean; }
3.SpringMVC添加拦截器
拦截器的功能跟过滤器类似,但是提供更精细的的控制能力:preHandle方法在调用处理程序之前;
postHandle方法在处理程序之后,呈现视图之前;
afterCompletion在完成呈现视图之后将调用处理程序执行的任何结果,从而允许正确的资源清理。
我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
添加拦截器只需要2步:
1).创建拦截器类实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("拦截器MyInterceptor的preHandle方法"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("拦截器MyInterceptor的postHandle方法"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("拦截器MyInterceptor的afterCompletion方法"); } }
2).创建一个Java配置类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
@Component public class Config extends WebMvcConfigurerAdapter{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*").excludePathPatterns("/properties"); } }
相关文章推荐
- spring boot框架学习9-spring boot的web开发(5)-错误解决及跳转页面
- spring boot框架学习9-spring boot的web开发(5)-错误解决及跳转页面
- spring boot框架学习5-spring boot的web开发(1)
- spring boot框架学习8-【干货】spring boot的web开发(4)-自定义拦截器处理权限
- spring boot框架学习7-spring boot的web开发(3)-自定义消息转换器
- spring boot框架学习6-spring boot的web开发(2)
- spring boot框架学习8-【干货】spring boot的web开发(4)-自定义拦截器处理权限
- spring boot框架学习5-spring boot的web开发(1)
- spring boot框架学习6-spring boot的web开发(2)
- spring boot框架学习6-spring boot的web开发(2)
- spring boot框架学习6-spring boot的web开发(2)
- spring boot框架学习7-spring boot的web开发(3)-自定义消息转换器
- spring boot框架学习7-spring boot的web开发(3)-自定义消息转换器
- spring boot框架学习8-【干货】spring boot的web开发(4)-自定义拦截器处理权限
- SpringBoot学习笔记 - web开发(Thymeleaf的应用)
- Spring Boot学习——Spring Boot配置文件application
- SpringBoot学习——@Autowired自动注入报:could not be found问题的理解和解决方案
- Spring Boot实战学习笔记5
- SpringBoot学习 —— 外部配置
- Spring Boot学习之旅:(十四)整合hibernate