1. 程式人生 > >Spring Boot 同一URL返回不同資源

Spring Boot 同一URL返回不同資源

Spring 的 View 和 ViewResolver 都有很多實現類,支援如Json、XML、模版(Freemaker、Velocity)甚至Excel、PDF等形式的輸出。

相關類在org.springframework.web.servlet.view包中。

其中有一個實現類:ContentNegotiatingViewResolver 可以根據對資源的描述來返回不同形式的檢視

首先需要配置 ContentNegotiationManagerFactoryBean 

在有@Confiuration註解的類中編寫:

    @Bean
    public ContentNegotiationManagerFactoryBean contentNegotiationManagerFactoryBean(){
        ContentNegotiationManagerFactoryBean bean=new ContentNegotiationManagerFactoryBean();
        bean.setIgnoreAcceptHeader(true);
        bean.setFavorPathExtension(false);
        bean.setFavorParameter(true);
        bean.setParameterName("format");
        bean.setDefaultContentType(MediaType.TEXT_HTML);
        Map<String,MediaType> map=new HashMap<>();
        map.put("html",MediaType.TEXT_HTML);
        map.put("json",MediaType.APPLICATION_JSON);
        bean.addMediaTypes(map);
        return bean;
    }

這裡的配置決定了資源的描述方式:

描述資源的三種形式
 一、使用副檔名
http://localhost:8080/users.json  以json格式呈現
http://localhost:8080/users     以預設檢視呈現
二、使用HTTP Header指定MIME形式
GET /users HTTP/1.1
Accept:application/json  請求時設定返回形式是json
三、使用引數
http://localhost:8080/users?format=json

副檔名形式是由setFavorPathExtension方法配置的

HTTP Header形式是由setIgnoreAcceptHeader方法配置的

引數形式是由setFavorParameter+setParameterName方法配置的

這裡使用第三種配置

setDefaultContentType方法配置的是預設的MIME型別

addMediaTypes配置的是支援的MIME型別(text/html、application/json等)

 

然後配置 ContentNegotiatingViewResolver:

    @Bean
    public ContentNegotiatingViewResolver contentNegotiatingViewResolver(){
        ContentNegotiatingViewResolver resolver=new ContentNegotiatingViewResolver();
        resolver.setOrder(0);
        resolver.setContentNegotiationManager(factoryBean().getObject());
        ArrayList<View> viewList = new ArrayList<>();
        View json=new MappingJackson2JsonView();
        ((MappingJackson2JsonView) json).setModelKey("userList");
        viewList.add(json);
        resolver.setDefaultViews(viewList);
        return resolver;
    }

這裡在viewList裡配置了json形式的View:MappingJackson2JsonView

userList是返回的資料的key

然後配置預設解析器:

    @Bean
    public BeanNameViewResolver beanNameViewResolver(){
        BeanNameViewResolver resolver=new BeanNameViewResolver();
        resolver.setOrder(1);
        return resolver;
    }

    @Bean
    public InternalResourceViewResolver defaultViewResolver(){
        InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
        viewResolver.setOrder(2);
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setContentType("text/html");
        viewResolver.setPrefix("/template/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

然後在Controller配置Handler方法:

    @RequestMapping("/users")
    public String listUsers(ModelMap map){
        ArrayList<User> userList = new ArrayList<>();
        User user1=new User("Zhangsan",27,"man");
        User user2=new User("LiSi",23,"woman");
        User user3=new User("Wangwu",23,"man");
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        map.addAttribute(userList);
        return "userListPage";

ModelMap用來存放模型資料,Spring在執行Handler方法之前,會先生成一個隱含的模型資料物件,把資料先存放進去,如果發現Handler的引數列表中有ModelMap、Model或Map時,就把資料傳給引數(Model包含一個ModelMap物件執行資料存放,ModelMap繼承LinkedHashMap實現,本質上就是用Map存放資料)

然後寫一個html頁面用來實現資料以text/html形式的顯示

執行專案,測試結果如下: