Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | 51CTO学院 | CSDN程序员研修院 | OSChina 博客 | 腾讯云社区 | 阿里云栖社区 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏多维度架构

第 3 章 Spring MVC

目录

3.1. @EnableWebMvc
3.1.1. CORS 跨域请求
3.1.2. Spring MVC CORS with WebMvcConfigurerAdapter
3.2. @Controller
3.2.1. @RequestMapping
3.2.2. @RequestBody
3.2.3. @RequestHeader - 获取 HTTP Header 信息
3.2.4. RequestMapping with Path Variables - @PathVariable
3.2.5. @ModelAttribute
3.2.6. @ResponseBody
3.2.7. @ResponseStatus 设置 HTTP 状态
3.2.8. @CrossOrigin
3.2.9. @CookieValue - 获取 Cookie 值
3.2.10. @SessionAttributes
3.2.11. ModelAndView
3.2.12. HttpServletRequest / HttpServletResponse
3.3. @RestController
3.3.1. 返回实体
3.3.2. JSON
3.3.3. 处理原始 RAW JSON 数据
3.3.4. 返回 JSON 对象 NULL 专为 "" 字符串
3.3.5. XML
3.3.6. 兼容传统 json 接口
3.3.7. @PageableDefault 分页
3.3.8. 上传文件
3.3.9. Spring boot with csv
3.3.10. Jackson
3.3.11. synchronized
3.4. View
3.4.1. 配置静态文件目录
3.4.2. 添加静态文件目录
3.4.3. Using Spring’s form tag library
3.4.4. Thymeleaf
3.4.5. FreeMarker
3.5. Service
3.5.1. Application
3.5.2. 定义接口
3.5.3. 实现接口
3.5.4. 调用 Service
3.5.5. context.getBean 调用 Service
3.5.6. AopContext
3.6. i18n 国际化
3.6.1. 在 appliction.properties 中配置启用 i18n
3.6.2. 创建语言包文件
3.6.3. 控制器重引用语言包
3.6.4. 参数传递
3.7. 校验器(Validator)
3.7.1. 常规用法
3.7.2. 自定义注解
3.8. Interceptor
3.8.1. WebMvcConfigurerAdapter
3.8.2. HandlerInterceptor
3.9. FAQ
3.9.1. o.s.web.servlet.PageNotFound
3.9.2. HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
3.9.3. 同时使用 Thymeleaf 与 JSP
3.9.4. 排除静态内容
3.9.5. HTTP Status 406
3.9.6. Caused by: java.lang.IllegalArgumentException: Not a managed type: class common.domain.Article
3.9.7. {"error":"unauthorized","error_description":"Full authentication is required to access this resource"}

Spring MVC 有两种启动模式,一种是传统Tomcat,需要配置很多XML文件。另一种方式是采用 Spring Boot 需要些一个Java程序,不需要写xml文件,这个程序会帮助你处理启动所需的一切,并且采用嵌入方式启动 Tomcat 或者 Jetty.

两种方式各有优缺点,Tomcat 方式配置繁琐,但是可以使用虚拟机,同一个IP地址使用不同域名访问,出现不同的内容。而Spring Boot一个应用一个容器一个端口,比不得不通过端口来区分应用。

3.1. @EnableWebMvc

		
package cn.netkiller.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}

	@Bean
	public InternalResourceViewResolver viewResolver() {
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setPrefix("WEB-INF/jsp/");
		resolver.setSuffix(".jsp");
		return resolver;
	}

}
		
		

3.1.1. CORS 跨域请求

			
@Configuration
public class CorsConfiguration
{
    @Bean
    public WebMvcConfigurer corsConfigurer()
    {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}		
			
			
			
 	@Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("*");
            }
        };
    }			
			
			

3.1.2. Spring MVC CORS with WebMvcConfigurerAdapter

			
@Configuration
@EnableWebMvc
public class CorsConfiguration extends WebMvcConfigurerAdapter
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("GET", "POST");
    }
}
			
			
			
@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
	@Override
	public void addCorsMappings(CorsRegistry registry) {
	  registry.addMapping("/info/**")
	   	  .allowedOrigins("http://localhost:8080", "http://localhost:8000")
		  .allowedMethods("POST", "GET",  "PUT", "OPTIONS", "DELETE")
		  .allowedHeaders("X-Auth-Token", "Content-Type")
		  .exposedHeaders("custom-header1", "custom-header2")
		  .allowCredentials(false)
		  .maxAge(4800);
	}
}