1. 程式人生 > >SpringMVC之context-dispatcher.xml,瞭解基本的控制器

SpringMVC之context-dispatcher.xml,瞭解基本的控制器

本篇來完成SpringMVC的三大XML的最後一個context-dispatcher.xml,瞭解spring如何控制檢視、如何掃描註解、資料轉換、靜態資源載入等關鍵配置項。

另外附上前兩個xml的配置連結:

①、xml內容

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
     xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"
>
<!-- 檢視解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- 將jsp頁面放置在web-info中可以保護這些頁面不被瀏覽器直接訪問 -->
<property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".jsp"></property> </bean> <!-- 掃描web包,應用Spring的註解 @Controller --> <!-- 具體的包可以使spring在載入時不掃描沒有必要的包 --> <context:component-scan base-package="com.honzh.spring.controller" /> <!-- 掃描業務層service實現類 --> <context:component-scan base-package="com.**.service" /> <mvc:annotation-driven conversion-service="conversionService" /> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <!-- 這裡使用string to date可以將dao在jsp到controller轉換的時候直接將string格式的日期轉換為date型別 --> <bean class="com.honzh.common.plugin.StringToDateConverter" /> </list> </property> </bean> <mvc:resources location="/assets/" mapping="/assets/**"/> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/components/" mapping="/components/**"/> <!-- 以上和下面這句話等效 --> <!-- <mvc:default-servlet-handler/> --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"> <property name="maxUploadSize" value="1024000000"></property> </bean> </beans>

②、重點內容介紹

1、viewResolver

       <!-- 檢視解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <!-- 將jsp頁面放置在web-info中可以保護這些頁面不被瀏覽器直接訪問 -->
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp"></property>
    </bean>
  1. 將jsp頁面放置在web-info中可以保護這些頁面不被瀏覽器直接訪問。
    這裡寫圖片描述
  2. 通過prefix、suffix我們在controller中的跳轉地址就可以簡化了,比如說原來的“/WEB-INF/pages/login.jsp”就可以簡化為“/login”。

2、context:component-scan

    <!-- 掃描web包,應用Spring的註解 @Controller -->
    <!-- 具體的包可以使spring在載入時不掃描沒有必要的包 -->
    <context:component-scan base-package="com.honzh.spring.controller" />
    <!-- 掃描業務層service實現類 -->
    <context:component-scan base-package="com.**.service" />
  1. 通過context:component-scan,spring就會掃描base-package下面帶有Spring註解的類(@Controller、@Service),這樣一來,當你url進行請求的時候,就會找到對應的controller控制器,在controller需要的時候,也會找到對應的service。

  2. 當然了,base-package的配置方式就有兩種,一種是全路徑,一種是帶*的省略路徑,不過一定要具體到對應的包下面,否則spring會掃描不必要的包路徑以及類。

3、mvc:annotation-driven

    <mvc:annotation-driven conversion-service="conversionService" />
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <!-- 這裡使用string to date可以將dao在jsp到controller轉換的時候直接將string格式的日期轉換為date型別 -->
                <bean class="com.honzh.common.plugin.StringToDateConverter" />
            </list>
        </property>
    </bean>

轉換器converter是可以將一種型別轉換為另外一種型別的,例如上述配置中string到date型別的轉換,StringToDateConverter 類如下,其轉換的日期格式為”yyyy-MM-dd”,如果頁面上輸入的日期格式不是”yyyy-MM-dd”,那麼尤其是在form表單提交到model時,就會丟擲錯誤。另外,一般model的bean中對於日期類,其型別為Date,而前端jsp傳入的型別為string,有了該converter,就可以輕鬆將string轉換為bean了,就不需要特殊的處理了。

package com.honzh.common.plugin;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;

public class StringToDateConverter implements Converter<String,Date>{

    public Date convert(String source) {
        DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = dateTimeFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

4、mvc:resources和mvc:default-servlet-handler

還記得我在介紹web.xml時說過“/”的靜態資源問題了嗎?那麼當url-pattern中配置為“/”,預設的DispatcherServlet會處理所有的請求,包含靜態資源,而事實顯然不需要這樣。

這裡寫圖片描述

webContent的目錄如上圖所示,對於assets和css資料夾,顯然我們不希望servlet再進行攔截,否則,這些資源將無法呈現,那麼如何解決這個問題呢?

    <mvc:resources location="/assets/" mapping="/assets/**"/>
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/components/" mapping="/components/**"/>

    <!-- 以上和下面這句話等效 -->
<!--    <mvc:default-servlet-handler/> -->

以上兩種方案供解決,二者選其一。至於更細節的內容,王二我能力有限,就略過了。

5、multipartResolver

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8">
        <property name="maxUploadSize" value="1024000000"></property>
    </bean>

這顯然是控制檔案上傳的,我這裡先不做詳細的介紹,稍候我會用一整篇的文章來進行說明。

有關SpringMVC的三大XML(web.xml、application-context.xml、context-dispatcher.xml)暫時就先介紹到這裡,後續遇到新的問題,會重新把問題新增到系列文章中,為後來者鋪路,感覺很欣慰啊。

相關文章

感謝您閱讀【沉默王二的部落格】,如果王二的部落格給您帶來一絲幫助或感動,我(也就是王二)將不甚榮幸。
如果您碰巧喜歡,可以留言或者私信我,這將是我鼓搗更多優秀文章的最強動力。