Java開發框架搭建:配置文件

工欲善其事,必先利其器。咱們知道,Java開發最難的部分,就是初期框架的搭建工做。本文將記錄一個可用的Java開發框架的搭建過程,以期知足大多數Java項目的開發。css

本項目採用Maven管理Jar包,主要技術包括:html

  • MVC框架:SpringMVCjava

  • 數據庫:MySqlmysql

  • ORM框架:Mybatis程序員

  • 日誌組件:Log4j2web

  • 模板引擎:FreeMarkerajax

  • JS庫:jQuery-1.9spring

其它技術會隨着項目的變化而增刪。sql

1、pom.xml

如下爲pom.xml中所要依賴的jar包:chrome

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.1</version>
	<scope>test</scope>
</dependency>

<!-- servlet支持 -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
</dependency>

<dependency>
	<groupId>javaee</groupId>
	<artifactId>javaee-api</artifactId>
	<version>5</version>
	<scope>provided</scope>
</dependency>

<!-- spring jar包 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>4.0.5.RELEASE</version>
</dependency>

<!-- spring-context-support解決如下問題: java.lang.ClassNotFoundException:org.springframework.ui.freemarker.FreeMarkerConfigurationFactory -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>4.0.5.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>4.0.5.RELEASE</version>
</dependency>

<!-- springmvc jar包 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>4.0.5.RELEASE</version>
</dependency>

<!-- freemarker支持 -->
<dependency>
	<groupId>org.freemarker</groupId>
	<artifactId>freemarker</artifactId>
	<version>2.3.21</version>
</dependency>

<!-- 數據源支持 -->
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency>

<!-- Mybatis支持 -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.3.0</version>
</dependency>

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.2.3</version>
</dependency>

<!-- JSON -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.0</version>
</dependency>

<!-- 工具包 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.3.2</version>
</dependency>

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.3.2</version>
</dependency>

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.3.2</version>
</dependency>

<!-- 日誌 -->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.1</version>
</dependency>

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.1</version>
	<classifier>sources</classifier>
</dependency>

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.1</version>
</dependency>

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.1</version>
	<classifier>sources</classifier>
</dependency>

2、配置web.xml

若是是一個最簡單的web項目,web.xml並非必須的,但做爲一個能提供服務的web項目,web.xml充當着十分重要的角色。在web.xml中,咱們主要配置資源文件的位置、Spring監聽器、字符編碼過濾器以及SpringMVC攔截所有請求的servlet配置。另外,web.xml還能夠配置項目歡迎頁,項目產生異常時跳轉頁,Session過時時間等。

