一、情景描述
一個普通的Controller方法:
@Controller
public class ExampleController {
@RequestMapping("/test")
public ModelAndView test() {
Map<String, String> map = new HashMap();
map.put("哈哈", "哈哈哈哈");
map.put("呵呵", "呵呵呵呵");
return new ModelAndView("test", map);
}
}
通過 http://localhost:8080/novel/test.json 訪問:
{"哈哈": "哈哈哈哈", "呵呵", "呵呵呵呵"}
在 test.jsp中隨便添加一點內容:
This is a test jsp.
通過 http://localhost:8080/novel/test
或 http://localhost:8080/novel/test.html 訪問:
This is a test jsp.
二、具體實現
很明顯,這是通過url後綴確定返回不同的媒體類型。
關鍵代碼:
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/pages/", ".jsp");
registry.enableContentNegotiation(new FastJsonJsonView());
}
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(true)
.ignoreAcceptHeader(true)
.parameterName("mediaType")
.defaultContentType(MediaType.TEXT_HTML)
.mediaType("html", MediaType.TEXT_HTML)
.mediaType("json", MediaType.APPLICATION_JSON);
}
重點是ContentNegotiationConfigurer配置:
.defaultContentType(MediaType.TEXT_HTML) 默認返回html
.mediaType(“html”, MediaType.TEXT_HTML) 返回html
.mediaType(“json”, MediaType.APPLICATION_JSON) 返回json
json處理的話,在這裏使用的阿里的FastJson
registry.enableContentNegotiation(new FastJsonJsonView())
三、附完整配置
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>novel</name>
<groupId>com.yale</groupId>
<artifactId>novel</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- spring版本號 -->
<spring.version>5.0.3.RELEASE</spring.version>
<jsp.version>2.2</jsp.version>
<servlet.version>3.1.0</servlet.version>
<jstl.version>1.2</jstl.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
<build>
<plugins>
</plugins>
</build>
</project>
MyMvcConfig.java
package com.yale.config;
import com.alibaba.fastjson.support.spring.FastJsonJsonView;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
//開啓Mvc功能
@EnableWebMvc
//掃包
@ComponentScan("com.yale")
public class MyMvcConfig implements WebMvcConfigurer {
//配置視圖解析器
// @Bean
// public InternalResourceViewResolver viewResolver(){
// InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
// viewResolver.setPrefix("/WEB-INF/pages/");
// viewResolver.setSuffix(".jsp");
// viewResolver.setViewClass(JstlView.class);
// return viewResolver;
// }
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/pages/", ".jsp");
registry.enableContentNegotiation(new FastJsonJsonView());
}
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(true)
.ignoreAcceptHeader(true)
.parameterName("mediaType")
.defaultContentType(MediaType.TEXT_HTML)
.mediaType("html", MediaType.TEXT_HTML)
.mediaType("json", MediaType.APPLICATION_JSON);
}
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/toLogin").setViewName("login");
}
}
WebInitializer.java
package com.yale.config;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(MyMvcConfig.class);
context.setServletContext(servletContext);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(context));
//映射路徑
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
}