最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中MVC的自動配置詳解

 更新時間:2023年09月09日 09:07:28   作者:果子爸聊技術(shù)  
這篇文章主要介紹了SpringBoot中MVC的自動配置詳解,在實(shí)際開發(fā)過程中,還有一些老的系統(tǒng)在使用xml格式來傳輸數(shù)據(jù),SpringBoot也提供了xml格式數(shù)據(jù)的返回,只需要小小的改動,就可以實(shí)現(xiàn),需要的朋友可以參考下

SpringBoot中MVC的自動配置詳解

一個簡單的例子

public class MvcModel {
    private String modelName;
    private Integer modelType;
    /**省略geter、setter方法**/
}
@RestController
@EnableAutoConfiguration
public class SpringMvcGuide {
    @RequestMapping("/getModel")
    public MvcModel getMvcModel(){
        MvcModel mvcModel = new MvcModel();
        mvcModel.setModelName("小明");
        mvcModel.setModelType(1);
        return mvcModel;
    }
    public static void main(String[] args){
        SpringApplication.run(SpringMvcGuide.class,args);
    }
}

啟動服務(wù),訪問//localhost:8080/getModel可以看到頁面顯示

{"modelName":"小明","modelType":1}

頁面上展示會將MvcModel對象轉(zhuǎn)換成json字符串,這是我們最常用的格式,后臺統(tǒng)一返回json格式,前臺接收到j(luò)son格式后進(jìn)行解析

在實(shí)際開發(fā)過程中,還有一些老的系統(tǒng)在使用xml格式來傳輸數(shù)據(jù),SpringBoot也提供了xml格式數(shù)據(jù)的返回,只需要小小的改動,就可以實(shí)現(xiàn)

增加依賴

compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.2'
compile 'org.glassfish.jaxb:jaxb-runtime:2.3.3'

將實(shí)體類打上@XmlRootElement注解

@XmlRootElement
public class MvcModel {
    private String modelName;
    private Integer modelType;
    /**省略geter、setter方法**/
}

重新啟動項(xiàng)目,訪問//localhost:8080/getModel可以看到頁面顯示

<MvcModel>
<modelName>小明</modelName>
<modelType>1</modelType>
</MvcModel>

從上面的例子可以看出來,想返回xml格式的數(shù)據(jù)只需要引入相應(yīng)的jar包就行了,無需修改任何配置

Spring MVC自動配置

SpringBoot為SpringMVC提供了自動配置,除了SpringMVC默認(rèn)的配置外還提供了以下配置:

  • 引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。
  • 對靜態(tài)資源的支持,包括對WebJars的支持
  • 自動注冊Converter,GenericConverter,F(xiàn)ormatter beans。
  • 對HttpMessageConverters的支持。
  • 自動注冊MessageCodeResolver。
  • 對靜態(tài)index.html的支持。
  • 對自定義Favicon的支持。
  • 自動使用ConfigurableWebBindingInitializer bean。

如果你想保留SpringBoot MVC的特性,只需要增加相應(yīng)的MVC配置(如攔截器、格式化處理器、視圖控制器),如果你想全面的控制Spring MVC,也可以實(shí)現(xiàn)自己的配置,并使用@EnableWebMvc注解

HttpMessageConverters

Spring MVC使用HttpMessageConverter來轉(zhuǎn)換HTTP請求和響應(yīng)中的數(shù)據(jù),比如對象自動轉(zhuǎn)換成JSON或XML對象,這些轉(zhuǎn)換的處理類都是SpringBoot默認(rèn)都配置好了,你不需要做任何配置就可以實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)換,當(dāng)然也提供了自定義HttpMessageConverters的方法,上下文中出現(xiàn)的所有HttpMessageConverter bean都會被添加到converter列表,你可以通過這種方式來覆蓋默認(rèn)的轉(zhuǎn)換器列表。下面通過一個例子來演示一下如何自定義HttpMessageConverter

默認(rèn)轉(zhuǎn)換json的轉(zhuǎn)換器是使用的jackson,我們先來看看默認(rèn)的例子

@RestController
@SpringBootApplication
public class SpringMvcGuide {
    @RequestMapping("/getStudent")
    public Student getStudent(){
        Student stu = new Student();
        stu.setName("小明");
        return stu;
    }
    public static void main(String[] args){
        SpringApplication.run(SpringMvcGuide.class,args);
    }
}
public class Student {
    private String name;
    private int age;
    private String address;
    /** 省略getter、setter方法 **/
}

啟動程序,訪問//localhost:8080/getStudent ,頁面顯示

{"name":"小明","age":0,"address":null}

可以看到Student對象被轉(zhuǎn)換成json字符串,age默認(rèn)值為0,address默認(rèn)為null

下面我們替換成fastjson,并且String類型的默認(rèn)值為空字符串

首先引入依賴

compile 'com.alibaba:fastjson:1.2.58'

添加HttpMessageConverter配置類

@Configuration
public class HttpMessageConverterConfig {
    @Bean
    public HttpMessageConverter fastJsonHttpMessageConverter(){
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        SerializerFeature[] serializerFeatures = new SerializerFeature[]{
                SerializerFeature.QuoteFieldNames,//輸出Key是否包含雙引號
                SerializerFeature.WriteMapNullValue,//是否輸出為null的字段,若為null則顯示該字段
                SerializerFeature.WriteNullNumberAsZero,//數(shù)字若為null,輸出0
                SerializerFeature.WriteNullListAsEmpty, //list為null,輸出[]
                SerializerFeature.WriteNullStringAsEmpty,//String為null,輸出""
                SerializerFeature.WriteNullBooleanAsFalse,//boolean為null,輸出false
                SerializerFeature.WriteDateUseDateFormat,//Date的日期轉(zhuǎn)換器
                SerializerFeature.DisableCircularReferenceDetect //循環(huán)引用
        };
        fastJsonConfig.setSerializerFeatures(serializerFeatures);
        fastJsonConfig.setCharset(Charset.forName("UTF-8"));
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        List<MediaType> mediaTypeList = new ArrayList<MediaType>();
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypeList);
        return fastJsonHttpMessageConverter;
    }
}

重新啟動程序,訪問//localhost:8080/getStudent,頁面顯示

{"address":"","age":0,"name":"小明"}

可以看到address默認(rèn)值已經(jīng)變成空字符串,說明我們引入的fastjson生效了

自定義Json序列化和反序列化

如果你使用Jackson來序列化和反序列化json數(shù)據(jù),你可能需要寫自己的JsonSerializer和JsonDeserializer類,自定義序列化器通常通過Module注冊到Jackson,但SpringBoot提供了@JsonComponent注解能輕松的將序列化器注冊為Spring Bean

您可以直接在JsonSerializer、JsonDeserializer或KeyDeserializer實(shí)現(xiàn)上使用@JsonComponent注釋。還可以在包含序列化器/反序列化器的內(nèi)部類上使用它,如下面的示例所示

@JsonComponent
public class Example {
    public static class Serializer extends JsonSerializer<SomeObject> {
        // ...
    }
    public static class Deserializer extends JsonDeserializer<SomeObject> {
        // ...
    }
}

ApplicationContext中的所有@JsonComponent bean都會自動注冊到Jackson中。 因?yàn)锧JsonComponent是用@Component進(jìn)行元注釋的,所以通常的組件掃描規(guī)則也適用。

Spring Boot還提供了JsonObjectSerializer和JsonObjectDeserializer基類,在序列化對象時為標(biāo)準(zhǔn)Jackson版本提供了有用的替代方案。詳情可以自行查閱JsonObjectSerializer和JsonObjectDeserializer,這里不再展開

靜態(tài)內(nèi)容

默認(rèn)情況下,Spring Boot從類路徑中的/static(/public,/resources,/META-INF/resources)目錄或ServletContext的根目錄中提供靜態(tài)內(nèi)容。它是使用Spring MVC中的ResourceHttpRequestHandler來實(shí)現(xiàn)的, 這樣你就可以通過添加自己的WebMvcConfigurer和覆蓋addResourceHandlers方法來進(jìn)行自定義

在獨(dú)立的web應(yīng)用程序中,容器中的默認(rèn)servlet也被啟用,并充當(dāng)后備,如果Spring決定不處理ServletContext,則從ServletContext的根提供內(nèi)容。大多數(shù)情況下,這種情況不會發(fā)生(除非您修改了默認(rèn)的MVC配置),因?yàn)镾pring總是可以通過DispatcherServlet處理請求

默認(rèn)情況下,資源映射到/**上,但是您可以使用spring.mvc.static-path-pattern屬性來進(jìn)行調(diào)整。例如,將所有資源重新定位到/resources/**,可以通過如下配置實(shí)現(xiàn)

spring:
  mvc:
    static-path-pattern: "/resources/**"

還可以使用spring.web.resources來定制靜態(tài)資源位置,除了前面提到的靜態(tài)資源位置之外,Webjars內(nèi)容也是一個特殊情況,任何/webjars/**路徑的資源都是從jar文件中提供的,前提是它們是以webjars格式打包的

模板引擎

除了REST web服務(wù)之外,還可以使用Spring MVC來提供動態(tài)HTML內(nèi)容。Spring MVC支持多種模板技術(shù) (包括Thymeleaf、FreeMarker和jsp), 此外,許多其他模板引擎也包含它們自己的Spring MVC集成。

Spring Boot支持以下模板引擎的自動配置:

  • FreeMarker
  • Groovy
  • Thymeleaf
  • Mustache

當(dāng)您使用上述模板引擎之一時,將會自動從src/main/resources/templates目錄下獲取模板

異常/錯誤的處理

默認(rèn)情況下,Spring Boot提供了一個/error映射,它以一種合理的方式處理所有錯誤,并在servlet容器中注冊為一個“全局”錯誤頁面。對于機(jī)器客戶端來說,它生成一個JSON響應(yīng),其中包含錯誤、HTTP狀態(tài)和異常消息的詳細(xì)信息。對于瀏覽器客戶端,有一個“whitelabel”錯誤視圖,它以HTML格式呈現(xiàn)相同的數(shù)據(jù)

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Mar 03 22:46:49 CST 2021
There was an unexpected error (type=Not Found, status=404).

對于返回json格式的請求來說,可以定義一個帶@ControllerAdvice注釋的類,來處理特定的Controller異常信息,如下面的示例所示

@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {
    @ExceptionHandler(YourException.class)
    @ResponseBody
    ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
        HttpStatus status = getStatus(request);
        return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
    }
    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        return HttpStatus.valueOf(statusCode);
    }
}

對于返回頁面的請求,我們一般會定制自己的異常頁面,例如404、500這些異常的狀態(tài)碼都會定位到對應(yīng)的頁面。

比如要對404定制一個html頁面,可以把頁面放到對應(yīng)的目錄下

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

再比如要對500定制一個FreeMarker頁面

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 500.ftlh
             +- <other templates>

對于更復(fù)雜的映射,您還可以自己實(shí)現(xiàn)ErrorViewResolver接口,如下面的示例所示:

public class MyErrorViewResolver implements ErrorViewResolver {
    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request,
            HttpStatus status, Map<String, Object> model) {
        // Use the request or status to optionally return a ModelAndView
        return ...
    }
}

你也可以使用Spring MVC的常規(guī)特性,比如@ExceptionHandler方法和@ControllerAdvice

跨域支持

跨源資源共享(CORS)是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,它允許您以靈活的方式指定哪種跨域請求得到授權(quán),而不是使用一些不太安全、功能不太強(qiáng)大的方法,如IFRAME或JSONP。

從4.2版開始,Spring MVC支持CORS。在Spring Boot應(yīng)用程序中使用帶有@CrossOrigin注釋的Controller方法不需要任何特定的配置。通過使用自定義的addcorsmapping (CorsRegistry)方法注冊WebMvcConfigurer bean,可以定義全局CORS配置,如下面的示例所示:

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**");
            }
        };
    }
}

到此這篇關(guān)于SpringBoot中MVC的自動配置詳解的文章就介紹到這了,更多相關(guān)MVC的自動配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中的JdbcTemplate詳細(xì)解析

    Spring中的JdbcTemplate詳細(xì)解析

    這篇文章主要介紹了Spring中的JdbcTemplate詳細(xì)解析,JdbcTemplate是Spring框架中提供的一個對象,是對原始繁瑣的Jdbc API對象的簡單封裝,Spring框架為我們提供了很多的操作模板類,需要的朋友可以參考下
    2024-01-01
  • mybatis如何實(shí)現(xiàn)saveOrUpdate

    mybatis如何實(shí)現(xiàn)saveOrUpdate

    這篇文章主要介紹了mybatis如何實(shí)現(xiàn)saveOrUpdate問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • @CacheEvict + redis實(shí)現(xiàn)批量刪除緩存

    @CacheEvict + redis實(shí)現(xiàn)批量刪除緩存

    這篇文章主要介紹了@CacheEvict + redis實(shí)現(xiàn)批量刪除緩存方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能

    Java聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能

    這篇文章主要為大家詳細(xì)介紹了Java簡易聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • Java常用命令匯總

    Java常用命令匯總

    這篇文章主要介紹了Java常用命令匯總,小編覺得挺不錯的,這里給大家分享下,供需要的朋友參考。
    2017-10-10
  • 微信js sdk invalid signature簽名錯誤問題的解決方法分析

    微信js sdk invalid signature簽名錯誤問題的解決方法分析

    這篇文章主要介紹了微信js sdk invalid signature簽名錯誤問題的解決方法,結(jié)合實(shí)例形式分析了微信簽名錯誤問題相關(guān)解決方法,需要的朋友可以參考下
    2019-04-04
  • 官方詳解HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)

    官方詳解HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)

    這篇文章主要為大家介紹了HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)的?官方詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • java實(shí)現(xiàn)對map的字典序排序操作示例

    java實(shí)現(xiàn)對map的字典序排序操作示例

    這篇文章主要介紹了java實(shí)現(xiàn)對map的字典序排序操作,結(jié)合實(shí)例形式分析了java參照微信官網(wǎng)算法實(shí)現(xiàn)的字典序排序操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Java中double保留兩位小數(shù)的多種方法

    Java中double保留兩位小數(shù)的多種方法

    這篇文章主要給大家介紹了關(guān)于Java中double保留兩位小數(shù)的多種方法,對于double數(shù)據(jù)類型進(jìn)行計(jì)算發(fā)生的精度丟失的情況,可以按照自己的需求選擇任意方式,需要的朋友可以參考下
    2023-07-07
  • SpringBoot多Profile配置的實(shí)現(xiàn)示例

    SpringBoot多Profile配置的實(shí)現(xiàn)示例

    在實(shí)際開發(fā)中,我們常常需要根據(jù)不同環(huán)境配置不同的參數(shù),多Profile配置機(jī)制可以幫助我們按需加載配置文件,提升項(xiàng)目的可維護(hù)性和靈活性,感興趣的可以了解一下
    2025-08-08

最新評論

平原县| 双鸭山市| 凌云县| 麻江县| 克什克腾旗| 漳浦县| 杭锦后旗| 湄潭县| 澎湖县| 重庆市| 荥阳市| 白玉县| 合阳县| 西林县| 平南县| 攀枝花市| 西盟| 株洲市| 同仁县| 江川县| 板桥市| 商河县| 修水县| 炉霍县| 平邑县| 黎城县| 固始县| 泽普县| 南溪县| 余庆县| 克什克腾旗| 双鸭山市| 拜城县| 行唐县| 甘孜县| 定陶县| 明水县| 蓝田县| 宝丰县| 宁城县| 武宁县|