如下爲web.xml的配置狀況,一些簡單的配置說明都在相關節點以註釋形式列出。

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<display-name>通用後臺管理系統</display-name>
  	<!-- 
		1:指明配置文件位置,默認位置爲WEB-INF,默認文件名爲applicationContext.xml
		
		Q.	web.xml中classpath:和classpath*:  有什麼區別?
		A. 	classpath:只會到你的class路徑中查找找文件;   
			classpath*:不只包含class路徑,還包括jar文件中(class路徑)進行查找.
		
		Q.	位於不一樣目錄下的配置文件,該如何定義?
		A.  src的狀況,須要在web.xml中定義以下:  
			<context-param>  
				<param-name>contextConfigLocation</param-name>  
				<param-value>classpath:applicationContext.xml</param-value>  
			< /context-param>
			
			WEB-INF的狀況,須要在web.xml中定義以下:  
			<context-param>  
				<param-name>contextConfigLocation</param-name>  
				<param-value>WEB-INF/applicationContext*.xml</param-value>  
			< /context-param>
		
		Q.	如何添加多個配置文件?
		A.	<context-param>   
				<param-name>contextConfigLocation</param-name>   
				<param-value>   
					classpath*:conf/applicationContext_core*.xml,   
					classpath*:conf/applicationContext_bean*.xml,   
					classpath*:conf/applicationContext_jdbc*.xml,   
					classpath*:conf/applicationContext_log*.xml   
				</param-value>   
			</context-param>
	-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
	        classpath*:*config/*.xml
	    </param-value>
	</context-param>
	
	<!-- 
		2:初始化配置監聽器
		
		ContextLoaderListener的做用在於,容器啓動時自動裝配applicationContext.xml(默認狀況,可設置,參上)的配置信息
	 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- 
		3:字符編碼攔截器,解決中文亂碼問題
		
		中文編碼亂碼問題,是全部中國程序員最多見的問題之一。在使用SpringMVC時,尤爲作ajax請求,很容易出現亂碼問題。
		不少時候咱們會很奇怪,明明在tomcat的server.xml中配置了<Connector URIEncoding="UTF-8" ...>,結果仍是出現了亂碼。
		其實,這裏的配置只是對url進行了編碼處理,只要是get請求,參數都是經過url傳遞,是不會有亂碼問題的。但post請求時,
		由於參數都在請求體裏,這裏的編碼設置並不能影響請求體編碼,因此就容易出現亂碼。
		
		若是是firefox瀏覽器,post請求會自動帶上請求頭信息:content-type = application/x-www-form-urlencoded; charset=UTF-8
		因此firefox下SpringMVC可能會表現良好,沒有亂碼問題;
		但若是是chrome瀏覽器,它不會設置關於編碼的請求頭信息:content-type = application/x-www-form-urlencoded ,
		而SpringMVC默認又是採用的ISO-8859-1解析參數,就會出現亂碼
		
		解決方案:
		a.	配置請求映射時:@RequestMapping(value = "saveUserByJson", produces = { "text/json;charset=UTF-8" })
		b.	全局過濾,即如下配置,無需本身寫過濾器,spring已經提供CharacterEncodingFilter
	-->
	<filter>
		<filter-name>forceEncoding</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>forceEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 
		4:攔截處理全部請求
		
		DispatcherServlet主要用做職責調度工做,自己主要用於控制流程,主要職責以下:
		a、文件上傳解析,若是請求類型是multipart將經過MultipartResolver進行文件上傳解析;
		b、經過HandlerMapping,將請求映射處處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);
		c、經過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);
		d、經過ViewResolver解析邏輯視圖名到具體視圖實現;
		e、本地化解析;
		f、渲染具體的視圖等;
		g、若是執行過程當中遇到異常將交給HandlerExceptionResolver來解析。
		
		能夠看出,使用SpringMVC時,幾乎大部分功能都是經過該servlet請求轉發的。
		
		DispatcherServlet默認是以WebApplicationContext做爲上下文的,默認的配置文件爲[servlet-name]-servlet.xml,
		好比這裏的servlet-name是spring,因此默認的配置文件應該是spring-servlet.xml,且默認狀況下,這個文件應放在WEB-INF目錄下。
		
		也能夠經過初始化參數來設置上下文的配置文件,方式以下。
	-->
	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
            <param-value>classpath*:*config/spring-servlet.xml</param-value>
		</init-param>
	</servlet>

	<!-- 
		5:映射攔截請求路徑
		
		url-pattern配置爲/,不帶文件後綴,會形成其它靜態文件(js,css等)不能訪問。如配爲*.html,則不影響靜態文件的訪問
	-->
	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>

	<!-- 
		6:指定系統歡迎頁
		該設置指定,當用戶訪問到目錄時,系統依次嘗試訪問如下頁面,直到發現可用的頁面
	 -->
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.html</welcome-file>
		<welcome-file>default.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
	</welcome-file-list>
	
	<!-- 
		7:錯誤頁面
		
		error-page配置用於在用戶請求資源時發生錯誤的狀況下,提供默認的頁面以提示用戶。好比用戶請求了不存在的資源,
		若是不作設置,用戶就會看到簡單粗暴的404錯誤頁面;再好比系統實現中存在漏洞,在各類條件下觸發空指針異常,用戶就會
		看到一大段的異常堆棧。這些都是不友好的用戶體驗,而error-page則幫咱們實現了在指定錯誤下跳轉到指定頁面的功能。
		
		error-code指出在給定http錯誤碼返回時,要展現給用戶的頁面;而exception-type則表示在系統出現某種異常時,要展現給
		用戶的頁面。
	 -->
<!-- 	<error-page>   -->
<!-- 		<error-code>404</error-code>   -->
<!-- 		<location>/WEB-INF/common/404.html</location>   -->
<!-- 	</error-page> -->
	
<!-- 	<error-page>   -->
<!-- 		<error-code>500</error-code>   -->
<!-- 		<location>/WEB-INF/common/500.html</location>   -->
<!-- 	</error-page> -->
	
<!-- 	<error-page> -->
<!-- 		<exception-type>java.lang.NullPointerException</exception-type>   -->
<!-- 		<location>/WEB-INF/common/nullpointer.html</location>   -->
<!-- 	 </error-page> -->
	  
	<!-- 
		8:設置session過時時長
		
		當session查出session-timeout指定的時長時,整個session就會過時。
		session-timeout的單位是分鐘,因此下面的配置session會在用戶3小時無操做時過時
	-->
	<session-config>
		<session-timeout>180</session-timeout>
	</session-config>
	
</web-app>

3、applicationContext.xml和spring-servlet.xml

默認狀況下,咱們須要在WEB-INF目錄下爲Spring加入一個名爲applicationContext.xml的配置文件,還要爲SpringMVC加入一個名爲spring-servlet.xml的配置文件。但由於咱們在web.xml中配置了contextConfigLocation的全局參數,Spring就會到這個參數所指定的目錄查找符合條件的文件做爲配置文件。

applicationContext.xml是Spring的全局配置文件,在這個文件中,咱們一般會配置諸如AOP、數據庫鏈接、通用Bean等。而spring-servlet.xml中,配置的則經常與MVC相關的內容,好比控制器、攔截器等。實際上applicationContext.xml對應的容器是spring-servlet.xml對應容器的父容器,在MVC中須要的Bean若是在沒法在spring-servlet.xml中查找到,就會在上一級容器,即applicationContext.xml對應的容器中查找。

如下爲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:mybatis="http://mybatis.org/schema/mybatis-spring"
	   xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!--數據庫鏈接-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
	    <property name="url" value="jdbc:mysql://localhost:3306/tangsystemdb?useUnicode=true&amp;characterEncoding=UTF-8" />
	    <property name="username" value="root"/>
	    <property name="password" value=""/>
	    <!-- 配置初始化大小、最小、最大 -->
	    <property name="initialSize"><value>1</value></property>
	    <property name="maxActive"><value>5</value></property>
	    <property name="minIdle"><value>1</value></property>
	    <!-- 配置獲取鏈接等待超時的時間 -->
	    <property name="maxWait"><value>60000</value></property>
	    <!-- 配置間隔多久才進行一次檢測,檢測須要關閉的空閒鏈接,單位是毫秒 -->
	    <property name="timeBetweenEvictionRunsMillis"><value>60000</value></property>
	    <!-- 配置一個鏈接在池中最小生存的時間,單位是毫秒 -->
	    <property name="minEvictableIdleTimeMillis"><value>300000</value></property>
	    <!--
	    <property name="validationQuery"><value>SELECT 'x'</value></property>
	    <property name="testWhileIdle"><value>true</value></property>
	    <property name="testOnBorrow"><value>false</value></property>
	    <property name="testOnReturn"><value>false</value></property>
	    <property name="poolPreparedStatements"><value>true</value></property>
	    <property name="maxOpenPreparedStatements"><value>20</value></property>
	     -->
 	</bean>
 	
 	<!-- mybatis配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations">
            <list>
                <value>classpath:mapper/*.xml</value>
            </list>
        </property>
    </bean> 
    
    <!-- 經過掃描的模式,掃描目錄在tang/system/mapper目錄下,全部的mapper都繼承SqlMapper接口的接口, 這樣一個bean就能夠了 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="tang.system.mapper"/>
    </bean>
</beans>

注意其中JDBC的URL配置,若是你的項目中存在數據庫插值亂碼,則可能你沒有配置數據庫鏈接的字符編碼。同時這個URL中&符號須要轉移爲&amp;。

另外,關於mybatis的配置中,設置了映射器配置文件爲mapper目錄下全部xml文件。

spring-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:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
	<!-- 一、激活@Controller註解功能 在SpringMVC中,若是要使用Controller註解,就必定要配置<mvc:annotation-driven 
		/>, 參考http://blog.csdn.net/tang19880721/article/details/40475763 <mvc:annotation-driven/>至關於註冊了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter兩個bean, 
		配置一些messageconverter,它們都是spring MVC爲@Controllers分發請求所必須的。它還提供了數據綁定支持, @NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,讀寫XML的支持(JAXB),讀寫JSON的支持(Jackson)。 
		在spring mvc 3.1以後版本,註冊的bean也發生了變化: DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping 
		AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter AnnotationMethodHandlerExceptionResolver 
		-> ExceptionHandlerExceptionResolver -->
	<mvc:annotation-driven />

	<!-- 二、自動掃描bean兵自動依賴注入 配置該標籤後,spring會自動掃描base-package包及其子包下的java類,並將掃描到的@Component、@Controller、 
		@Service等這些註解的類註冊爲bean。若是配置了 對包中的全部類進行掃描,以完成Bean建立和自動依賴注入的功能 須要更改 -->
	<context:component-scan base-package="tang.system.*" />

	<context:annotation-config />
	<!-- <mvc:resources mapping="/styles/**" location="/WEB-INF/resource/styles/"/> -->

	<!-- Freemarker配置 -->
	<bean id="freemarkerConfig"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
		<property name="freemarkerSettings">
			<props>
				<prop key="template_update_delay">0</prop>
				<prop key="default_encoding">UTF-8</prop>
				<prop key="number_format">0.00</prop>
				<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
				<prop key="classic_compatible">true</prop>
				<prop key="template_exception_handler">ignore</prop>
			</props>
		</property>
	</bean>

	<!-- 針對freemarker的視圖配置 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		<property name="cache" value="true" />
		<property name="suffix" value=".ftl" />
		<property name="contentType" value="text/html;charset=UTF-8"></property>
		<property name="requestContextAttribute" value="request" />
		<property name="exposeSpringMacroHelpers" value="true" />
		<property name="exposeRequestAttributes" value="true" />
		<property name="exposeSessionAttributes" value="true" />
	</bean>

	<mvc:interceptors>
		<!-- 全局攔截器,該攔截器爲模板提供basePath參數 -->
		<bean class="tang.system.interceptor.BasePathInterceptor" />
	</mvc:interceptors>
</beans>

這裏須要說明的是,因爲在FreeMarker的配置中,設置了templateLoaderPath爲/WEB-INF/ftl意味着咱們在Controller中返回的頁面模板會默認到這個目錄下去查找。同時因爲設置subffix爲.ftl,Controller中返回的頁面模板就不須要再註明後綴了。總得來講,咱們須要將ftl文件放置在WEB-INF/ftl目錄下,後綴爲ftl。若是咱們在Controller中返回/admin/index,表示返回的頁面模板是WEB-INF/ftl/admin/index.ftl。 

上面的配置中添加了一個攔截器,BasePathInterceptor,這個攔截器很簡單,就是將項目的跟路徑保存在request中,以便在模板中使用這個路徑訪問資源。

4、Log4j2.xml

Log4j2的使用相對比較簡單,首先引入log4j-api.jar和log4j-core.jar,而後在classpath下加入log4j2.xml配置文件,剩下的就在項目中使用Logger輸出日誌了。

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
	<appenders>
		<Console name="Console" target="SYSTEM_OUT">
			<ThresholdFilter level="trace" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
		</Console>
		<File name="log" fileName="logs/opt.log" append="false">
			<PatternLayout
				pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
		</File>
		<RollingFile name="RollingFile" fileName="logs/opt.log"
			filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
			<PatternLayout
				pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
			<SizeBasedTriggeringPolicy size="500 MB" />
		</RollingFile>
	</appenders>
	<loggers>
		<root level="trace">
			<appender-ref ref="RollingFile" />
			<appender-ref ref="Console" />
		</root>
	</loggers>
</configuration>

以上是一個JavaWeb工程的基本配置,它集成了SpringMVC、Mybatis、Log4j2等框架,在此基礎上,只須要添加不一樣的業務代碼便可完成一個簡單的項目。在後續的過程當中,有必要的狀況下咱們會逐步完善這個框架,並使用這個框架完成一個項目,豐富它的功能。

相關文章
相關標籤/搜索