以前都是在現有框架下進行寫代碼或者老是看一些別人的架構,總會眼高手低。因而打算本身完整的走一遍流程,同時把所遇到的問題,思考的問題記下來,供你們參考。因爲是工做年限不高,屬於新手,不足之處還請各位大牛指正。css
項目選用Spring爲基礎框架,因爲目前項目中採用的是Hibernate(在多表關聯查詢方面以及複雜的統計計算方面,同時要兼顧性能的時候吃了很多苦頭),因此這裏採起Mybatis作持久化框架(沒實戰搭建過),Spring MVC框架。在權限控制方面現有項目中採用的是shiro(爲了學習,這裏使用spring security)。其餘的細節問題會在下面各小節中敘述。html
另說明一點的是操做系統是mac。前端
github項目源碼在https://github.com/sjlian/sjlian 歡迎clone並提出意見。java
首先安裝和配置環境,主要包括jdk、mysql、maven等,其餘如redis、nginx、ActiveMQ等在初始版本還暫時沒上傳和使用。這些入門知識再也不贅述。mysql
在idea上新建一個mvn項目,而後有一個create from archetype,裏面有不少選項,因而有個疑問到底用哪一個呢?遂逐一查看名字,看到mvn-archetypr-webapp,聽名字就以爲和本身的預期是同樣的啊,因而果斷選擇。期間又試了下其餘的各個archetype,發現這這是一個模板,能夠根據本身須要選擇,也能夠默認缺省的。這裏附上mvn官方標準化的目錄結構以下圖:nginx
一個好的程序員都善於用命令行的方式解決問題,因而思考怎麼用mvn命令行建立項目。最簡單的方式就是mvn archetype:generate,這個命令是默認的 archetype,若是須要生成特定模板的項目呢?從maven的Repository裏查找arche types發現有幾百個,咱們平時用的也就那麼幾個,因爲太多就變得很不方便起來,因而搜索資料,查到 http://maven.40175.n5.nabble.com/archetype-catalog-xml-location-archetype-crawl-versus-archetype-generate-td113741.html git
完善目錄結構大體如上圖(是demo最終版本),這個時候只須要在java目錄下新建幾個包,進行分層,使項目結構變得清晰。程序員
common主要放置一些通用的非工具類,如exception相關,結果相關,攔截器,servlet,VO類等。github
Controller、DAO、model、service顧名思義,分別是控制層、持久層、數據模型層、業務處理層。web
util主要存放各類工具類,例如字符串、時間、poi、郵件、ip等
resource主要是配置文件,包括spring相關配置文件、mybatis配置文件、mybatis映射文件、日誌配置文件等
web-inf下最重要是web.xml,做爲啓動須要首先加載的文件,引入其餘配置文件、配置listener、servlet、filter、Interceptor等。
其餘是和前端相關文件
test是和測試相關。
建好以上目錄,開始進入正題。
web程序啓動會去讀取它的配置文件 web.xml,首先須要配置web.xml,添加上spring的監聽器、spring mvc的Servlet。
ContextLoaderListener 它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啓動容器時,就會默認執行它實現的方法。在ContextLoaderListener中關聯了ContextLoader這個類,因此整個加載配置過程由ContextLoader來完成。
RequestContextListener implements ServletRequestListener,監聽用戶的請求,用於日誌系統,不是必需的。
IntrospectorCleanupListener監聽器主要用於解決java.beans.Introspector致使的內存泄漏的問題(Quartz,Struts),若是沒有struts和quartz不是必需的。
Spring MVC 以自啓動servlet的形式加載,同時引入相關spring/spring-mvc.xml配置文件。文件路徑classpath:開頭,從classpath加載,不然嘗試URL,若是失敗,調用 getResourceByPath。
此外,爲了防止中文亂碼,須要encodingFilter;設置session超時時間、用戶自定義Listener、servlet、filter、interceptor等。
直接把Listener複製到xml中,會發現ide並不識別,是由於相關依賴尚未導入項目中的緣由。 在pom.xml中引入spring相關,引入的時候會發現depency有一些屬性值,如groupId、artifactId等,對於開源項目來講,這兩項是固定的,按照文檔導入便可,version是版本號,爲了便於升級和管理,建議版本號統一配置。
有時候會發現還有scope屬性,如junit的scope屬性值是test用於test任務時使用;compile(default)編譯時使用;provided相似於編譯但支持你期待jdk或者容器提供,相似於classpath;runtime在執行時須要使用;system須要外在提供相應得元素。經過systemPath來取得;
有時候會遇到依賴衝突,例如同時導入了A、B包,可是A包又引用了B包,當版本不一致時就會衝突,解決方式是mvn dependency:tree 分析衝突的包,而後在相應的A包中配置<exclusions> 把B包排除在外。
若是想引入本地依賴,一、使用scope system和systemPath指向依賴包;二、mvn install命令進行安裝並配置group和artifact,而後直接引入。三、創建pom依賴關係。POM關係主要爲依賴,繼承,合成,在這個小項目中用不到,且不是重點,故略去。
spring-mvc.xml主要配置以下。
1.開啓註解模式就可使用註解方式@ResponseBody,@RequestMapping等。
2.對於靜態的jpg、css等不須要經過mvc。
3.添加先後綴,注意路徑。
4.掃描controller的bean,讓spring知道哪些是controller(@Controller)。
若是須要對返回值進行json統一化處理,在這裏能夠引入json處理,如fastJson、jackson等。fastJson輕量級速度快,可是支持有輕微漏洞,jackson靈活性好,可是比較笨重,這裏選用的是fastJson,配置以下。
若是須要上傳文件,還須要配置文件上傳,以下:
web.xml中引入配置文件,該配置文件做爲spring基礎配置文件,再引入其餘文件。
spring.xml中配置以下,這裏注入service、引入mybatis、security配置,配置事務管理、開啓聲明是式事務(@transtraction)。
在spring.xml中引入了spring-mybatis.xml,用於Mybatis和spring的整合配置。同時pom.xml中引入相關依賴。
1.配置數據源,數據庫鏈接池,能夠選擇的有c3p0、druid、dbcp、HikariCP等,這裏選擇阿里的開源框架druid,配置以下。url、username等建議寫在property文件中。
2. 配置sessionFactory, 引入mybatis全局配置文件、entity使用別名,掃描mapping.xml
3. 配置DAO接口,注入Srping容器中。
4. 配置mybatis-config.xml
因爲mybatis不支持jpa,不能由實體映射數據表,因此須要本身新建數據表和數據實體。
可使用工具由數據表生成數據實體。
數據實體在model目錄下。
映射文件在resources/mapper下,若是設置了自動轉換對象關係名,這裏不在須要配置對象關係的名稱映射,可是須要注意命名的書寫,注意namespace一致。
DAO接口文件在dao目錄下,DAO實如今mapper的xml中,select/update id和接口中的方法對應便可。在service注入dao的時候會提示沒法注入的錯誤,忽略便可。
在service下定義接口,在service/impl/下定義實現,加上@Service註解
在Controller目錄下,能夠實現封裝好的json數據、string鏈接、ModelAndView。
log4j,配置log4j.properties。以下
而後能夠利用filter作請求參很多天志輸出。
利用aop作一些其餘日誌輸入。
先後端json數據交互,自定義ResponseResult,包括頭信息(狀態碼,錯誤信息說明,異常),數據信息。
異常經過@ControllerAdvice 捕獲到而後封裝處理返回給前端,不至於頁面報錯,或者自定義異常彈窗。
各類工具類提取
使用spring security,目前仍是半成品,之後完善。