controller方法返回json或html

一、情景描述

一個普通的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);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章