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形式的顯示
執行專案,測試結果如下: