傳統(tǒng)JavaWeb項(xiàng)目需要注意的要點(diǎn),從環(huán)境準(zhǔn)備開始到三層架構(gòu)搭建,需要注意的地方全部羅列出來。
第一部分:環(huán)境準(zhǔn)備
1. Maven命令創(chuàng)建web骨架
mvn archetype:create -DgroupId=net.rocketa -DartifactId=mywebapp -DarchetypeArtifactId=maven-archetype-webapp
注意web servlet版本(web.xml,3.1),Junit版本指定為4.X(這樣Spring好通過注解的方式來運(yùn)行單元測試)
2. 注意在IDEA中需要設(shè)置好MAVEN工程的Sources/Tests/Resources/Test Resources屬性。
3. 日志依賴
slf4j:規(guī)范和接口
具體的日志實(shí)現(xiàn)有:
log4j、logback、common-logging
因此我們一般是使用slf4j接口+一種具體的日志實(shí)現(xiàn)+slf4j和這個(gè)具體日志實(shí)現(xiàn)的依賴整合
4. 數(shù)據(jù)庫依賴
有2個(gè)依賴,需要注意,一個(gè)是驅(qū)動(dòng),一個(gè)是數(shù)據(jù)庫連接池(C3P0,DBCP...)。
驅(qū)動(dòng)JAR包是運(yùn)行期需要包含,編譯期不需要的。
5. 持久層框架依賴
說白了,DAO層的框架依賴:MyBatis or Hibernate or ....
比如除MyBatis本身的依賴需要引入之外,還需要引入MyBatis和Spring的整合依賴。
6. Web層依賴
比如,JSP中使用到的一些JSTL、標(biāo)簽、Ajax訪問JSON等,還有需要注意的是,在編譯期需要引入servlet-api。
7. Spring核心依賴
spring-core、spring-beans、spring-context
8. Spring和DB之間的整合依賴
Spring是需要介入DB的管理的,比如它的聲明式事務(wù)。
spring-jdbc、spring-tx
9. Spring對Web的一些整合依賴
spring-web、spring-webmvc
10. Spring對Junit的支持依賴
spring-test
NOSQL對事務(wù)的支持不是很好,它主要追求的是性能、高可用、分布式。
MySQL等關(guān)系型數(shù)據(jù)庫對事務(wù)的支持是很成熟的,也是很可靠的落地方案。
第二部分:DAO層
NOSQL對事務(wù)的支持不是很好,它主要追求的是性能、高可用、分布式。
MySQL等關(guān)系型數(shù)據(jù)庫對事務(wù)的支持是很成熟的,也是很可靠的落地方案。
1. 表
可以在項(xiàng)目中建立一個(gè)SQL文件,便于SQL的管理。
注意,表的存儲(chǔ)引擎(事務(wù)的支持:innodb)、自動(dòng)增長的特性、編碼、主鍵和索引。
一個(gè)良好的習(xí)慣是:為所有的表都添加一個(gè)創(chuàng)建時(shí)間字段,用于記錄,方便排查。
應(yīng)該為表名、列名添加注釋,方便其他工程師查閱。
應(yīng)該注意SQL技巧,比如插入存在唯一約束的表中,如果出現(xiàn)沖突不想報(bào)錯(cuò)的話,可以:insert ignore into ....(可以通過返回的影響行數(shù)來進(jìn)行判斷)
2. Dao層實(shí)體
一些業(yè)務(wù)對象的建立,setter/getter/toString等就不說了,需要特別注意的是,除了表的字段之外,還需要什么屬性?這里涉及到一個(gè)一對一、一對多,多對多的概念!
3. Dao層接口和mapper sql
MyBatis的特點(diǎn):從SQL(參數(shù)+sql)映射到Entity/List(定制SQL、自由傳遞參數(shù)、結(jié)果集自動(dòng)賦值)
使用MyBatis的方式:SQL寫在XML中,或者注解提供SQL。更加推薦的是XML,因?yàn)楦屿`活,XML提供的動(dòng)態(tài)拼接功能也是比注解簡單的多。
一個(gè)全局的mybatis配置文件+具體的SQL文件+DAO接口:讓我們只需要設(shè)計(jì)接口,關(guān)注業(yè)務(wù)邏輯,解放出來。
在全局mybatis配置文件中重點(diǎn)注意:是否開啟駝峰轉(zhuǎn)換,獲取數(shù)據(jù)庫自增主鍵,列別名替換列名等。
注意DAO接口和具體的SQL文件之間的對應(yīng)關(guān)系。
具體SQL寫法中,比如#{},<![CDATA[...]]>等需要引起注意。
輸入?yún)?shù)類型parameterType,如果是多個(gè)基本類型,那么不用給出來。
即便返回的是List對象,我們的resultType依然指定的是集合中的對象類型。
在Mybatis的SQL文件中是可以通過OGNL表達(dá)式來對對象中的一些對象類型的屬性進(jìn)行賦值的!
表名.xxx 或者 表名.xxx as yyy 對于Mybatis而言,會(huì)忽略表名.前綴,也會(huì)忽略as。
另外,注意在Dao接口中,如果方法有多個(gè)基本類型參數(shù),別忘了通過@Param來進(jìn)行運(yùn)行期參數(shù)標(biāo)記!
總結(jié):Dao層的工作逐漸演變成接口設(shè)計(jì)和SQL編寫了,這種代碼和SQL的分離方式,便于我們進(jìn)行review,而Dao的拼接將在Service層完成。
4. 一些優(yōu)化配置
比如,對帶包路徑的類型進(jìn)行簡化,通過配置掃描包。
比如,批量掃描SQL文件,通過自動(dòng)掃描配置文件。
5. mybatis和spring需要整合
spring需要接管數(shù)據(jù)庫
JDBC的一些連接信息,數(shù)據(jù)庫連接池的一些配置信息,就是配置DataSource的過程。
spring和mybatis整合的核心
SqlSessionFactory是MyBatis的配置核心,把DataSource注入,并指明MyBatis的全局配置文件位置,typeAliasesPackage掃描,mapper文件位置掃描等。
spring通過動(dòng)態(tài)代理幫助生成Dao的代理實(shí)現(xiàn)類(MapperScannerConfigurer)
注入SqlSessionFactory(通過sqlSessionFactoryBeanName),指明Dao接口的包路徑basePackage
總之,配置的一項(xiàng)原則是:約定優(yōu)于配置?。?!
第三部分:進(jìn)行Spring Junit單元測試
當(dāng)我們進(jìn)行了一些配置,寫了一些SQL,Dao接口后,應(yīng)該要進(jìn)行Spring Junit單元測試,可以通過IDEA快速的生成測試用例(很好用的一個(gè)功能,因?yàn)镮DEA可以幫助我們快速在test下建立與dao/service接口的同級目錄下生成用例)
在用例中,我們只需要在類上打上注解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring配置文件"})
加載Spring容器后,我們就可以在用例中注入對象,開始測試了?。?!
第四部分:Service層
Service層需要關(guān)注幾個(gè)要點(diǎn):
業(yè)務(wù)對象的封裝、web和service之間進(jìn)行數(shù)據(jù)傳遞的DTO、異常的處理(業(yè)務(wù)異常)
注意Spring事務(wù)回退的默認(rèn)機(jī)制是:運(yùn)行時(shí)異常。
因此,我們在service層默認(rèn)定義的業(yè)務(wù)異常一般extends RuntimeException。
一般而言,通過:
try{}catch(業(yè)務(wù)異常1 e1){}catch(業(yè)務(wù)異常2 e2){}catch(Exception e){throw new 業(yè)務(wù)異常(...);}
要知道,service層可能會(huì)發(fā)生業(yè)務(wù)異常,也可能發(fā)生一些其他異常,為了Spring都可以感知到,這里會(huì)把Exception異常轉(zhuǎn)化成運(yùn)行時(shí)異常
第五部分:Controller層
1. Restful
一種優(yōu)雅的URI表述方式;資源的狀態(tài);狀態(tài)的轉(zhuǎn)移
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設(shè)計(jì):
/模塊/資源/{標(biāo)示}/集合1/...
2.Controller中請求方法的細(xì)節(jié)處理
考慮幾個(gè)方面:請求參數(shù)綁定、請求方式限制、轉(zhuǎn)發(fā)與重定向、數(shù)據(jù)模型賦值、JSON數(shù)據(jù)返回、cookie訪問
@RequestMapping(value="/{productId:d+}/detail",method=RequestMethod.GET,produces={"application/json;charset=UTF-8"})@ResponseBodypublic 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相關(guān)的配置文件。
開啟Spring MVC的注解模式:
<mvc:annotation-driven/>
靜態(tài)資源請求采用默認(rèn)的servlet配置
<mvc:default-servlet-handler/>
配置JSP、ViewResolver的prefix「如/WEB-INF/jsp」suffix「如.jsp」
掃描web相關(guān)的Controller:
<context:component-scan base-package="">
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對“Javaweb項(xiàng)目開發(fā)教程,項(xiàng)目要點(diǎn)”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。