> 技术文档 > Springboot整合springmvc

Springboot整合springmvc


Springmvc的自动解管理

中央转发器DispatcherServlet

控制器

视图解析器

静态资源访问

消息转换器

格式化

静态资源管理

中央转发器

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>

制器

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

​​​​​​​视图解析器自动管理

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();
}

​​​​​​​消息转换和格式化

格式化转换器的自动注册

​​​​​​​Springboot扩展springmvc

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

​​​​​​​容器中注册视图控制器(请求转发)

@Configuration
public class MyMVCCofnig implements WebMvcConfigurer{
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController(\"/tx\").setViewName(\"success\");
    }

}

​​​​​​​​​​​​​​注册格式化器

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

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new Formatter() {
        @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);
        }
    });
}

​​​​​​​消息转换器扩展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;

​​​​​​​拦截器注册

创建拦截器

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\");
}