1. 程式人生 > 實用技巧 >SpringMVC - 1 概述&配置

SpringMVC - 1 概述&配置

SpringMVC - 1 概述&配置

1 SpringMVC 概述

三層架構

  • 表現層:負責資料展示

  • 業務層:負責業務處理

  • 資料層:負責資料操作

MVC(Model View Controller),一種用於設計建立Web應用程式表現層的模式

  • Model(模型):資料模型,用於封裝資料

  • View(檢視):頁面檢視,用於展示資料

  • jsp
  • html

Controller(控制器):處理使用者互動的排程器,用於根據使用者需求處理程式邏輯

  • Servlet
  • SpringMVC

2 入門案例

2.1 入門案例製作

①匯入SpringMVC相關座標

<!-- servlet3.1規範的座標 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<!--jsp座標-->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
<!--spring的座標-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>
<!--spring web的座標-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>
<!--springmvc的座標-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>

②定義表現層業務處理器Controller,並配置成spring的bean(等同於Servlet)

@Controller
public class UserController {

    public void save(){
        System.out.println("user mvc controller is running ...");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!--掃描載入所有的控制類類-->
    <context:component-scan base-package="com.itheima"/>

</beans>

③web.xml中配置SpringMVC核心控制器,用於將請求轉發到對應的具體業務處理器Controller中(等同於Servlet配置)

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

④設定具體Controller的訪問路徑(等同於Servlet在web.xml中的配置)

//設定當前方法的訪問對映地址
@RequestMapping("/save")
public void save(){
    System.out.println("user mvc controller is running ...");
}

⑤設定返回頁面

//設定當前方法的訪問對映地址
@RequestMapping("/save")
//設定當前方法返回值型別為String,用於指定請求完成後跳轉的頁面
public String save(){
    System.out.println("user mvc controller is running ...");
    //設定具體跳轉的頁面
    return "success.jsp";
}

2.2 入門案例工作流程分析

  • 伺服器啟動
    1. 載入web.xml中DispatcherServlet
    2. 讀取spring-mvc.xml中的配置,載入所有com.itheima包中所有標記為bean的類
    3. 讀取bean中方法上方標註@RequestMapping的內容
  • 處理請求
    1. DispatcherServlet配置攔截所有請求 /
    2. 使用請求路徑與所有載入的@RequestMapping的內容進行比對
    3. 執行對應的方法
    4. 根據方法的返回值在webapp目錄中查詢對應的頁面並展示

2.3 SpringMVC 技術架構圖

  • DispatcherServlet:前端控制器, 是整體流程控制的中心,由其呼叫其它元件處理使用者的請求, 有
    效的降低了元件間的耦合性
  • HandlerMapping:處理器對映器, 負責根據使用者請求找到對應具體的Handler處理器
  • Handler:處理器,業務處理的核心類,通常由開發者編寫,描述具體的業務
  • HandlAdapter:處理器介面卡,通過它對處理器進行執行
  • View Resolver:檢視解析器, 將處理結果生成View檢視
  • View:檢視,最終產出結果, 常用檢視如jsp、 html

3 基本配置

3.1 常規配置(Controller載入控制)

  • SpringMVC的處理器對應的bean必須按照規範格式開發,未避免加入無效的bean可通過bean載入過濾器進
    行包含設定或排除設定,表現層bean標註通常設定為@Controller

xml方式

<context:component-scan base-package="com.itheima">
    <context:include-filter
                            type="annotation"
                            expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

3.1.1 靜態資源載入

<!--放行指定型別靜態資源配置方式-->
<mvc:resources mapping="/img/**" location="/img/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>

<!--SpringMVC提供的通用資源放行方式-->
<mvc:default-servlet-handler/>

3.1.2 中文亂碼處理

SpringMVC提供專用的中文字元過濾器,用於處理亂碼問題

配置在 web.xml 裡面

<!--亂碼處理過濾器,與Servlet中使用的完全相同,差異之處在於處理器的類由Spring提供-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3.2 註解驅動

  • 使用註解形式轉化SpringMVC核心配置檔案為配置類
@Configuration
@ComponentScan(value = "com.itheima",includeFilters =
    @ComponentScan.Filter(type=FilterType.ANNOTATION,classes = {Controller.class})
    )
public class SpringMVCConfiguration implements WebMvcConfigurer{
    //註解配置放行指定資源格式
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("/img/**").addResourceLocations("/img/");
//        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
//        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
//    }

    //註解配置通用放行資源的格式
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();;
    }
}
  • 基於servlet3.0規範,自定義Servlet容器初始化配置類,載入SpringMVC核心配置類
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //建立Servlet容器時,使用註解的方式載入SPRINGMVC配置類中的資訊,並載入成WEB專用的			           //ApplicationContext物件
    //該物件放入了ServletContext範圍,後期在整個WEB容器中可以隨時獲取呼叫
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMVCConfiguration.class);
        return ctx;
    }

    //註解配置對映地址方式,服務於SpringMVC的核心控制器DispatcherServlet
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    //亂碼處理作為過濾器,在servlet容器啟動時進行配置,相關內容參看Servlet零配置相關課程
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        CharacterEncodingFilter cef = new CharacterEncodingFilter();
        cef.setEncoding("UTF-8");
        FilterRegistration.Dynamic registration = servletContext.addFilter("characterEncodingFilter", cef);
        registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE),false,"/*");
    }
}

刪除web.xml
刪除spring-mvc.xml

小節
 基於servlet3.0規範,配置Servlet容器初始化配置類,初始化時載入SpringMVC配置類
 轉化SpringMVC核心配置檔案
 轉化為註解(例如: spring處理器載入過濾)
 轉化為bean進行載入
 按照標準介面進行開發並載入(例如:中文亂碼處理、靜態資源載入過濾)