JavaWeb專案開發從0開始的要點!
前言
本文章詳細的列出了開發一個傳統JavaWeb專案需要注意的要點,從環境準備開始到三層架構搭建,需要注意的地方全部羅列出來。
第一部分:環境準備
1. Maven命令建立web骨架
mvn archetype:create -DgroupId=net.rocketa -DartifactId=mywebapp -DarchetypeArtifactId=maven-archetype-webapp
注意web servlet版本(web.xml,3.1),Junit版本指定為4.X(這樣Spring好通過註解的方式來執行單元測試)
2. 注意在IDEA中需要設定好MAVEN工程的Sources/Tests/Resources/Test Resources屬性。
3. 日誌依賴
slf4j:規範和介面
具體的日誌實現有:
log4j、logback、common-logging
因此我們一般是使用slf4j介面+一種具體的日誌實現+slf4j和這個具體日誌實現的依賴整合
4. 資料庫依賴
有2個依賴,需要注意,一個是驅動,一個是資料庫連線池(C3P0,DBCP...)。
驅動JAR包是執行期需要包含,編譯期不需要的。
5. 持久層框架依賴
說白了,DAO層的框架依賴:MyBatis or Hibernate or ....
比如除MyBatis本身的依賴需要引入之外,還需要引入MyBatis和Spring的整合依賴。
6. Web層依賴
比如,JSP中使用到的一些JSTL、標籤、Ajax訪問JSON等,還有需要注意的是,在編譯期需要引入servlet-api。
7. Spring核心依賴
spring-core、spring-beans、spring-context
8. Spring和DB之間的整合依賴
Spring是需要介入DB的管理的,比如它的宣告式事務。
spring-jdbc、spring-tx
9. Spring對Web的一些整合依賴
spring-web、spring-webmvc
10. Spring對Junit的支援依賴
spring-test
NOSQL對事務的支援不是很好,它主要追求的是效能、高可用、分散式。
MySQL等關係型資料庫對事務的支援是很成熟的,也是很可靠的落地方案。
第二部分:DAO層
NOSQL對事務的支援不是很好,它主要追求的是效能、高可用、分散式。
MySQL等關係型資料庫對事務的支援是很成熟的,也是很可靠的落地方案。
1. 表
可以在專案中建立一個SQL檔案,便於SQL的管理。
注意,表的儲存引擎(事務的支援:innodb)、自動增長的特性、編碼、主鍵和索引。
一個良好的習慣是:為所有的表都新增一個建立時間欄位,用於記錄,方便排查。
應該為表名、列名新增註釋,方便其他工程師查閱。
應該注意SQL技巧,比如插入存在唯一約束的表中,如果出現衝突不想報錯的話,可以:insert ignore into ….(可以通過返回的影響行數來進行判斷)
2. Dao層實體
一些業務物件的建立,setter/getter/toString等就不說了,需要特別注意的是,除了表的欄位之外,還需要什麼屬性?這裡涉及到一個一對一、一對多,多對多的概念!
3. Dao層介面和mapper sql
MyBatis的特點:從SQL(引數+sql)對映到Entity/List(定製SQL、自由傳遞引數、結果集自動賦值)
使用MyBatis的方式:SQL寫在XML中,或者註解提供SQL。更加推薦的是XML,因為更加靈活,XML提供的動態拼接功能也是比註解簡單的多。
一個全域性的mybatis配置檔案+具體的SQL檔案+DAO介面:讓我們只需要設計介面,關注業務邏輯,解放出來。
在全域性mybatis配置檔案中重點注意:是否開啟駝峰轉換,獲取資料庫自增主鍵,列別名替換列名等。
注意DAO介面和具體的SQL檔案之間的對應關係。
具體SQL寫法中,比如#{},等需要引起注意。
輸入引數型別parameterType,如果是多個基本型別,那麼不用給出來。
即便返回的是List物件,我們的resultType依然指定的是集合中的物件型別。
在Mybatis的SQL檔案中是可以通過OGNL表示式來對物件中的一些物件型別的屬性進行賦值的!
表名.xxx 或者 表名.xxx as yyy 對於Mybatis而言,會忽略表名.字首,也會忽略as。
另外,注意在Dao介面中,如果方法有多個基本型別引數,別忘了通過@Param來進行執行期引數標記!
總結:Dao層的工作逐漸演變成介面設計和SQL編寫了,這種程式碼和SQL的分離方式,便於我們進行review,而Dao的拼接將在Service層完成。
4. 一些優化配置
比如,對帶包路徑的型別進行簡化,通過配置掃描包。
比如,批量掃描SQL檔案,通過自動掃描配置檔案。
5. mybatis和spring需要整合
spring需要接管資料庫
JDBC的一些連線資訊,資料庫連線池的一些配置資訊,就是配置DataSource的過程。
spring和mybatis整合的核心
SqlSessionFactory是MyBatis的配置核心,把DataSource注入,並指明MyBatis的全域性配置檔案位置,typeAliasesPackage掃描,mapper檔案位置掃描等。
spring通過動態代理幫助生成Dao的代理實現類(MapperScannerConfigurer)
注入SqlSessionFactory(通過sqlSessionFactoryBeanName),指明Dao介面的包路徑basePackage
總之,配置的一項原則是:約定優於配置!!!
第三部分:進行Spring Junit單元測試
當我們進行了一些配置,寫了一些SQL,Dao介面後,應該要進行Spring Junit單元測試,可以通過IDEA快速的生成測試用例(很好用的一個功能,因為IDEA可以幫助我們快速在test下建立與dao/service介面的同級目錄下生成用例)
在用例中,我們只需要在類上打上註解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring配置檔案"})
載入Spring容器後,我們就可以在用例中注入物件,開始測試了!!!
第四部分:Service層
Service層需要關注幾個要點:
業務物件的封裝、web和service之間進行資料傳遞的DTO、異常的處理(業務異常)
注意Spring事務回退的預設機制是:執行時異常。
因此,我們在service層預設定義的業務異常一般extends RuntimeException。
一般而言,通過:
try{
}catch(業務異常1 e1){
}catch(業務異常2 e2){
}catch(Exception e){
throw new 業務異常(...);
}
要知道,service層可能會發生業務異常,也可能發生一些其他異常,為了Spring都可以感知到,這裡會把Exception異常轉化成執行時異常
第五部分:Controller層
1. Restful
一種優雅的URI表述方式;資源的狀態;狀態的轉移
Restful示例:
GET /product/list 查詢操作
GET /product/{productId}/detail
GET /product/time/now
POST /product/{productId}/execution 新增、修改操作【非冪等性】
POST /product/{productId}/{userId}/order
DELETE /product/{productId}/delete 刪除操作
PUT 修改操作【冪等性】
URL設計:
/模組/資源/{標示}/集合1/...
2.Controller中請求方法的細節處理
考慮幾個方面:請求引數繫結、請求方式限制、轉發與重定向、資料模型賦值、JSON資料返回、Cookie訪問
@RequestMapping(value="/{productId:d+}/detail",method=RequestMethod.GET,produces={"application/json;charset=UTF-8"})
@ResponseBody
public String detail(
@PathVariable("productId") Long productId,@CookieValue(value="userId",required=false) Long userId,Model model){
# return "rediect:/xxx/yyy"
# return "forward:/xxx/yyy"
# return "view"
}
3.整合配置Spring MVC
在web.xml中配置DispatcherServlet攔截請求,並指出Spring相關的配置檔案。
開啟Spring MVC的註解模式:
靜態資源請求採用預設的servlet配置
配置JSP、ViewResolver的prefix「如/WEB-INF/jsp」suffix「如.jsp」
掃描web相關的Controller:
OK,先整理到這裡。
原文釋出時間為:2018-11-25
本文來自雲棲社群合作伙伴“網際網路架構師”,瞭解相關資訊可以關注“網際網路架構師”。
相關文章
- Vue-Cli 3.0從0 開始搭建專案(篇1)Vue
- 為什麼程式要從0開始計數
- 從0開始搭建preact開發環境React開發環境
- 【敏捷0】敏捷專案管理-為什麼從敏捷開始?為什麼從PMI-ACP開始?敏捷專案管理
- 從0開始學VUE - 執行第一個VUE專案Vue
- webpack入門級 - 從0開始搭建單頁專案配置Web
- 從0開始用MavenMaven
- 用C++從0開始開發自己的程式語言C++
- 從零開始的爬蟲專案(一)爬蟲
- 從 0 開始學架構架構
- 從 0 開始瞭解 DockerDocker
- 從0開始fastjson漏洞分析ASTJSON
- 從0開始開發網頁,需要學什麼?(小白向)網頁
- 從0開始的高併發(一)--- Zookeeper的基礎概念
- 從0開始學習Webpack(一)Web
- 從0開始fastjson漏洞分析2ASTJSON
- 從零開始React專案架構(六)React架構
- 從零開始React專案架構(五)React架構
- 從零開始React專案架構(三)React架構
- 從零開始React專案架構(一)React架構
- 從零開始React專案架構(二)React架構
- 從零開始React專案架構(四)React架構
- 從零開始搭建一個vue專案Vue
- 從0開始搭建自己的直播平臺
- 從零開始:Django專案的建立與配置指南Django
- webpack4.X 實戰(二):從0開始搭建一個 簡單的前端專案Web前端
- 從0開始學遊戲開發-蔡能-極客時間遊戲開發
- 從0開始搭建低程式碼平臺系列(難點分析)
- Vip積分管理系統專案JavaWeb開發流程JavaWeb
- 從0開發一個iOS企業級專案效果介紹iOS
- 從零開始構建一個webpack專案Web
- Layui+MVC+EF (專案從新建立開始)UIMVC
- 【Java EE】從零開始寫專案【總結】Java
- 原生專案如何從零開始整合 React NativeReact Native
- 從 Flutter 2.0 開始學 - 實踐、專案搭建Flutter
- 《從0開始學Elasticsearch》—初識ElasticsearchElasticsearch
- 從0開始使用vue-element-adminVue
- 從零開始學習C++(0)C++