文檔版本說明
v1.0 基礎(chǔ)版本
v1.1 補(bǔ)充規(guī)范拼岳,增加規(guī)范等級(jí)
一塞关、代碼流程規(guī)范
(一) java代碼處理
-
【強(qiáng)制】java中對(duì)象判空必須使用ta3框架提供的
ValidateUtil.isEmpty()
方法或ValidateUtil.isNotEmpty()
方法,不要自己去寫,例如寫==null等等;
需要判空的情況:- 界面采集到的重要數(shù)據(jù)抚芦,尤其是update的條件數(shù)據(jù);
- service返回的數(shù)據(jù)迈螟;
- 在對(duì)象執(zhí)行相關(guān)方法的時(shí)候在為確定對(duì)象不為空的情況下都需要判空叉抡,如
domain.tomap()
,list.size()
,obj.equals()
等;
- 【強(qiáng)制】java代碼中使用碼值時(shí)答毫,必須將碼值定義成常量并放到常量文件中褥民。
-
【強(qiáng)制】獲取當(dāng)前時(shí)間必須使用統(tǒng)一方法從數(shù)據(jù)庫中獲取,一般為
BaseService
中的getSysTimestamp()
或getSysData()
等方法烙常,使用數(shù)據(jù)庫時(shí)間作為統(tǒng)一的業(yè)務(wù)時(shí)間轴捎,避免直接使用應(yīng)用系統(tǒng)時(shí)間鹤盒,因?yàn)槲覀儫o法保證集群環(huán)境下,多臺(tái)應(yīng)用系統(tǒng)服務(wù)器時(shí)間的一致性和正確性侦副。 - 【強(qiáng)制】序列號(hào)必須使用系統(tǒng)統(tǒng)一提供的getSeqence服務(wù)或項(xiàng)目自定義的獲取序列的方法侦锯,不能自行隨機(jī)產(chǎn)生,更不能簡(jiǎn)單的用時(shí)間做序列號(hào)秦驯,用隨機(jī)數(shù)和時(shí)間在高并發(fā)尺碰、集群環(huán)境下都會(huì)很隨機(jī)的產(chǎn)生碰撞,導(dǎo)致異常译隘。
-
【推薦】service中
getDao()
可以直接使用dao
簡(jiǎn)寫亲桥。 - 【推薦】善用TODO:在代碼中加入//TODO:IDE會(huì)幫你提示,讓你知道還有什么事沒做固耘,例:
if(order.isPaid()){
//TODO:更新訂單
}
-
【強(qiáng)制】變量和字符串做比較時(shí)题篷,必須用"字符串".equals("變量"),如
"0".equals(變量)
,避免變量為空時(shí)使用equals方法報(bào)空指針錯(cuò)誤。 - 【強(qiáng)制】禁止使用equals()方法將一個(gè)對(duì)象與null作比較(obj.equals(null))厅目,如果obj對(duì)象為null番枚,程序?qū)伋鯪ullPointerException異常;如果obj對(duì)象不是null损敷,那么該表達(dá)式將始終返回false葫笼。
- 【強(qiáng)制】表達(dá)式的計(jì)算結(jié)果永遠(yuǎn)為false,表明基于該表達(dá)式的代碼片段將永遠(yuǎn)不會(huì)被執(zhí)行拗馒,是程序中的死代碼或用于調(diào)試的代碼路星,這些死代碼會(huì)增加代碼的閱讀、理解和維護(hù)難度诱桂,甚至該段代碼還可能指出程序中曾經(jīng)出現(xiàn)的錯(cuò)誤洋丐,被其他人利用;檢查程序邏輯访诱,如果確定程序中的死代碼沒有作用垫挨,應(yīng)該將其刪除。
- 【強(qiáng)制】空的try代碼塊触菜、if代碼塊在程序中沒有起到任何作用九榔,是程序中的死代碼或者是應(yīng)該被注釋掉的調(diào)試代碼;這些死代碼會(huì)增加代碼的閱讀涡相、理解和維護(hù)難度哲泊;檢查程序邏輯,如果確定程序中的死代碼沒有作用催蝗,應(yīng)該將其刪除切威。
- 【強(qiáng)制】禁止在finally語句塊中使用return、continue或break返回指令丙号,這會(huì)導(dǎo)致try塊中拋出的異常丟失及邏輯混亂先朦。
- 【強(qiáng)制】自定義類的對(duì)象使用 equals()方法時(shí)必須重寫equals()方法缰冤,在沒有重寫equals()方法的類(或接口)上調(diào)用equals()方法,會(huì)導(dǎo)致調(diào)用繼承自java.lang.Object的equals()方法喳魏,盡管可以合法的使用Object.equals()棉浸,但是Object.equals()將比較兩個(gè)對(duì)象的內(nèi)存地址,而不是比較對(duì)象的成員變量刺彩。
- 【強(qiáng)制】 類如果重寫了equals()迷郑,必須同時(shí)重寫hashCode()方法;Java語言規(guī)范規(guī)定相等的對(duì)象必須具有相同的哈希碼创倔,即:如果a.equals(b)==true嗡害,那么a.hashCode()==b.hashCode();如果不遵循這個(gè)準(zhǔn)則畦攘,當(dāng)此類對(duì)象存儲(chǔ)在一個(gè)集合中時(shí)霸妹,可能就會(huì)引發(fā)一些問題;如果將這個(gè)類的對(duì)象用作哈希表的關(guān)鍵值或是插入到一個(gè)Map或者Set中知押,那么相等的對(duì)象要具有相等的哈希碼抑堡,這一點(diǎn)十分重要。
- 【強(qiáng)制】啟動(dòng)線程應(yīng)該調(diào)用start()方法朗徊,而不是run()方法;用start方法來啟動(dòng)線程偎漫,真正實(shí)現(xiàn)了多線程運(yùn)行爷恳,這時(shí)無需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的代碼;run()方法只是類的一個(gè)普通方法而已象踊,如果直接調(diào)用Run方法温亲,程序中依然只有主線程這一個(gè)線程,其程序執(zhí)行路徑還是只有一條杯矩,還是要順序執(zhí)行栈虚,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼,這樣就沒有達(dá)到寫線程的目的史隆。
-
【強(qiáng)制】不同的操作系統(tǒng)使用不同的字符作為文件分隔符魂务;例如,Windows 系統(tǒng)使用 ""泌射,而 UNIX 系統(tǒng)則使用 "/"粘姜;應(yīng)用程序需要在不同的平臺(tái)上運(yùn)行時(shí),使用硬編碼文件分隔符會(huì)導(dǎo)致應(yīng)用程序邏輯執(zhí)行錯(cuò)誤熔酷,并有可能導(dǎo)致拒絕服務(wù)孤紧;
反例:以下代碼使用硬編碼文件分隔符來打開文件:
File file = new File(directoryName + "\\" + fileName);
正例:
File file = new File(directoryName + File.separator + fileName);
- 【強(qiáng)制】開發(fā)人員必須使用框架提供dao對(duì)數(shù)據(jù)庫進(jìn)行操作,禁止使用jdk原始api操作數(shù)據(jù)庫拒秘,特殊業(yè)務(wù)除外号显。
-
【強(qiáng)制】java中杜絕使用
java.lang.Runtime.getRuntime().exec(…)
,該命令會(huì)造成惡意用戶通過前段傳入任意命令操控服務(wù)器臭猜,從而達(dá)到各種攻擊的目的; -
【強(qiáng)制】靜止私自調(diào)用
System.runFinalizersOnExit()
押蚤,System.gc()
蔑歌,System.exit()
或Runtime.exit()
方法;前者不正確的調(diào)用會(huì)導(dǎo)致jvm不正常工作活喊,程序頻繁調(diào)用System.gc()將會(huì)降低系統(tǒng)性能丐膝,調(diào)用System.exit()
或Runtime.exit()
會(huì)關(guān)閉java虛擬機(jī)。 -
【強(qiáng)制】框架中Service均是單實(shí)例多線程钾菊,如果在程序的實(shí)現(xiàn)類中定義了存在線程安全問題的變量帅矗,可能出現(xiàn)業(yè)務(wù)經(jīng)辦結(jié)果的不確定性;因此在Service中除了定義在配置中注入的變量煞烫、以
static final
定的簡(jiǎn)單類型(如:int浑此、float、byte等)和不可變類(如:String滞详、Float凛俱、Integer等)外,不要額外定義其他變量料饥;正確的定義示例如下:
public class TestServiceImpl extends BaseService implements TestService{
private ResourceService resourceService;
private static final String Q_MODE = "01";
//……
}
- 【強(qiáng)制】程序注釋中禁止保留密碼等敏感信息岸啡,將使敏感信息對(duì)任何能夠獲取到該文件的人員可見奋隶。
- 【強(qiáng)制】程序中禁止重寫類的finalize方法并進(jìn)行調(diào)用,該方法用于釋放對(duì)象占用的存儲(chǔ)空間,應(yīng)由JVM進(jìn)行調(diào)用产还;如實(shí)際業(yè)務(wù)需要重寫類的finalize方法她按,在重寫的finalize()方法時(shí)應(yīng)先調(diào)用super.finalize()。
- 【強(qiáng)制】開發(fā)人員禁止私自在項(xiàng)目中添加第三方j(luò)ar包匕累,如有實(shí)際需要欢嘿,需向項(xiàng)目經(jīng)理報(bào)備。
-
【強(qiáng)制】項(xiàng)目上線時(shí)掐隐,需將
jdbc.properties
中的數(shù)據(jù)庫信息去掉,防止黑客獲取到數(shù)據(jù)庫連接信息。
(二)數(shù)據(jù)處理
-
【強(qiáng)制】Java中金額相關(guān)的對(duì)象類型必須使用
BigDecimal
,以防止計(jì)算的不精確狞山、數(shù)據(jù)過大总珠、過小的越界等
獲取當(dāng)前登錄人員信息必須統(tǒng)一使用dto中的getUserInfo()
方法局服,如:
String userName = dto.getUserInfo().getName();
- 【強(qiáng)制】方法的入?yún)⒑头祷貐?shù)不要用Object類型驳遵。
- 【強(qiáng)制】不能將返回結(jié)果集放到session中,避免服務(wù)器內(nèi)存消耗而影響整體系統(tǒng)性能堤结,除非設(shè)計(jì)要求鸭丛。
- 【強(qiáng)制】集合等類型如知道所裝對(duì)象類型,請(qǐng)使用泛型唐责,如:
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
(三)異常處理
-
【強(qiáng)制】java里面如需拋異常,異常類型必須為ta3封裝的
AppException
,如:
if(n != 1){
throw new AppException("修改失敗");
}
-
【強(qiáng)制】所有Service里面的異常全部拋出抄罕,內(nèi)部實(shí)現(xiàn)不要
try-catch
,有特殊業(yè)務(wù)需求除外,如使用了try-catch
且在catch里使用return語句后母蛛,需注意事務(wù)問題 ,如
try {
//a操作
//b操作
} catch(Exception e) {
return "";
}
該操作沒有將異常拋出乳怎,直接在catch里面return彩郊,如果b操作失敗拋出異常,a操作是不會(huì)回滾的
- 【強(qiáng)制】action中捕獲service中拋出的異常蚪缀,并將錯(cuò)誤信息處理成用戶易于理解的方式展示到前臺(tái)秫逝,不要直接將異常信息展示給用戶,如:
try {
//service方法
} catch(Exception e) {
setMsg("保存失敗询枚,請(qǐng)聯(lián)系管理員违帆!",ERROR);
}
(四)事務(wù)控制
-
【強(qiáng)制】service事務(wù)配置范本
testService
:spring beanID
transactionProxy
:spring事務(wù)代理
dataSource
:數(shù)據(jù)源
- 帶事務(wù)的service
<bean id="testService" parent="transactionProxy">
<property name="target">
<bean class="com.yinhai.test.impl.TestServiceImpl" parent="dataSource"/>
</property>
</bean>
- 不帶事務(wù)的service
<bean id="testService" class="com.yinhai.test.impl.TestServiceImpl" parent="dataSource"/>
- 【強(qiáng)制】在配置了多數(shù)據(jù)源的項(xiàng)目中金蜀,事務(wù)代理和數(shù)據(jù)源必須一一對(duì)應(yīng)刷后。
- 【強(qiáng)制】同一個(gè)service內(nèi)不同方法的事務(wù)傳播行為必須一樣,否則會(huì)造成事務(wù)失效的風(fēng)險(xiǎn)(詳細(xì)解釋)
- 【強(qiáng)制】查詢類操作可以直接在action中進(jìn)行渊抄,不需要事務(wù)控制尝胆。
(五)sql規(guī)范
- 【強(qiáng)制】分頁查詢sql和普通查詢sql不能共用,會(huì)有緩存風(fēng)險(xiǎn)护桦。
-
【強(qiáng)制】在所有用到
dao.update
含衔、dao.delete
對(duì)數(shù)據(jù)的操作,能夠根據(jù)業(yè)務(wù)上下文確定影響記錄數(shù),必須對(duì)dao.update
抱慌、dao.delete
返回值進(jìn)行判斷逊桦,例:
if(1 != dao.update("updateAc01ForKey", mapKey)){
throw new AppException("xxxxx");
}
- 【強(qiáng)制】update,delete語句不能使用動(dòng)態(tài)where條件抑进,如使用動(dòng)態(tài)where條件强经,傳入?yún)?shù)為空時(shí),則可能造成更新和刪除的范圍變大的風(fēng)險(xiǎn)寺渗,例:
UPDATE SYSHELP
SET yxbz = '0'
<dynamic prepend="where">
<isNotEmpty prepend="AND" property="id">
id = #id#
</isNotEmpty>
<isNotEmpty prepend="AND" property="name">
name = #name#
</isNotEmpty>
</dynamic>
優(yōu)化為:
UPDATE SYSHELP
SET yxbz = '0'
WHERE id = #id#
AND name= #name#
-
【強(qiáng)制】在Ibatis中的SQL語句不能使用動(dòng)態(tài)
$
參數(shù)匿情,由于$
參數(shù)是基于字符串的原樣替換拼接,如果該參數(shù)是來自界面的無效信殊、惡意參數(shù)容易導(dǎo)致SQL注入攻擊炬称,例:
SELECT aac001
FROM ac01 a
WHERE a.aac001 = #aac001#
AND a.aac008 IN ($aac008$)
假定參數(shù)aac008傳入為'01' ) OR 'a' IN ('a'
,該語句最終執(zhí)行為:
SELECT aac001
FROM ac01 a
WHERE a.aac001 = #aac001#
AND a.aac008 IN ('01' ) OR 'a' IN ('a')
就會(huì)導(dǎo)致全表查詢涡拘,假如該表是千萬玲躯、或者上億的數(shù)據(jù),則查詢可能會(huì)導(dǎo)致應(yīng)用服務(wù)器內(nèi)存溢出鳄乏、宕機(jī)跷车,如必須使用,需向領(lǐng)導(dǎo)報(bào)備橱野,并對(duì)參數(shù)做長(zhǎng)度朽缴、特殊字符等檢查。
- 【強(qiáng)制】sql中禁止使用truncate水援、drop命令密强,刪除表數(shù)據(jù)或刪除表。
二蜗元、性能規(guī)范
(一)java性能
- 【強(qiáng)制】String是不可變類或渤,字符串+運(yùn)算不是直接將字符串在原對(duì)象上進(jìn)行拼接,而是新產(chǎn)生對(duì)象奕扣,對(duì)應(yīng)用服務(wù)器內(nèi)存和效率都會(huì)帶來一定影響劳坑;因此在循環(huán)中進(jìn)行字符串拼接,必須使用StringBuilder.append或StringBuffer.append來替代+字符串運(yùn)算成畦;此外,本條也適用于非循環(huán)語句下大量字符串連續(xù)拼接運(yùn)算涝开;示例如下:
String err = "";
for(int i = 0; i < inputList.size(); i++) {
//....
err = err + "第" + i + "行[" + vo.getAac001() + "]重號(hào)/n";
//....
}
優(yōu)化為
StringBuilder err = new StringBuilder();
for(int i = 0, j = inputList.size(); i < j; i++) {
//....
err.append("第").append(i).append("行[").append(vo.getAac001()).append("]重號(hào)/n");
//....
}
- 【強(qiáng)制】在循環(huán)時(shí)循帐,變量的聲明應(yīng)放到循環(huán)外,循環(huán)中保持值不變的變量舀武,應(yīng)在循環(huán)外賦值拄养,如:
for (int i = 0; i < list.size() ; i++) {
Map m = new HashMap();
//……
}
優(yōu)化為
Map m = null;
for (int i = 0; i < list.size() ; i++) {
m = new HashMap();
// ………
}
- 【強(qiáng)制】代碼中的System.out.println在功能測(cè)試通過后必須刪除或注釋。
- 【強(qiáng)制】刪除沒有被使用的變量。
-
【強(qiáng)制】ta3中批量insert使用框架提供的
dao.insertBatch()
方法瘪匿,不要循環(huán)調(diào)用insert方法跛梗,如:
for (Map map : list) {
dao.insert("test.insert",map);
}
優(yōu)化為
dao.insertBatch("test.insert",list);
- 【推薦】對(duì)追求高性能、不需要擴(kuò)展和繼承覆蓋的類棋弥、方法核偿、變量等使用final修飾符,JVM會(huì)對(duì)final修飾的類顽染、方法漾岳、變量進(jìn)行運(yùn)行時(shí)緩存和優(yōu)化,從而提高運(yùn)行效率粉寞。
- 【推薦】如需遍歷Map盡量用entrySet()尼荆,遍歷時(shí)用entry.getKey() 和 entry.getValue(),該遍歷方法效率較高唧垦。
- 【推薦】在業(yè)務(wù)代碼中盡量減少反射的操作捅儒,例如使用get、set方式代替類似BeanUtils.copyProperty這樣的反射操作振亮,從而提高代碼運(yùn)行性能巧还。
- 【推薦】盡量使用局部變量,調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中双炕,速度較快狞悲;其他變量,如靜態(tài)變量妇斤、實(shí)例變量等摇锋,都在堆 (Heap)中創(chuàng)建,速度較慢站超;另外荸恕,依賴于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化死相。
- 【推薦】程序中采用new Boolean(boolean expression)或new Boolean(String expression)創(chuàng)建對(duì)象融求,該方法產(chǎn)生的額外對(duì)象將占用更多空間、降低性能算撮;使用Boolean.valueOf(boolean expression)或Boolean.valueOf(String expression)或Boolean.TRUE生宛、Boolean.FALSE代替new Boolean。
- 【推薦】循環(huán)中盡可能使用臨時(shí)變量存儲(chǔ).length() .size() .getClass().getName()等取值方法的返回值肮柜,以及存儲(chǔ)在一行中多個(gè)“.”調(diào)用代碼的中間值陷舅,從而提高效率,例如:
queryDto.getParameter().put("aae041", aae041);
queryDto.getParameter().put("yab003", queryDto.getUserInfo().getOrgId());
修改為:
Map m = queryDto.getParameter();
m.put("aae041", aae041);
m.put("yab003", queryDto.getUserInfo().getOrgId());
-
【強(qiáng)制】對(duì)時(shí)間审洞、時(shí)間戳莱睁、BigDecimal等類型做整型轉(zhuǎn)換時(shí),用JAVA自帶的 API或框架中的工具類,應(yīng)該避免轉(zhuǎn)換為字符串仰剿,然后截取创淡,強(qiáng)轉(zhuǎn)這種方式;
反例:
int beforeChange = Integer.valueOf(時(shí)間戳格式對(duì)象.toString().substring(0,4)).intValue();
(二)sql性能
- 【強(qiáng)制】對(duì)表進(jìn)行操作時(shí)南吮,where條件中必須帶上主鍵或有索引的字段琳彩;
-
【強(qiáng)制】對(duì)帶有索引的字段進(jìn)行l(wèi)ike模糊查詢時(shí),只能使用
keyword%
右模糊旨袒,使用%keyword
汁针、%keyword%
會(huì)使索引失效;
三砚尽、代碼格式規(guī)范
(一)命名規(guī)范
- 【強(qiáng)制】包(Package)命名
- 采用完整的英文描述符施无,應(yīng)該都是由小寫字母組成,并且以
com.yinhai
開頭;
- 【強(qiáng)制】類(class)命名
- jsp必孤,action猾骡,service,service實(shí)現(xiàn)的命名必須對(duì)應(yīng)敷搪,如test.jsp一也,TestAction.java裁僧,TestService.java,TestServiceImpl.java;
- jsp以小寫開頭层皱,采用駝峰方式派继,如
testJava.jsp
恰力; - java以大寫開頭可岂,采用駝峰方式,如
TestAction.java
践樱; - 配置文件小寫開頭厂画,如
spring-test.xml
;
- 【強(qiáng)制】靜態(tài)常量字段(static final)
- 全部采用大寫字母拷邢,單詞之間用下劃線分隔袱院;
MIN_BALANCE
,DEFAULT_DATE
;
- 【強(qiáng)制】標(biāo)簽變量命名
- from標(biāo)簽直接定義為from1瞭稼;
- 變量名避免使用太長(zhǎng)的名字,如長(zhǎng)度超過15位忽洛,請(qǐng)使用縮寫;
- 如果標(biāo)簽與數(shù)據(jù)庫字段未綁定环肘, 則標(biāo)簽id屬性用前綴名+下劃+對(duì)應(yīng)的表字段名來描述( 全部小寫)欲虚;
標(biāo)簽 | 前綴 |
---|---|
checkbox | cb |
radio | rd |
text | txt |
selectInput | slpt |
tree | tre |
- 【強(qiáng)制】按鈕命名
按鈕 | id | key | hotkey |
---|---|---|---|
查詢 | btnQuery | 查詢[Q] | ctrl+q |
刪除 | btnDelete | 刪除[D] | ctrl+d |
增加 | btnAdd | 增加[A] | ctrl+a |
修改 | btnEdit | 修改[E] | ctrl+e |
重置 | btnReset | 重置[R] | ctrl+r |
保存 | btnSave | 保存[S] | ctrl+s |
關(guān)閉 | btnClose | 關(guān)閉[C] | ctrl+c |
其他按鈕命名以btn開頭, 熱鍵不能和已有的重復(fù)
- 【強(qiáng)制】方法命名
- 首字母小寫廷臼,采用駝峰方式,長(zhǎng)度過長(zhǎng)請(qǐng)使用縮寫,如
queryEmp()
荠商;
- 【強(qiáng)制】禁止類成員與類同名寂恬,變量與方法同名,容易導(dǎo)致程序混亂或產(chǎn)生錯(cuò)誤的代碼莱没;
(二) 標(biāo)簽格式
- 【強(qiáng)制】標(biāo)簽如果沒有子標(biāo)簽初肉,后面的結(jié)束標(biāo)簽可以簡(jiǎn)寫,如:
<ta:datagridItem id="todepartment" key="用工單位" align="center"></ta:datagridItem>
優(yōu)化為:
<ta:datagridItem id="todepartment" key="用工單位" align="center"/>
(三) JS代碼格式
- 【強(qiáng)制】不能在一行語句定義多個(gè)變量饰躲,如
var aac001,aac002,aac003;
優(yōu)化為:
var aac001牙咏,//變量注釋
aac002,//變量注釋
aac003嘹裂;//變量注釋
(四) JAVA代碼格式
- 【強(qiáng)制】刪除不用的包導(dǎo)入妄壶,在代碼提交svn前必須使用快捷鍵ctrl+shift+o修正導(dǎo)入。
- 【強(qiáng)制】大括號(hào)的開始在代碼塊開始的行尾,閉合在和代碼塊同一縮進(jìn)的行首寄狼,如:
public Object implLog(Map<String, Object> argMap) {
return dao.insert("compmanage.insertComp_impl_id_log", argMap);
}
- 【強(qiáng)制】xml文件里面只能使用空格縮進(jìn)丁寄。
- 【強(qiáng)制】xml文件中開始標(biāo)簽和對(duì)應(yīng)的結(jié)束標(biāo)簽必須對(duì)齊。
- 【強(qiáng)制】if-else泊愧,for伊磺,while等語句,在任何情況下删咱,都應(yīng)該有“{”屑埋,“}”。
(五) 注釋
- 【強(qiáng)制】類注釋:java類必須注釋上該類的作用痰滋,開發(fā)者名字及開發(fā)時(shí)間
/**
*
* @description 個(gè)人差額退補(bǔ)
* @author wukong摘能,bailongma
* @Time 2016-03-01 15:02:29
*/
public class DiffCompensAction extends BusinessBaseAction{}
- 【強(qiáng)制】方法注釋
/**
* @description 保存基金支出信息
* @param dto
* @return
* @throws Exception
* @author Administrator
* @Time 2012-11-20 15:02:29
*/
public void toSave(List<Key> list,ParamDTO dto) throws Exception{};
-
【強(qiáng)制】代碼塊注釋
- 邏輯控制代碼塊必須有注釋
- 重要的業(yè)務(wù)節(jié)點(diǎn)必須有注釋
- 【推薦】變量定義后必須加上注釋
-
【強(qiáng)制】sql注釋
- 查詢sql字段的注釋
- sql中的小于符號(hào)的轉(zhuǎn)義
四、界面布局規(guī)范
(一)表單規(guī)范
- 【推薦】頁面上的經(jīng)辦時(shí)間必須帶上時(shí)分秒即寡。
-
【推薦】輸入類標(biāo)簽父容器用
fieldset
徊哑。 -
【推薦】表格類標(biāo)簽父容器用
panel
。 - 【推薦】表單輸入框按照3列布局聪富。
- 【推薦】輸入內(nèi)容較長(zhǎng)的標(biāo)簽占2-3列莺丑,如:地址、公司名稱墩蔓、備注等梢莽。
-
【推薦】按鈕使用
toolbar
標(biāo)簽。 -
【強(qiáng)制】頁面顯示內(nèi)容使用
form
標(biāo)簽包裹奸披。 -
【推薦】表格中較長(zhǎng)的數(shù)據(jù)必須添加
showDetail=true
屬性昏名,如:
<ta:datagridItem id="aae155" key="變更項(xiàng)目中文含義" showDetailed="true" align="center" maxChart="8" dataAlign="left"></ta:datagridItem>
-
【強(qiáng)制】布局容器同級(jí)情況下,只有第一個(gè)容器添加
fit=true
阵面。 - 【強(qiáng)制】label字?jǐn)?shù)過多時(shí)轻局, 被輸入框遮擋洪鸭, 必須設(shè)置標(biāo)簽的labelWidth屬性設(shè)置label的寬度, 但頁面上的標(biāo)簽需統(tǒng)一調(diào)整仑扑, 達(dá)到頁面統(tǒng)一览爵。
- 【強(qiáng)制】在jsp頁面title標(biāo)簽中間加上當(dāng)前頁面對(duì)應(yīng)的action名字及功能名稱,如:
<title>allpaymentRecheckAction|支付計(jì)劃</title>
- 【強(qiáng)制】所有標(biāo)簽的第一個(gè)屬性應(yīng)為id镇饮,第二個(gè)屬性為key(沒有key的除外)蜓竹,其他屬性依次 往后排,新添加的屬性應(yīng)在最后加储藐,不能在中間添加俱济,規(guī)范寫法:
<ta:text id="aab002" key="社會(huì)保險(xiǎn)登記證號(hào)" labelWidth="130" onChange="fnCheckAab002()"/>
<ta:text id="aab999" key="單位管理碼" labelWidth="130" readOnly="true" required="true"/>
<ta:text id="aae013" key="備注" labelWidth="130" span="2" maxLength="100"/>
- 【強(qiáng)制】必須使用框架提供重置按鈕
<ta:button id="btnReset" key="重置[R]" hotKey="R" type="resetPage" asToolBarItem="true" />
-
【推薦】按鈕都需要添加快捷鍵,快捷鍵為
Ctrl+英文字母
钙勃,且在按鈕標(biāo)題中顯示快捷鍵信息
<ta:button id="btnReset" key="重置[R]" hotKey="ctrl+R" type="resetPage" asToolBarItem="true" />
-
【強(qiáng)制】必錄項(xiàng)需使用標(biāo)簽的
required
屬性添加紅星
<ta:text id="aae007" key="郵政編碼" validType="zipcode" required="true" labelWidth="130"/>
- 【強(qiáng)制】文本框必須有長(zhǎng)度校驗(yàn)蛛碌, 字符長(zhǎng)度不能超過數(shù)據(jù)庫字段長(zhǎng)度; 數(shù)字輸入框要有最大值限制肺缕, 數(shù)字最大值不能超過數(shù)據(jù)庫字段長(zhǎng)度左医, 最小值依據(jù)業(yè)務(wù)需求而定; 如數(shù)據(jù)庫中字段的類型為number(8,2)同木, 表示范圍是8位浮梢, 精度為2, 即存6位整數(shù)彤路, 兩位小數(shù)秕硝, 那么標(biāo)簽里的max="999999.99"
<ta:text id="aac001" key="個(gè)人編號(hào)" labelWidth="120" maxLength="15"/>
<ta:number id="aac040" key="工資" labelWidth="120" max="99999999"/>
-
【強(qiáng)制】郵政編碼,郵箱等必須使用text標(biāo)簽的
validType
屬性校驗(yàn)洲尊,具體可校驗(yàn)類型參 照validType屬性值
<ta:text id="aae007" key="郵政編碼" validType="zipcode" required="true" labelWidth="130"/>
<ta:text id="yab517" key="專管員電子郵箱" validType="email" required="true" labelWidth="130" />
- 【推薦】下拉列表的下拉選項(xiàng)只有一個(gè)远豺、并且該下拉列表是必錄項(xiàng)時(shí),需將該唯一的下拉選項(xiàng)設(shè)置為下拉列表的默認(rèn)值坞嘀。
- 【推薦】表單與datagrid中:文本靠左躯护、數(shù)字靠右,datagrid中日期居中丽涩。
-
【強(qiáng)制】
selectinput
棺滞、datagrid
里有碼表的必須加collection屬性,后臺(tái)手動(dòng)設(shè)置的除外
<ta:datagridItem id="aab051" key="參保狀態(tài)" collection="AAB051" dataAlign="left"/>
- 【強(qiáng)制】查詢條件至少有一個(gè)為必輸條件矢渊,除特殊要求外继准;
- 【強(qiáng)制】對(duì)于結(jié)果超過500條數(shù)據(jù)的查詢,應(yīng)使用分頁方式矮男,分頁數(shù)如果允許修改限制不超過500移必;
- 【強(qiáng)制】表單、表格中的id字段不能直接展示到界面毡鉴,需隱藏崔泵,除業(yè)務(wù)需要展示的秒赤;
- 【推薦】默認(rèn)情況下,表格不能啟用通用數(shù)據(jù)導(dǎo)出功能憎瘸,避免數(shù)據(jù)泄露倒脓;
- 【強(qiáng)制】jsp頁面禁止直接寫代碼訪問數(shù)據(jù)庫,禁止在JSP含思、JS、HTML等前端代碼中使用SQLID傳到后端執(zhí)行相應(yīng)SQL甘晤,熟悉系統(tǒng)的惡意攻擊者通過更換SQLID偽造關(guān)鍵數(shù)據(jù)含潘,從而非法執(zhí)行后臺(tái)SQL,獲取线婚、修改正常數(shù)據(jù)遏弱,給系統(tǒng)帶來安全隱患;
- 【強(qiáng)制】當(dāng)關(guān)鍵業(yè)務(wù)數(shù)據(jù)出現(xiàn)在URL中時(shí)塞弊,須進(jìn)行加密漱逸,確保在瀏覽器地址欄中,或在瀏覽器開發(fā)調(diào)試視圖游沿、或其他途徑看不到關(guān)鍵數(shù)據(jù)的明碼饰抒,且當(dāng)參數(shù)被非法修改后不會(huì)非法訪問業(yè)務(wù)系統(tǒng);
(二) JavaScript規(guī)范
-
【強(qiáng)制】提示信息必須使用
Base.alert()
,并且必須帶上類型(如success
诀黍,error
袋坑,warn
),不能使用原生的alert方法
Base.alert("保存成功眯勾! ","success");
- 【強(qiáng)制】查詢操作查詢不出信息時(shí)需做提示枣宫;保存、刪除成功后需給出提示信息(成功或下一步操作的提示)吃环。
- 【推薦】初始化界面也颤,焦點(diǎn)置于第一個(gè)輸入框
$(document).ready(function() {
$("body").taLayout();
Base.focus("aac001");
});
-
【強(qiáng)制】在保存的提交方法里,
Base.submit
方法的第五個(gè)參數(shù)設(shè)置為true郁轻,框架自動(dòng)調(diào)用Base.validateForm
對(duì)ids對(duì)象進(jìn)行校驗(yàn)翅娶,如果校驗(yàn)失敗將不再提交,并自動(dòng)設(shè)置不通過的 輸入對(duì)象為校驗(yàn)失敗的樣式范咨,同時(shí)第一個(gè)校驗(yàn)失敗元素獲取焦點(diǎn)故觅;重要的信息必須自己手 動(dòng)再調(diào)用Base.validateForm
檢驗(yàn)
Base.submit("form1", "insurTransferApplyAction!toSave.do",null,null,true);
- 【強(qiáng)制】身份證有效性校驗(yàn),如界面存在出生日期渠啊、性別字段输吏,必須在錄完身份證時(shí)自動(dòng)填寫。
- 【強(qiáng)制】輸入的時(shí)間段替蛉,需進(jìn)行校驗(yàn)贯溅,結(jié)束時(shí)間不能早于開始時(shí)間拄氯。
-
【強(qiáng)制】
Base.submit
提交請(qǐng)求,第一個(gè)參數(shù)有多個(gè)值時(shí)它浅,值參數(shù)之間不能有包含關(guān)系译柏,第一個(gè)參數(shù)和第三個(gè)參數(shù)不能有重復(fù)的字段
setReadOnly
,setRequired
姐霍,showObj
鄙麦,setDisabled
,setDisRequired
镊折,setEnable
有 多個(gè)值時(shí)胯府,值用逗號(hào)隔開,不能每個(gè)值寫一行恨胚。 -
【推薦】
Base.submit
和Base.getJson
方法根據(jù)業(yè)務(wù)需求合理選擇使用-
Base.submit
:異步請(qǐng)求骂因,在請(qǐng)求還未結(jié)束的情況下,后續(xù)代碼會(huì)繼續(xù)執(zhí)行赃泡; -
Base.getJson
:同步請(qǐng)求(異步中的同步)寒波,在請(qǐng)求還未結(jié)束的情況下,后續(xù)代碼不會(huì)繼續(xù)執(zhí)行升熊;
-
-
【強(qiáng)制】不能使用關(guān)鍵字作為變量名或者鍵值對(duì)中的key俄烁,包括(按字母排序):
break
、case
级野、catch
猴娩、continue
、default
勺阐、delete
卷中、do
、else
渊抽、finally
蟆豫、for
、function
懒闷、if
十减、in
、instanceof
愤估、new
帮辟、return
、switch
玩焰、this
由驹、throw
、try
昔园、typeof
蔓榄、var
并炮、void
、while
甥郑、with
等逃魄; - 【強(qiáng)制】縮進(jìn)的單位為4個(gè)空格;
- 【強(qiáng)制】所有的函數(shù)在使用前聲明澜搅;
- 【推薦】if伍俘、for、while勉躺、do养篓、switch、try使用方法如下:
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
//用于已經(jīng)知道相關(guān)參數(shù)的數(shù)組循環(huán)
for (initialization; condition; update) {
statements;
}
//用戶對(duì)象中赂蕴,object原型中的成員會(huì)被包含在迭代器中,
for (variable in object) if (filter) {
statements;
}
while (condition) {
statements;
}
do {
statements;
} while ( condition );
switch (expression) {
case expression:
statements;
default:
statements;
}
try {
statements;
} catch(variable) {
statements;
}
try {
statements;
} catch(variable) {
statements;
} finally {
statements;
}
五舶胀、findbugs檢查規(guī)范
- 項(xiàng)目代碼必須通過
FindBugs
工具掃描概说,并100%修復(fù)minimum priority to report
為Hight的以下幾種類型的bug:
- 正確性(
Correctness
):這種歸類下的問題在某種情況下會(huì)導(dǎo)致bug,比如錯(cuò)誤的強(qiáng)制類型轉(zhuǎn)換等嚣伐; - 最佳實(shí)踐反例(
Bad practice
):這種類別下的代碼違反了公認(rèn)的最佳實(shí)踐標(biāo)準(zhǔn)糖赔,比如某個(gè)類實(shí)現(xiàn)了equals方法但未實(shí)現(xiàn)hashCode方法等; - 多線程正確性(
Multithreaded correctness
):關(guān)注于同步和多線程問題轩端; - 性能(
Performance
):潛在的性能問題放典; - 安全(
Security
):安全相關(guān); - 高危(
Dodgy
):FindBugs團(tuán)隊(duì)認(rèn)為該類型下的問題代碼導(dǎo)致bug的可能性很高基茵; - 惡意代碼漏洞(
malicious code vulnerability
):其他惡意代碼安全漏洞奋构;