1. 新建項目 IDEA中新建Maven項目,使用Maven Archetype原型:maven archetype webapp 新建項目結構為: 2. 新建包目錄 新建Java代碼目錄:src.main.java 下新建分層模型package,帶上項目的 (僅供參考) :存放全局變數,公共枚舉等 ...
1. 新建項目
IDEA中新建Maven項目,使用Maven Archetype原型:maven-archetype-webapp
新建項目結構為:
2. 新建包目錄
-
新建Java代碼目錄:src.main.java
src.main.java
下新建分層模型package,帶上項目的groupId
(僅供參考)-
common
:存放全局變數,公共枚舉等 -
base
:存放基礎組件,如工具類,過濾器,配置類等 -
controller
:控制層 -
vo
:前端傳輸過來的對象,如封裝的請求 -
bo
:業務對象,可能是多個dto/entity的整合 -
service
:業務層-
intf:介面
-
impl:實現
-
-
dao
:資料庫訪問層- intf:介面(MyBatis中為xxxMapper.java)
- impl:實現(MyBatis中自動生成實現類)
-
dto
:數據傳輸對象,存放多表聯合對象 -
entity
:實體,對應資料庫表
-
-
新建資源目錄:src.main.resources
3. 按需引入pom
新建工程後,不建議一次性引入所有的依賴,而是在需要的時候逐步引入,這樣雖然會踩很多坑,但是可以熟悉每個依賴的作用,防止以後踩更大的坑。
新建工程後,第一次需要引入的依賴有:
-
Servlet API
Java Web的應用伺服器會帶有Servlet API,所以這個依賴的scope設成provided
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency>
-
Spring Web Mvc
Spring Web依賴,包括Spring MVC,IDEA會把Spring Web Mvc所依賴的其他Spring模塊也引入,有:aop、beans、context、core、expression、web,其餘的模塊不用引,但是為了擴展性,還是引入比較好。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
4. 配置web.xml
4.1 配置ContextLoaderListener
ContextLoaderListener
是ServletContext監聽器,用於創建容器對象,並且將ApplicationContext對象放到Application域中,並指定spring核心配置文件。
關於ContextLoaderListener的具體作用及源碼,會另寫文章分析。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
4.2 配置DispatcherServlet
DispatcherServlet
是前端控制器,配置中指定Spring MVC的配置文件。
關於DispatcherServlet的具體作用及源碼,會另寫文章分析。
<servlet>
<servlet-name>springmvc</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
4.3 處理中文亂碼問題
配置CharacterEncodingFilter
過濾器處理中文亂碼問題,要放到所有過濾器之前。
<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>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.4 整合Restful風格請求
配置HiddenHttpMethodFilter
過濾器,將get/post請求轉換為標準的http方法,使得支持GET、POST、PUT與DELETE請求。
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5. 配置Spring配置文件
Spring配置文件路徑是配置在web.xml ContextLoaderListener
中。
初始的Spring配置文件需要配置包掃描,將滿足條件的Java Bean註入到Spring容器中,由Spring進行管理。
<!-- 設置包掃描,不掃描Controller -->
<context:component-scan base-package="com.lyldelove">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
6. 配置Spring MVC配置文件
Spring MVC配置文件路徑是配置在web.xml DispatcherServlet
中。
初始的Spring MVC配置文件需要配置以下3項:
- 包掃描。掃描所有Controller
- 開啟基於註解驅動的mvc。開啟後可使用Spring MVC的高級功能
- 配置預設的靜態資源處理器
- 配置視圖解析器
<!-- 設置包掃描,掃描所有的Controller -->
<context:component-scan base-package="com.lyldelove" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 開啟基於註解驅動的mvc,開啟後可使用Spring MVC的高級功能 -->
<mvc:annotation-driven/>
<!-- 配置預設的靜態資源處理器 -->
<mvc:default-servlet-handler/>
<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置解析前尾碼-->
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
靜態資源的處理,還可以通過<mvc:resources />來解析配置
7. 引入前端JS/CSS
前端所需的js/css等靜態文件,一般放在webapp
目錄下
8. 日誌框架整合
在整合其他框架的過程中,項目可能會有很多異常/報錯,我們需要通過日誌來查找問題。
日誌框架需要日誌門面及日誌實現,我們採用slf4j
做日誌門面,log4j
做日誌實現,看如何整合。
引入依賴:
<!-- 日誌,slf4j做日誌門面,log4j做日誌實現 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
引入slf4j-log4j12後,IDEA會自動引入slf4j-api和log4j的依賴,不需要再顯示引入
log4j
會自動掃描src/main/resources
目錄下的log4j.xml
或log4j.properties
,我們把配置文件放在此目錄下。
#log4j.properties
#日誌輸出級別
log4j.rootLogger=debug,stdout,D,E
#設置stdout的日誌輸出控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#輸出日誌到控制台的方式,預設為System.out
log4j.appender.stdout.Target = System.out
#設置使用靈活佈局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#靈活定義輸出格式
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} -[%p] method:[%c (%rms)] - %m%n
9. 數據源整合
以Druid為例,需要引入Spring JDBC
和Druid
的依賴,同時資料庫連接信息最好單獨出一個配置文件來管理,再在Spring配置文件中引入外部的配置文件。
依賴:
<!-- Spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 數據源Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
註意:要記得引入Spring jdbc的依賴,否則後面出問題會很難找(有日誌還好找一點,所以最好日誌框架的整合放到最前面)。
Spring配置:
<!-- 載入外部配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置Druid數據源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 指定連接池中最大的活躍連接數 -->
<property name="maxActive" value="20"/>
<!-- 指定啟動連接池時,初始建立的連接數量 -->
<property name="initialSize" value="1"/>
<!-- 指定連接池等待連接返回的最大等待時間,毫秒單位. -->
<property name="maxWait" value="60000"/>
<!-- 指定必須保持連接的最小值(For DBCP and Tomcat connection pools) -->
<property name="minIdle" value="1"/>
</bean>
10. MyBatis + MySql整合
依賴:
<!-- Spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- MyBatis整合spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- MySQL驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
Spring配置文件中配置MyBatis:
需要配置下麵2項:
- 配置sqlSessionFactory
- 配置映射掃描器
<!-- 配置MyBatis sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 指定MyBatis 的 XML 配置文件路徑 -->
<property name="configLocation" value="classpath:mybatis.xml"/>
<!-- 指定映射器 XML 文件路徑 -->
<property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
</bean>
<!-- 掃描MyBatis映射器 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lyldelove.dao"/>
</bean>
MyBatis配置文件:
在Spring配置文件sqlSessionFactory配置項中配置了MyBatis的配置文件,MyBatis的配置文件中,需要配置駱駝命名法則,還可以配置別名。
<settings>
<!-- 其餘駱駝命名法則,是的資料庫欄位可以對應JavaBean屬性 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 起別名,這樣在Mapper.xml文件中,resultType就可以簡寫,預設規則是JavaBean類名首字母小寫 -->
<typeAliases>
<package name="com.lyldelove.entity.system"/>
</typeAliases>
11. 需要深入挖掘的點
ContextLoaderListener
作用及源碼分析DispatcherServlet
作用及源碼分析- Filter過濾器工作原理
- Spring/Spring MVC配置文件解析及相關配置項的作用和源碼分析
- 日誌框架深入,配置項
- 日誌框架是如何整合進來的,實現原理
- 什麼是數據源