Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

第 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.1.7. RequestMapping with Request Parameters - @RequestParam
6.2.1.7.1. HTTP GET
6.2.1.7.2. HTTP POST
6.2.1.7.3. @RequestParam 傳遞特殊字元串
6.2.1.7.4. 傳遞日期參數
6.2.1.7.5. 上傳檔案
6.2.1.7.6. @RequestParam - POST 數組
6.2.2. @RequestBody
6.2.2.1. @RequestBody 傳遞 List
6.2.2.2. 傳遞 Map 數據
6.2.3. @RequestHeader - 獲取 HTTP Header 信息
6.2.3.1. @RequestHeader 從 Http 頭中獲取變數
6.2.4. RequestMapping with Path Variables - @PathVariable
6.2.4.1. URL 參數傳遞
6.2.4.2. 預設值
6.2.4.3. URL 傳遞 Date 類型
6.2.4.4. 處理特殊字元
6.2.4.5. @PathVariable 注意事項
6.2.5. @ModelAttribute
6.2.6. @ResponseBody
6.2.6.1. 直接返回HTML
6.2.7. @ResponseStatus 設置 HTTP 狀態
6.2.8. @CrossOrigin
6.2.8.1. maxAge
6.2.9. @CookieValue - 獲取 Cookie 值
6.2.10. @SessionAttributes
6.2.11. ModelAndView
6.2.11.1. 變數傳遞
6.2.11.2. ModelMap 傳遞多個變數
6.2.11.3. redirect
6.2.11.4. ArrayList
6.2.11.5. HashMap
6.2.11.6. 傳遞對象
6.2.11.7.
6.2.12. HttpServletRequest / HttpServletResponse
6.2.12.1. HttpServletResponse
6.2.12.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. 配置靜態檔案目錄
6.4.2. 添加靜態檔案目錄
6.4.3. Using Spring’s form tag library
6.4.3.1. css
6.4.3.1.1. cssClass
6.4.3.1.2. cssStyle
6.4.3.1.3. cssErrorClass
6.4.3.2. cssClass
6.4.4. Thymeleaf
6.4.4.1. Maven pom.xml
6.4.4.2. Spring 配置
6.4.4.3. controller
6.4.4.4. HTML5 Template
6.4.4.5. thymeleaf 渲染表格
6.4.4.6. URL 連結
6.4.4.7. 拆分字元串
6.4.4.8. 日期格式化
6.4.5. 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. Interceptor
6.8.1. WebMvcConfigurerAdapter
6.8.2. HandlerInterceptor
6.9. FAQ
6.9.1. o.s.web.servlet.PageNotFound
6.9.2. HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
6.9.3. 同時使用 Thymeleaf 與 JSP
6.9.4. 排除靜態內容
6.9.5. HTTP Status 406
6.9.6. Caused by: java.lang.IllegalArgumentException: Not a managed type: class common.domain.Article
6.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一個應用一個容器一個連接埠,比不得不通過連接埠來區分應用。

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