Home | 简体中文 | 繁体中文 | 杂文 | 知乎专栏 | Github | OSChina 博客 | 云社区 | 云栖社区 | Facebook | Linkedin | 视频教程 | 打赏(Donations) | About
知乎专栏多维度架构

第 6 章 Spring MVC

目录

6.1. @EnableWebMvc
6.1.1. CORS 跨域请求
6.1.2. Spring MVC CORS with WebMvcConfigurerAdapter
6.2. @Controller
6.2.1. @RequestMapping
6.2.1.1. @RequestMapping("/")
6.2.1.2. 映射多个URL
6.2.1.3. 匹配通配符
6.2.1.4. headers
6.2.1.5. @GetMapping
6.2.1.6. @PostMapping
6.2.2. RequestMapping with Request Parameters - @RequestParam
6.2.2.1. HTTP GET
6.2.2.2. HTTP POST
6.2.2.3. @RequestParam 传递特殊字符串
6.2.2.4. 传递日期参数
6.2.2.5. 上传文件
6.2.2.6. @RequestParam - POST 数组
6.2.3. @RequestBody
6.2.3.1. @RequestBody 传递 List
6.2.3.2. 传递 Map 数据
6.2.4. @RequestHeader - 获取 HTTP Header 信息
6.2.4.1. @RequestHeader 从 Http 头中获取变量
6.2.5. RequestMapping with Path Variables - @PathVariable
6.2.5.1. URL 参数传递
6.2.5.2. 默认值
6.2.5.3. URL 传递 Date 类型
6.2.5.4. 处理特殊字符
6.2.5.5. @PathVariable 注意事项
6.2.6. @ModelAttribute
6.2.7. @ResponseBody
6.2.7.1. 直接返回HTML
6.2.8. @ResponseStatus 设置 HTTP 状态
6.2.9. @CrossOrigin
6.2.9.1. maxAge
6.2.10. @CookieValue - 获取 Cookie 值
6.2.11. @SessionAttributes
6.2.12. ModelAndView
6.2.12.1. 变量传递
6.2.12.2. ModelMap 传递多个变量
6.2.12.3. redirect
6.2.12.4. ArrayList
6.2.12.5. HashMap
6.2.12.6. 传递对象
6.2.12.7.
6.2.13. HttpServletRequest / HttpServletResponse
6.2.13.1. HttpServletResponse
6.2.13.2. HttpServletRequest
6.3. @RestController
6.3.1. 返回实体
6.3.2. JSON
6.3.3. 处理原始 RAW JSON 数据
6.3.4. 返回 JSON 对象 NULL 专为 "" 字符串
6.3.5. XML
6.3.6. 兼容传统 json 接口
6.3.7. @PageableDefault 分页
6.3.8. 上传文件
6.4. View
6.4.1. Using Spring’s form tag library
6.4.1.1. css
6.4.1.1.1. cssClass
6.4.1.1.2. cssStyle
6.4.1.1.3. cssErrorClass
6.4.1.2. cssClass
6.4.2. Thymeleaf
6.4.2.1. Maven pom.xml
6.4.2.2. Spring 配置
6.4.2.3. controller
6.4.2.4. HTML5 Template
6.4.2.5. thymeleaf 渲染表格
6.4.2.6. URL 链接
6.4.2.7. 拆分字符串
6.4.2.8. 日期格式化
6.4.3. FreeMarker
6.5. Service
6.5.1. Application
6.5.2. 定义接口
6.5.3. 实现接口
6.5.4. 调用 Service
6.5.5. context.getBean 调用 Service
6.6. i18n 国际化
6.6.1. 在 appliction.properties 中配置启用 i18n
6.6.2. 创建语言包文件
6.6.3. 控制器重引用语言包
6.6.4. 参数传递
6.7. 校验器(Validator)
6.7.1. 常规用法
6.7.1.1. 定义校验器
6.7.1.2. 获取 BindingResult 结果
6.7.1.3. 测试校验效果
6.7.2. 自定义注解
6.7.2.1. 定义校验器注解接口
6.7.2.2. 实现接口
6.7.2.3. 注解用法
6.7.2.4. 测试注解
6.8. FAQ
6.8.1. o.s.web.servlet.PageNotFound
6.8.2. HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
6.8.3. 同时使用 Thymeleaf 与 JSP
6.8.4. 排除静态内容
6.8.5. HTTP Status 406
6.8.6. Caused by: java.lang.IllegalArgumentException: Not a managed type: class common.domain.Article
6.8.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一个应用一个容器一个端口,比不得不通过端口来区分应用。

6.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;
	}

}
		
		

6.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("*");
            }
        };
    }			
			
			

6.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);
	}
}