需求分析html
1 用例圖java
系統設計web
包及全局配置spring
數據庫設計數據庫
工具類編程
具體功能實現架構
1 dao層功能實現app
2 編碼過濾器及登錄攔截器框架
3 單元測試webapp
遇到的問題總結
1 新建一個Modul不會打開新頁面
2 導入依賴時標紅
3 Resources中文件名稱有點但不意味着分層
4 不一樣模塊輸出的日誌不一樣
5 ${catalina.base}位置在何處
6 /* 和 / 的區別
7 設置頁面的根URL並統一導入
1 用例圖
用例圖是由產品經理產生的,主要是從用戶的角度分析產品的功能和動態行爲
上圖主要是從人員的角度來分析整個系統。這個系統最重要的步驟就是處理報銷單,那麼處理報銷單的流程以下圖所示
對於整個系統採用SSM框架,並採用三層架構的方式 :持久層——Mybatis、表現層——Spring MVC、業務層——JavaBean。每層分別對應的列名爲oa_dao、oa_web、oa_biz。
對於配置這一點其實在一開的階段並無辦法作到面面俱到,只能規定一些命名規範。對於全局的配置能夠參考註釋。
根據用例的分析,和項目的需求應該設計出整體的數據庫
在編程中經常須要一些輔助類來幫助實現功能,所以有了工具類,可是這些工具類可能一開始並不肯定有哪些,所以工具類下的各類類是隨着代碼的需求變化的。
1 dao層功能實現
部門管理
部門與員工相似都須要增刪改查操做,可是部門更的屬性跟簡單一點,所以先寫部門管理,代碼的具體實現流程爲:
實體類——dao接口——mapper映射方法——biz層接口——biz層實現接口——表現層實現
在部門裏具體編寫代碼時就是按照常規的CRUD進行的,具體代碼的分析能夠參考源代碼中註釋。其餘模塊的功能是相似的,只要分析一下源碼就能夠了
2 編碼過濾器及登錄攔截器
這兩個功能在oa_web中global包下,是比較經常使用的功能,具體分析能夠參考代碼註釋。
3 單元測試
當寫完功能代碼後須要進行單元測試,具體的單元測試代碼能夠查看源碼及註釋。下面只是給出所用到的依賴
<!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- Spring test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency>
具體的代碼能夠參考項目的源碼
1 新建一個Modul不會打開新頁面
由於想要在原有的project上要新建一個新的項目,所以直接按照以下操做,可是發現一隻都是在原頁面上打開的不會新建一個頁面,後來發現這是我操做失誤了。
正確操做:選擇上面的Project,而後選擇Maven建立一個新的空白項目就會打開一個新的頁面。
2 導入依賴時標紅
在pom.xml時導入依賴發現標紅了以下圖所示,後來發現是這是由於idea導入出現了問題的緣由,能夠右鍵項目,選擇Maven-Reimport。
當還不行時就把之前導入的所有刪除再從新導入便可。
3 Resources中項目文件有點但不意味着分層
在dao層有兩個名字同樣的文件夾,可是所表示的意義是不一樣的,在java中表示的包,採用com.imooc.oa會自動的在本地建立com\imooc\oa文件夾可是在resources中直接寫com.imooc.oa.dao其實只會在本地中建立一個com.imooc.oa.dao的文件夾,並無層次目錄結構的。一開始由於不清楚這個致使排查了很久的錯誤。
4 不一樣模塊輸出的日誌不一樣
在測試logback時分別在oa_dao,oa_biz進行了日誌測試,發如今oa_dao測試日誌時並無任何新的文件產生,只是在控制檯上有日誌輸出;在oa_biz時發如今該項目的路徑下建立了一個新的文件夾catalina.base_IS_UNDEFINED而後在這個文件夾下面有日誌記錄。
這些問題產生的緣由是由於配置文件的設置,這些問題其實本質上而言都是正常的,在配置中有日誌設置:${catalina.base}/logs/webapps可是在biz中並無配置Tomcat有到哪裏去找Tomcat的文件目錄那,所以在biz項目新建立了一個文件夾,文件名字其實已經說明問題了:is undefined 沒有被定義。
注:其實在真實項目中應該只在oa_web中配置這個日誌模塊就能夠了,在這裏是爲了學習,所以在每一個模塊中都配置了一個logback.xml。
5 ${catalina.base}位置在何處
其實只要看控制檯的輸出就能夠明白
此外控制檯日誌其實還有許多有效的信息能夠查看的
而下面則是記錄了尋找logback配置文件的過程
注:此處並非說必定要把全部的日誌打印所有看懂,可是必定要明白這些日誌記錄的信息,其實好多問題的出現都是由於不瞭解內部工做。
6 /* 和 / 區別
在SpringMVC的配置中若是採用/*進行匹配的話就會形成每個頁面都登陸不進去
<servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
< url-pattern > / </ url-pattern > 不會匹配到*.jsp,即:*.jsp不會進入spring的 DispatcherServlet類 。
< url-pattern > /* </ url-pattern > 會匹配*.jsp,會出現返回jsp視圖時再次進入spring的DispatcherServlet 類,致使找不到對應的controller因此報404錯。
總之,關於web.xml的url映射的小知識:
< url-pattern>/</url-pattern> 會匹配到/login這樣的路徑型url,不會匹配到模式爲*.jsp這樣的後綴型url
< url-pattern>/*</url-pattern> 會匹配全部url:路徑型的和後綴型的url(包括/login,*.jsp,*.js和*.html等)
在這個項目中:由於用了/,不會攔截jsp文件,那麼首先會打開index.jsp,在index.jsp中有一個路徑跳轉action那麼這個action便會被攔截開始執行流程。
7 設置頁面的根URL並統一導入
沒有配置前,在Tomcat設置中只要一修改Application context中的名稱就會形成項目崩潰。
後來發現緣由是由於整個項目路徑是寫死的,所以要把項目改爲能夠靈活配置的,下面的代碼是獲取到頁面的根url。
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; request.setAttribute("ctx", basePath); %>
通常使用上述語句來獲取當前頁面的根url,在代碼中使用${ctx}便可得到所配置的url
<!-- 爲全部的頁面都引入一個共同的頁面 --> <jsp-config> <jsp-property-group> <!-- 全部的頁面 --> <url-pattern>*.jsp</url-pattern> <!-- 待引入頁面的jsp路徑--> <include-prelude>/WEB-INF/路徑</include-prelude> </jsp-property-group> </jsp-config>
通常設置根url的在index.jsp中或者某些公共的jsp文件中,能夠在web.xml中配置讓全部的jsp文件都導入這個只有根url的jsp文件,在其餘jsp文件中只須要引入一個base便可。
<base href="value">
當引入公共的頭部後還要在index.jsp重定向一次。
0