03.spring mvc實踐

一、簡單使用

1、搭建Spring MVC

1.1 配置DispatcherServlet並讓Servlet容器發現他

(1)說明

DispatcherServlet是Spring MVC的核心。在這裏請求request第一次接觸到框架,它要負責將請求路由到其他的組件之中

(2)配置方式

      1)方式一(傳統方式):配置在web.xml文件中,這個文件會放到應用的WAR包裏面。

      2)方式二Servlet 3規範和Spring 3.1的功能增強):使用JavaDispatcherServlet配置在Servlet容器中,不會再使用web.xml文件

如果按照方式二配置DispatcherServlet,而不是使用web.xml的話,那唯一問題在於它只能部署到支持Servlet 3.0的服務器中才能正常工作,如Tomcat 7或更高版本;

本文主要介紹方式二,具體做法是自定義一個類,繼承自AbstractAnnotationConfigDispatcherServletInitializer

    方式二原理:

  • 擴展AbstractAnnotationConfigDispatcherServletInitializer的任意類都會自動地配置DispatcherServletSpring應用上下文,Spring的應用上下文會位於應用程序的Servlet上下文之中。
  • Servlet容器啓動時會通過AbstractAnnotationConfigDispatcherServletInitializer創建DispatcherServlet與ContextLoaderListener
  • SpringWeb應用中,會有以下兩個上下文:
    • DispatcherServlet用於創建Spring應用上下文--加載包含Web組件的bean
    • ContextLoaderListener用於創建Web上下文--加載應用中的其他bean
  • 在Servlet 3.0環境中,容器會在類路徑中查找實現javax.servlet.ServletContainerInitializer接口的類,如果能發現的話,就會用它來配置Servlet容器。Spring提供了這個接口的實現,名SpringServletContainerInitializer,這個類反過來又會查找實現WebApplicationInitializer的類並將配置的任務交給它們來完成。Spring 3.2引入了一個便利的WebApplicationInitializer基礎實現,也就AbstractAnnotationConfigDispatcherServletInitializer因爲我們的SpittrWebAppInitializer擴展了 AbstractAnnotationConfigDispatcherServletInitializer(同時也就實現了WebApplicationInitializer),因此當部署到Servlet 3.0容器中的時候,容器會自動發現它,並用它來配置Servlet上下文。

AbstractAnnotationConfigDispatcherServletInitializer抽象類中有三個需要實現的方法(這三個方法就是圍繞上面的原理中流程需要而定義的):

方法一:getServletMappings()

@Override
protected String[] getServletMappings() {
    return new String[]{"/"};//將DispatcherServlet映射到“/”
}
它會將一個或多個路徑映射到DispatcherServlet上。在本例中,它映射的是“/”,這表示它會處理進入應用的所有請求。

方法二:getServletConfigClasses()

getServletConfigClasses()方法返回的帶有@Configuration註解的類將會用來定義DispatcherServlet負責創建的Spring應用上下文中的bean。

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[]{WebConfig.class};
}

WebConfig.java見下文

方法三:getRootConfigClasses()

getRootConfigClasses()方法返回的帶有@Configuration註解的類將會用來配置ContextLoaderListener負責創建的應用上下文中的bean
@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[]{RootConfig.class};
}

RootConfig.java見下文

1.2 啓用Spring MVC

1.2.1 配置getServletConfigClasses()中的WebConfig.java

方式一:使用spring配置文件方式啓動:可以使用<mvc:annotation-driven>啓用註解驅動的Spring MVC

方式二:使用JavaConfig配置方式啓動:使用@EnableWebMvc註解修飾一個JavaConfig類(已經使用@Configuration註解的類

本文主要介紹方式二:

步驟1:啓用Spring MVC

所能創建的最簡單的Spring MVC配置就是一個帶有@EnableWebMvc註解的類

步驟2:選擇是否啓動組件掃描

如果沒有啓用組件掃描。這樣的結果就是,Spring只能找到顯式聲明在配置類中的控制器,這裏我們選擇通過自動組件掃描方式讓spring發現相關bean。

步驟3:配置視圖解析器

如果沒有配置,spring將使用默認的視圖解析器,行爲是:默認會使用BeanNameViewResolver,這個視圖解析器會查找ID與視圖名稱匹配的bean,並且查找的bean要實現View接口,它以這樣的方式來解析視圖

步驟4:目前這樣配置的話,DispatcherServlet會映射爲應用的默認Servlet,所以它會處理所有的請求,包括對靜態資源的請求,如
圖片和樣式表(在大多數情況下,這可能並不是你想要的效果)
解決辦法:
 
完整的WebConfig如下:
package com.mzj.springmvc.spittr.config;

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

@Configuration
@EnableWebMvc//啓用Spring MVC
@ComponentScan("com.mzj.springmvc.spittr.webbean")//指定組件掃描範圍,可以掃描到帶有@Controller註解的bean(spring mvc中的Controller)
public class WebConfig extends WebMvcConfigurerAdapter {

  /**
   * 添加視圖解析器bean
   *
   * 本實現:
   *
   * 會查找.JSP文件,在查找的時候,它會在視圖名稱上加一個特定的前綴和後綴(例如,名爲home的視圖將會解析爲/WEB-INF/views/home.jsp)。
   *
   * @return
   */
  @Bean
  public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
  }

  /**
   * 通過繼承WebMvcConfigurerAdapter
   * 複寫configureDefaultServletHandling
   * 調用 configurer.enable();
   * 達到的效果是:要求DispatcherServlet將對靜態資源的請求轉發到Servlet容 器中默認的Servlet上,而不是使用DispatcherServlet本身來處理 此類請求。
   * @param configurer
   */
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }
  
}

1.2.2 配置getRootConfigClasses()中的RootConfig.java

因爲本文關注於Web開發,而Web相關的配置通過DispatcherServlet創建的應用上下文都已經配置好了,因此現在的RootConfig相對很簡單,唯一需要注意的是RootConfig使用了@ComponentScan註解,並且掃描的範圍是整個項目的根,即:
com.mzj.springmvc.spittr
這樣的話,我們會將很多組件(非Web的組件)來應用到RootConfig中,來充實完善RootConfig。
 
目前階段~~完整的~~~RootConfig如下:
package com.mzj.springmvc.spittr.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan(basePackages={"com.mzj.springmvc.spittr"},
    excludeFilters={
        @Filter(type=FilterType.ANNOTATION, value= EnableWebMvc.class)
    })
public class RootConfig {
}

 

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