1、返回json数据
springboot默认的是jackson-databind做为json处理器、也可以使用自定义转换器:gson、fastjson
gson集成方式为:在pom文件中排除jackson-databind jar包,添加gson包。
org.springframework.boot spring-boot-starter-web com.fasterxml.jackson.core jackson-databind dependency>
com.google.code.gson gson
springboot默认提供了Gson自动转换类GsonHttpMessageConvertersConfiguration,因此Gson依赖添加成功后,可以像使用json-databind那样使用Gson。但是如果想格式化日期等操作得需要自己自定义。
@Configuration public class GsonConfig { @Bean GsonHttpMessageConverter gsonHttpMessageConverter() { GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(); GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("yyyy-MM-dd"); builder.excludeFieldsWithModifiers(Modifier.PROTECTED); Gson gson = builder.create(); gsonHttpMessageConverter.setGson(gson); return gsonHttpMessageConverter; } }
fastJson集成方式:在pom文件中排除jackson-databind jar包,添加fastjson
org.springframework.boot spring-boot-starter-web com.fasterxml.jackson.core jackson-databind com.alibaba fastjson 1.2.56
配置fastjson的HttpMessageConverter
@Configuration public class MyFastJsonConfig { @Bean FastJsonHttpMessageConverter fastJsonHttpMessageConverter() { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM-dd"); config.setCharset(Charset.forName("UTF-8")); config.setSerializerFeatures( SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty ); converter.setFastJsonConfig(config); return converter; } }
对于FastJsonHttpMessageConverter的配置,还有另一种方式。实现WevMvcConfigurer接口(spring5.0之前继承WebMvcConfigurerAdapter类来实现)
@Configuration public class MyWebMvcConfig implements WebMvcConfigurer { //处理json @Override public void configureMessageConverters(List
> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM-dd"); config.setCharset(Charset.forName("UTF-8")); config.setSerializerFeatures( SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty ); converter.setFastJsonConfig(config); converters.add(converter); } //自定义静态资源位置 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } }
2、静态资源访问
springboot默认会过滤所有的静态资源,默认静态资源5个位置(classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/、/),优先级依次降低。
自定义过滤策略:1)、可以在application.properties直接定义过滤规则
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static
2)、java编码实现
@Configuration public class MyWebMvcConfig implements WebMvcConfigurer { //处理json @Override public void configureMessageConverters(List
> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM-dd"); config.setCharset(Charset.forName("UTF-8")); config.setSerializerFeatures( SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty ); converter.setFastJsonConfig(config); converters.add(converter); } //自定义静态资源位置 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } }
3、文件上传
文件上传一共涉及两个组件,一个是CommonsMultipartResolver基于commons-fileupload来处理,另一个是StandardServletMultipartResolver基于serlver3.0multipart 。springboot默认采用的是StandardServletMultipartResolver做为上传组件。
如果想使用CommonsMultipartResolver做为上传组件代码如下:
pom文件需要加入common jar包
commons-io
commons-io
1.4
commons-fileupload
commons-fileupload
1.3.1
@Configuration public class MyCommonsMultipartResolver { @Bean public CommonsMultipartResolver commonsMultipartResolver() { CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); commonsMultipartResolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常 commonsMultipartResolver.setMaxUploadSize(1024); commonsMultipartResolver.setDefaultEncoding("UTF-8"); return commonsMultipartResolver; } }
4、全局异常处理
关键字@ControllerAdvice
1)、返回resonse代码如下,上传文件大小超过限制就会输出到页面。
@ControllerAdvice public class CustomerExceptionHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp) throws IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); out.write("上传文件大小超限"); out.flush(); out.close(); } }
2)、返回ModelAndView
@ControllerAdvice public class CustomerExceptionHtmlHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) public ModelAndView uploadException(MaxUploadSizeExceededException e) throws IOException { ModelAndView view = new ModelAndView(); view.addObject("msg","上传文件超限"); view.setViewName("/error"); return view; } }
@ControllerAdvice还可以配置全局参数,具体代码如下
@ControllerAdvice public class GlobalConfig { @ModelAttribute(value = "info") public Map
userInfo() { Map map = new HashMap<>(); map.put("usename","路遥"); map.put("gender","男"); return map; } } @RestController public class GlobalController { @GetMapping("/global") public void globalParma(Model model) { Map
map = model.asMap(); Set strings = map.keySet(); Iterator iterator = strings.iterator(); while (iterator.hasNext()) { String next = iterator.next(); Object o = map.get(next); System.out.println(next + ">>>>>>" + o); } } }
以上所有代码都在:https://github.com/FadeHub/spring-boot-learn 下面的spring-boot-web工程下