1. 程式人生 > >SpringMVC 基本配置及部分可複用的元件配置

SpringMVC 基本配置及部分可複用的元件配置

整理一下今年用過的SpringMVC及相關元件的配置

Spring版本4.2.0.RELEASE

web.xml版本3.0

GroupId為personal.cat

第一部分、基本配置

1、Spring+SpringMVC的骨架

依賴jar包

<!--Spring核心容器beans context context-support core expression-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</
artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency>
<groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId
> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <!--Spring面向切面程式設計--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!--Spring裝配與釋出--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument-tomcat</artifactId> <version>${spring.version}</version> </dependency> <!--Spring資料庫訪問與整合--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!--Spring測試--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--SpringWeb與遠端呼叫--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc-portlet</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> <!--使用RequestBody和ResponseBody時Java例項與Json轉化相關包--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.3</version> </dependency>

web.xml的基礎配置(僅配置Spring和SpringMVC容器、編碼過濾器)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <!--啟動頁面-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!--配置session過期時間(單位為分鐘)-->
    <session-config>
        <session-timeout>360</session-timeout>
    </session-config>
    <!--
        配置監聽器ContextLoaderListener
        在Web容器啟動時該監聽器會監聽到啟動事件從而執行它所實現的ServletContextListener方法
        它是Spring容器建立的發起者
    -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--
        ContextLoaderListener的配置檔案
        在param-value節點內宣告配置檔案的路徑
        如果有多個配置檔案可以用","隔開,也可以用applicationContext-*.xml這樣的萬用字元
        如果不宣告context-param,預設的路徑是"/WEB-INF/applicationContext.xml",檔名稱必須嚴格匹配且大小寫敏感
    -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml,classpath:spring/applicationContext-*.xml</param-value>
    </context-param>
    <!--
        配置SpringMVC的DispatcherServlet
        DispatcherServlet會自動攔截匹配規則的請求路徑並分發到相應的Controller層處理
    -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--
                DispatcherServlet的配置檔案
                在param-value節點內宣告配置檔案的路徑
                如果有多個配置檔案可以用","隔開,也可以用dispatcher-servlet-*.xml這樣的萬用字元
                如果不宣告context-param,預設的路徑是"/WEB-INF/<servlet-name>-servlet.xml",檔名稱必須嚴格匹配且大小寫敏感
            -->
            <param-value>classpath:spring/dispatcher-servlet.xml,classpath:spring/dispatcher-servlet-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!--配置DispatcherServlet攔截請求路徑的規則-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--配置編碼過濾器-->
    <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>
        <init-param>
            <!--是否檢查request.getCharacterEncoding()方法-->
            <param-name>forceEncoding</param-name>
            <!--true則強制覆蓋之前的編碼格式-->
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Spring容器的配置檔案applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    <!--
        註冊properties檔案的佔位符使Spring管理的SpringBean可以通過@Value("${key}")的方式直接引入配置檔案中的資料
        為避免中文亂碼,file-encoding設定為properties檔案的編碼格式
    -->
    <context:property-placeholder location="classpath:*.properties" file-encoding="GBK"/>
    <!--
        啟動Spring的元件掃描
        Spring通過掃描base-package下的Java類,通過註解來決定是否註冊為SpringBean
        當存在多個包路徑時可以使用","隔開
        這裡通過配置過濾器讓Spring在掃描包時忽略掉@Controller註解的Java類留給SpringMVC管理
    -->
    <context:component-scan base-package="personal.cat.*">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

SpringMVC容器的配置檔案dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--
        註冊properties檔案的佔位符使SpringMVC管理的SpringBean可以通過@Value("${key}")的方式直接引入配置檔案中的資料
        為避免中文亂碼,file-encoding設定為properties檔案的編碼格式
    -->
    <context:property-placeholder location="classpath:*.properties" file-encoding="GBK"/>
    <!--
        啟動Spring的元件掃描
        Spring通過掃描base-package下的Java類,通過註解來決定是否註冊為SpringBean
        當存在多個包路徑時可以使用","隔開
        這裡通過配置過濾器讓SpringMVC在掃描包時只裝載@Controller註解的JavaBean
    -->
    <context:component-scan base-package="personal.cat.*" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--
        SpringMVC高階註解驅動
        該驅動會預設註冊DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter兩個Bean,
        使Controller層可以使用@RequestMapping、@NumberFormatAnnotation、@DateTimeFormat、@Valid等註解並支援Jaxb和Json解析
    -->
    <mvc:annotation-driven/>
    <!--
        對靜態資源訪問的過濾
        靜態資源要統一放在webApp的static資料夾下
    -->
    <mvc:resources mapping="/static/**" location="/static/"/>
    <!--註冊檢視解析器,在沒有註解為@ResponseBody時自動為字串返回值加上/字首和.jsp字尾-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

第二部分、額外的元件

基於web.xml的配置,後續的檔案命名將符合applicationContext-*.xml和dispatcher-servlet-*.xml這兩種格式

由於applicationContext.xml和dispatcher-servlet.xml已經註冊了所有的.properties配置檔案的佔位符,後續的配置中無需再次引入

1、整合MongoDB

依賴jar包

<!--Spring整合Mongodb-->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.7.2.RELEASE</version>
</dependency>

裝載MongoTemplate的配置檔案applicationContext-mongo.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
    <!--配置MongoDB客戶端-->
    <mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}" credentials="${mongo.userName}:${mongo.password}@${mongo.database}">
        <mongo:client-options write-concern="SAFE" connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" socket-timeout="${mongo.socketTimeout}"/>
    </mongo:mongo-client>
    <!--
        註冊MongoTemplate
        使用配置好的MongoDB客戶端例項化MongoTemplate交給Spring容器管理
        MongoTemplate內部實現了連線池且執行緒安全
    -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongoClient"/>
        <constructor-arg value="${mongo.databaseName}"/>
    </bean>
</beans>

配置檔案引用的mongo.properties

#主機ip地址
mongo.host=127.0.0.1
#主機埠
mongo.port=27017
#鑑權資料庫名稱
mongo.database=admin
#訪問賬號
mongo.userName=root
#訪問密碼
mongo.password=root
#操作資料庫名稱
mongo.databaseName=test
#主機允許連線數量
mongo.connectionsPerHost=10
#主機允許的阻塞執行緒倍數,例如當前允許10個連線,那麼最大允許阻塞40個執行緒的訪問
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#資料庫連線超時時間
mongo.connectTimeout=1500
#獲取連線最大等待時間
mongo.maxWaitTime=15000
#查詢超時時間
mongo.socketTimeout=15000

2、整合Mybatis(連線池管理為Druid)

依賴jar包

<!--Spring整合Mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.0</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>
<!--Druid連線池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.0</version>
</dependency>

裝載SqlSessionFactoryBean的配置檔案applicationContext-jdbc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--
        註冊資料來源
        資料來源的連線池管理是Druid
    -->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="name" value="${jdbc.name}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="initialSize" value="${jdbc.initialSize}"/>
        <property name="maxActive" value="${jdbc.maxActive}"/>
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <property name="maxWait" value="${jdbc.maxWait}"/>
        <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="${jdbc.maxPoolPreparedStatementPerConnectionSize}"/>
        <property name="validationQuery" value="${jdbc.validationQuery}"/>
        <property name="testOnBorrow" value="${jdbc.testOnBorrow}"/>
        <property name="testOnReturn" value="${jdbc.testOnReturn}"/>
        <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
        <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
        <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
        <property name="filters" value="${jdbc.filters}"/>
    </bean>
    <!--註冊Mybatis的核心類SqlSessionFactoryBean-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--指定資料來源-->
        <property name="dataSource" ref="druidDataSource"/>
        <!--
            指定需要掃描的包路徑
            使Mybatis的mapper檔案在宣告ResultType時可以使用類名作為別名而不是實體類的全路徑
        -->
        <property name="typeAliasesPackage" value="classpath:personal.cat.entity"/>
        <!--指定sql對映檔案的路徑-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定SqlSessionFactoryBean,如果當前上下文中只定義了一個則該屬性可省略-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <!--指定持久層的介面路徑-->
        <property name="basePackage" value="personal.cat.dao"/>
    </bean>
    <!--註冊Spring的資料來源事務管理器-->
    <bean name="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="druidDataSource"/>
    </bean>
    <!--啟動註解式事務驅動-->
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
</beans>

配置檔案引用的jdbc.properties

這裡以Mysql為例,使用時需要額外引入mysql-connector-java包,否則ClassLoader在載入com.mysql.jdbc.Driver時會丟擲ClassNotFoundException

#資料來源名稱
jdbc.name=druidDataSource
#主機ip地址
jdbc.host=127.0.0.1
#主機埠
jdbc.port=3306
#操作資料庫名稱
jdbc.database=test
#資料庫連線路徑
#jdbc.url=jdbc:microsoft:sqlserver://${jdbc.host}:${jdbc.port};database=${jdbc.database}
#jdbc.url=jdbc:oracle:thin:@//${jdbc.host}:${jdbc.port}/${jdbc.database}
jdbc.url=jdbc:mysql://${jdbc.host}:${jdbc.port}/${jdbc.database}?useUnicode=true&characterEncoding=UTF-8
#訪問賬號
jdbc.username=root
#訪問密碼
jdbc.password=root
#資料庫驅動全路徑名
#jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.driverClassName=com.mysql.jdbc.Driver
#Druid連線池初始化連線數量
jdbc.initialSize=1
#Druid連線池可用連線數量上限
jdbc.maxActive=10
#Druid連線池最小空閒連線
jdbc.minIdle=1
#Druid連線池獲取連線最大等待時間
jdbc.maxWait=15000
#Druid連線池是否開啟PreparedStatement快取池
jdbc.poolPreparedStatements=false
#Druid連線池PreparedStatement快取池大小(當該項的值大於0時預設啟動PreparedStatement快取池)
jdbc.maxPoolPreparedStatementPerConnectionSize=-1
#Druid連線池校驗連線可用的查詢sql
jdbc.validationQuery=SELECT 1
#Druid連線池獲取連線時是否校驗
jdbc.testOnBorrow=true
#Druid連線池歸還連線時是否校驗
jdbc.testOnReturn=false
#Druid連線池連線空閒時是否校驗
jdbc.testWhileIdle=true
#Druid連線池每次掃描空閒連線的時間間隔
jdbc.timeBetweenEvictionRunsMillis=60000
#Druid連線池連線允許的最小空閒時間
jdbc.minEvictableIdleTimeMillis=300000
#Druid連線池通過別名的方式配置擴充套件外掛,常用的外掛:1、監控統計stat 2、日誌log4j 3、防禦sql注入wall
jdbc.filters=stat