Springboot整合springMVC

官方文档:

Spring Boot Reference Guide

学习springmvc和springboot的自动配置我们必须对springmvc的组件足够了解,起码知道怎么用。Springmvc的组件基本都被springboot来做了自动的配置。

一.Springmvc的自动解管理

中央转发器(DispatcherServlet

控制器

视图解析器

静态资源访问

消息转换器

格式化

静态资源管理

1.中央转发器

Xml无需配置

<servlet>
    <servlet-name>chapter2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>chapter2</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

中央转发器被springboot自动接管,不再需要我们在web.xml中配置,我们现在的项目也不是web项目,也不存在web.xml,

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\

在spring boot中,我们默认无需配置,系统会自动装配一个,感兴趣的可以看下源码

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,里面有个 DispatcherServletRegistrationBean,关键是这里只能指定一个path,如下的源码截图

2.控制器

控制器Controller在springboot的注解扫描范围内自动管理。

3.视图解析器自动管理

Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

ContentNegotiatingViewResolver:组合所有的视图解析器的;

曾经的配置文件无需再配

<bean id="de" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value="*.jsp"></property>
</bean>

源码:

public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
    ContentNegotiatingViewResolver resolver =
new ContentNegotiatingViewResolver();
 resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.
class));
    resolver.setOrder(-
2147483648);
   
return resolver;
}

当我们做文件上传的时候我们也会发现multipartResolver是自动被配置好的
页面

<form action="/upload" method="post" enctype="multipart/form-data">
    <input name="pic" type="file">
    <input type="submit">
</form>

Controller

@ResponseBody
@RequestMapping
("/upload")
public String upload(@RequestParam("pic")MultipartFile file, HttpServletRequest request){
    String contentType = file.getContentType();
    String fileName = file.getOriginalFilename();
   
/*System.out.println("fileName-->" + fileName);
    System.out.println("getContentType-->" + contentType);*/
    //String filePath = request.getSession().getServletContext().getRealPath("imgupload/");
   
String filePath = "D:/imgup/";
   
try {
       
this.uploadFile(file.getBytes(), filePath, fileName);
    }
catch (Exception e) {
       
// TODO: handle exception
   
}

   
return "success";
}



public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
    File targetFile =
new File(filePath);
   
if(!targetFile.exists()){
        targetFile.mkdirs();
    }
    FileOutputStream out =
new FileOutputStream(filePath+fileName);
    out.write(file);
    out.flush();
    out.close();
}

文件上传大小可以通过配置来修改
打开application.properties, 默认限制是10MB,我们可以任意修改、

4.静态资源访问

5.消息转换和格式化

Springboot自动配置了消息转换器

格式化转换器的自动注册

时间类型我们可以在这里修改

在配置文件中指定好时间的模式我们就可以输入了

6.欢迎页面的自动配置

Springboot自动指定resources下的index.html

二.Springboot扩展springmvc

在实际开发中springboot并非完全自动化,很多跟业务相关我们需要自己扩展,springboot给我提供了接口。

我们可以来通过实现WebMvcConfigurer接口来扩展

ps:这个WebMvcConfigurer接口是自带的,我们要做的是继承这个接口并重写拓展里面的某个方法

public interface WebMvcConfigurer {
   
default void configurePathMatch(PathMatchConfigurer configurer) {
    }

   
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }

   
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }

   
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }

   
default void addFormatters(FormatterRegistry registry) {
    }

   
default void addInterceptors(InterceptorRegistry registry) {
    }

   
default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }

   
default void addCorsMappings(CorsRegistry registry) {
    }

   
default void addViewControllers(ViewControllerRegistry registry) {
    }

   
default void configureViewResolvers(ViewResolverRegistry registry) {
    }

   
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }

   
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }

   
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

   
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

   
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }

   
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }

    @Nullable
   
default Validator getValidator() {
       
return null;
    }

    @Nullable
   
default MessageCodesResolver getMessageCodesResolver() {
       
return null;
    }
}

1.在容器中注册视图控制器(请求转发)

创建一个MyMVCCofnig实现WebMvcConfigurer接口,实现一下addViewControllers方法,我们完成通过/tx访问,转发到success.html的工作

@Configuration
public class MyMVCCofnig implements WebMvcConfigurer{


   
@Override
   
public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController(
"/tx").setViewName("success");
    }

2.注册格式化器

用来可以对请求过来的日期格式化的字符串来做定制化。当然通过application.properties配置也可以办到。

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(
new Formatter<Date>() {
       
@Override
       
public String print(Date date, Locale locale) {
           
return null;
        }
       
@Override
       
public Date parse(String s, Locale locale) throws ParseException {
           
return new SimpleDateFormat("yyyy-MM-dd").parse(s);
        }
    });
}

3.消息转换器扩展fastjson

在pom.xml中引入fastjson

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.47</version>
</dependency>

配置消息转换器,添加fastjson

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    FastJsonHttpMessageConverter fc =
new FastJsonHttpMessageConverter();
    FastJsonConfig fastJsonConfig =
new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.
PrettyFormat);
    fc.setFastJsonConfig(fastJsonConfig);
    converters.add(fc);
}

在实体类上可以继续控制

public class User

{



    private  String username;



    private  String password;



    private int age;



    private int score;



    private int gender;



    @JSONField(format = "yyyy-MM-dd")

    private Date date;

4.拦截器注册

创建拦截器

public class MyInterceptor implements HandlerInterceptor {
   
@Override
   
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.
out.println("前置拦截");
       
return true;
    }
   
@Override
   
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.
out.println("后置拦截");
    }
   
@Override
   
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.
out.println("最终拦截");
    }
}

拦截器注册

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(
new MyInterceptor())
            .addPathPatterns(
"/**")
            .excludePathPatterns(
"/hello2");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值