Spring MVC 筆記--配置基於JavaConfig


主要使用基於 JavaConfig 方式配置

配置 DispatcherServlet

通過繼承抽象類AbstractAnnotationConfigDispatcherServletInitializer來自動配置 DispatcherServlet 和 Spring 應用上下文(不需在 xml 中配置)

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
​
    // 指定 Spring 應用上下文配置類(主要配置 web 組件的 Bean)
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
  
    // 相對應的另一個應用上下文配置類(應用中的其他 Bean)
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
​
    // 將 DispatcherServlet 映射到 "/"
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

其中 WebConfig 主要配置 web 組件相關的 Bean,如控制器、視圖解析器以及處理映射器等,內容大致如下

@Configuration // 標志這個類為配置類
@EnableWebMvc // 啟用注解驅動的 Spring MVC,同xml配置方式的<mvc:annotation-driven>
@ComponentScan("spitter.web") // 掃描這個包中的 Bean 組件
public class WebConfig extends WebMvcConfigurerAdapter{
​
    /**
     * 配置視圖解析器
     */
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }
​
    /**
     * 配置靜態資源的處理
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
  
    // 其他 web 相關 Bean 等... 
}

RootConfig 配置除 web 組件外的其他 Bean,內容大致如下

@Configuration
// 配置掃描的包,以及過濾條件
@ComponentScan(basePackages = {"spitter"}, excludeFilters = {
    @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
    // Bean 等
}

WebConfig 與 RootConfig 配置內容的區別具體可參考如下的 Spring 文檔中的圖片

不過這個不是強制要分開的,我們也可以把它們配置在一個文件中

添加 Controller 等

可以在相應位置添加對應 Controller 、jsp 文件等

列一個簡單的 Controller

@Controller
@RequestMapping("/")
public class HomeController {
    @RequestMapping(method = RequestMethod.GET)
    public String home() {
        return "home";
    }
}

文件結構 

文件整體結構如下:

 

上面的內容就是一個簡單的基於 SpringMVC 的應用,下面來說一下 SpringMVC 的其他功能

數據校驗

  1. 添加實現 Java Validation API 的 jar 包,如 Hibernate Validator

  2. 在實體類中對應字段使用相應的注解,如 @NotNull、@Size、@Max、@Min 等

在控制器中的使用

@RequestMapping(value="/", method=RequestMethod.GET)
public String processRegistration(@Valid Spitter spitter, Errors errors) {
    if (errors.hasErrors()) {
        return "errorpage"; // 校驗錯誤,進入錯誤頁面
    }
    // 執行業務操作
    return "successpage";
}

文件上傳

如要進行文件上傳,需配置 multipart 解析器,可以選擇如下其中的一種配置

  • CommonsMultipartResolver : 使用 Jakarta Commons FileUpload 解析 multipart 請求

  • StandardServletMultipartResolver : 依賴於 Servlet 3.0 對 multipart 請求的支持

@Bean
public MultipartResolver multipartResolver() throws IOException {
     // 使用 CommonsMultipartResolver 解析器
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
     multipartResolver.setUploadTempDir(new FileSystemResource("aa/bb")); // 文件臨時保存目錄
     multipartResolver.setMaxUploadSize(2048000); // 上傳文件的大小上限
     multipartResolver.setMaxInMemorySize(0); // 當文件達到這個設置大小時,將寫入到臨時文件路徑中
     return multipartResolver;
  
     // 使用 StandardServletMultipartResolver 解析器
     return new StandardServletMultipartResolver();
}

如果選擇使用 StandardServletMultipartResolver 解析器,則其中的配置需要在 Servlet 中進行,在這個記錄中,就是在之前配置的 SpittrWebAppInitializer 類中添加如下內容(重寫 customizeRegistration 方法):

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
​
    // 省略內容見上面的對應文件 
  
    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploadss", 2048000, 4096000, 0));
    }
}

其中 MultipartConfigElement 有四個參數,分別為:

  1. 臨時路徑的位置

  2. 上傳文件的最大容量,以字節為單位(默認無限制)

  3. 整個 multipart 請求的最大容量

  4. ​在上傳的過程中,如果文件達到指定大小,將會寫入到臨時文件路徑中(默認值為0)

對應的控制器中,可以使用 MultipartFile 獲取文件,進行后續操作

處理異常

將異常映射為狀態碼: 在異常上面添加注解 @ResponseStatus(value = HttpStatus.NOT_FOUND, reason ="")

編寫異常處理方法:

@ExceptionHandler(DuplicateException.class)
public String handleDuplidateException() {
    return "error";
}

這個方法將會攔截所在類中的所有異常,進行處理

如果我們想要一個能處理所有控制器方法中異常的功能,則需要使用控制器通知(@ControllerAdvice)

@ControllerAdvice
public class AppWideExceptionHandler {
    @ExceptionHandler(DuplicateException.class)
    public String handleDuplidateException() {
        return "error";
    }
  
    // ...
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM