SpringMVC 基本配置及部分可複用的元件配置
阿新 • • 發佈:2019-01-13
整理一下今年用過的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