您的位置:首页 > 编程语言 > Java开发

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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web开发 SpringBoot