(1): 包名全部小寫,根包名公司域名的反寫(不要www)如augmentum的域名為www.augmentum.com那么根包名應該為:com.augmentum.oes(項目名) 其它包統(tǒng)一放在com.augmentum.oes下, 如果有公司統(tǒng)一使用的公共類遂赠,一般的包名為com.augmentum.common,無須放到com.augmentum.oes下.
(2): 在根包下建議一個Constants.java類,所有定義常量全部大寫,兩個單詞之間使用下劃線(),形如
public static final int PAGE_SIZE = 10;
(3): 在Eclipse中,請使用JDK配置"JRE System Library",而不應該使用JRE, 這樣你就可以查到jdk的源程序.
(4): jsp請放到/WEB-INF/jsp文件夾下
(5): jsp命名請全部使用小寫,多個單詞之間請使用下劃線()分開,形如edit_question.jsp, 也可以是question_edit.jsp关划,但兩種方式不要混用舆声,要統(tǒng)一弹灭,如果是大型項目孝扛,可以在jsp下再建一個question目錄圾笨,下面再放
edit.jsp, list.jsp等
(6): 所有靜態(tài)資源(css/js/image),放到WebContent(web項目的根目錄上)的static目錄下,并建議如下目錄結構
static
css
images
js
對只在css中使用到的image(如背景圖片), 應該在css 目錄下再建一個images目錄乔遮,把圖片放在些目錄下.
(7): 在JDBC操作中(沒有使用ORM Tool)時,所有SQLException轉為RuntimeException進行拋出(請自行建立一個如DBException的類)
(8): 在jsp + servlet + jdbc(javaBean)的結構中要分成如下4層
dao + service + servlet + jsp
并在根包下建立如下包
dao, service, model, servlet, util
(9): dao 方法中只能使用get/create/update/delete/find開頭的方法名,其中get用在只返回一條記錄,也就是返回值是一個model對象,find用來返回一個List
(10): dao下要建立接口,接口直接放在dao中,命名形如: QuestionDao.java, 實現類在dao下建立一個impl包,實現類名形如: QuestionDaoImpl.java
(11): service下要建立接口,接口直接放在service中,命名形如: QuestionService.java, 實現類在service下建立一個impl包,實現類名形如: QuestionServiceImpl.java
(12): dao中create方法的返回值為自動生成主鍵,對delete方法可以返回刪除條數或者void, 對update可以返回更新的條數或者void,但是要對所有的delete和update方法返回值統(tǒng)一
(13): 數據合法性驗證統(tǒng)一在service中做, 并使用異常形式throw出去.
(14): 數據庫(mysql)中命名統(tǒng)一使用小寫,多個單詞之間使用下劃線(_)進行分開,如english_name.
(15): get請求過來,統(tǒng)一使用forward轉入到jsp, post請求過來如果操作成功,統(tǒng)一使用redirect跳入到相應的URL,如果操作失敗,使用forawrd轉入相應的jsp(沒有特別需求).
(16): 對insert數據到數據庫時,如果數據字段有明顯的初始值,并且用戶在界面上不能進行輸入,請使用數據庫中的初始值,如is_deleted,而不應該在insert的sql中加入此字段.
(17): JDBC進行數據查詢統(tǒng)一使用PreparedStatement, 而不應該使用Statement,以避免sql注入.
(18): 數據庫密碼不能存儲明文,而應該使用md5進行加密碼處理.
(19): 數據庫中時間,統(tǒng)一使用數據庫時間,而不應該使用應用程序時間.
(20): 在jsp中對<,>等符號要進行轉義輸出,防止跨站腳本攻擊.
(21): Spring Controller中對實體的增刪改查使用如下方法
create 新增記錄入口url, get請求
edit/{id} 修改記錄入口url get請求
list 列表頁入口url(以?形式帶參數) get請求
save 保存數據url post請求
(22): 在jsp中路經,如static/css/style.css,請使用如下形式<%=request.getContextPath()%>/static/css/style.css, js、images同理,但是最好使用{從配置文件中得到的靜態(tài)文件的URL}/static/css/style.css, 最好使用自定義靜態(tài)文件服務URL
(23): 修改實體和新增實體的jsp可以使用同一個,如edit_question.jsp,除非存在大量的邏輯不一樣的情況可以把他們分開,如create_question.jsp,edit_question.jsp.
(24): Spring 中的controller請繼承一個抽像類BaseController, 此類一開始可以沒有代碼,方便以后把共用代碼抽取.
(25): js驗證和后臺java代碼的數據驗證都要實現,并且驗證規(guī)則要保持一致.
(26): 數據驗證不能對數據一個一個錯誤提示用戶,而要一次性提示用戶他的輸入有那些是錯的.
如用戶輸入6個字段,錯了三個,應該是提示用戶錯了三個和原因,而不應該提示一個給他.
(27): 在spring中dao,service中不要使用注解方式,使用xml文件的配置形式,controller請使用注解方式(只對此次培訓有效).
(28): 在spring中dao,service中xml的配置中,id請使用小駝峰, 并且使用實現類的接口類的類名并把第一個字母小寫.
如: <bean id = "messageDao" class="com.augmentum.oes.dao.impl.MessageDaoImpl"></bean>
(29): 實體model可以只有一個無參的構造方法,在使用時請使用setXxx
(30): 系統(tǒng)中文亂碼解決, Tomcat 的server.xml 配置 UTF-8, 數據庫/字段編碼 UTF-8, JDBC 建立數據庫鏈接的時候編碼設定UTF-8, JSP頁面UTF-8, Filter request 設置編碼方式為UTF-8.
(31): 字符串是否相等時,用equals(eg. "zack".equals(userName); ), 不要使用==
(32): 數據庫業(yè)務數據不要使用物理刪除,請使用邏輯刪除,刪除之請要請用戶確認是否真的要刪除.
(33): 必須一個SpringUtil,并把此類配置到spring中的xml文件中:
<bean class="com.augmentum.training.util.SpringUtil"></bean>
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
applicationContext = context;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String beanId){
ApplicationContext applicationContext = getApplicationContext();
return (T)applicationContext.getBean(beanId);
}
}
SpringUtil供在沒有被spring容器管理但是需要使用spring容器管理的類中使用.
(34): SQL中對關鍵字統(tǒng)一使用大寫,如SELECT * FROM user WHERE id = 1, 包括數據庫中的函數.
(35): spring controller中參數中盡量不要使用HttpServletRequest等容器相關的對象.
(36): spring mvc controller的配置文件不要重復加載.
(37): 方法參數如果超過4個參數,請盡量再思考一下,是否還有其它方式
(38): 增加StringUtil類,實現isEmpty方法,用戶判斷一個字符串是否為null或者""
(39): 后臺的數據驗證要通過異常方式返回給調用者.
(40): spring controller中對類的注解請使用實體名,如:
@Controller
@RequestMapping("/user")
public class UserController {
(41): 要實現公用的分頁類,名叫Pagination.java,把分頁相關的邏輯寫入其中
(42): 實現一個Filter,用來實現設置request中編碼為utf-8
(43): jsp中 請使用<!DOCTYPE html>,如果在HTML后面有內容,請移除掉.
(43): form表單提交時,action請使用如下方式:
<form name="userForm" id="userForm" method="POST" action="<%=request.getContextPath()%>/test">
(44): 在HTML中,請盡量不要出現內聯的css.
(45): 列表頁默認排序應該是最新修改數據排在最前面,除非業(yè)務是有特別的要求.
(46): model不能以bean的形式定義到spring的配置文件(如:applicationContext.xml)中,而應該使用new直接生成
(47): 布局要使用DIV,不能使用table,也不能使用frame頁,和object標簽進行布局
(48): jsp頁面應該使用分塊技術實現,可以參考:http://www.zhengmenbb.com/archives/316.htm
(49): 在吃掉異常的地方,一定要使用log4j進行異常信息的輸出(輸出到log文件中)
(50): session中如果存儲user對象,請先清除用戶的密碼
(51): 單例類中不能出現帶有狀態(tài)的數據, 如在servlet, filter, dao, service, spring中的controller
(52): 對代碼中在eclipse中出現的行號那個地方有黃色警告的標示的代碼,請仔細檢查原因,不要輕易使用@SuppressWarnings標解.
(53): 查詢點擊后,search的字段要保留在搜索框中.
(54): 同樣代碼copy 2次以上,需要考慮抽取.
(55): java中的Date,一律使用java.util.Date
(56): js中不要使用如下代碼
if (userName == null || userName == "") {
}
而應該使用
if (!username) {
}
(57): JDBC中Dao的實現,sql的執(zhí)行請使用模板方法
(58): 在Eclipse中贫途,請把行號和空格號顯示出來(只對此次培訓有效).
(58): java代碼中Tab鍵換成4個空格.
(59):=, ==, +, -, *, /, && 前后有一個空格.
(60): ,號后面有一個空格, 前面沒有空格.
(61): if, for, while, else if, try, catch 中代碼如果只有一行代碼吧彪,也必須使用{}.
(62): {與代碼處在同一行,前且前面有一個空格.
(63): }與代碼處在同一行丢早, 并且后面有一個空格.
(64): 所有外部資源(數據庫聯接姨裸,文件流,Socket聯接)都必須在finally中進行關閉.
(65): JUnit測試,每一個分支(如if, 異常等)應該都有獨立的方法進行測試傀缩,但是對同一類if分支那先,比如數據驗證,可以只使用一個測試方法
(66): 每個JUnit測試應該保持獨立(準備數據扑毡,測試胃榕,刪除數據).
(67) 前端頁面不準使用iframe/frameset/object內嵌頁面(只對此次培訓有效).
(68) 不準使用table作為布局容器.
(69): css的引入要放在<head>標簽中,js的引入要放在</body>之前.
(70): 打log時盛险,如果知道用戶名瞄摊,請向 log日志中輸出用戶名
(71): 一個表一個model類,如question, user, user_role表的model類為Question, User, UserRole,里面字段與數據表字段一致苦掘,如user_name變成userName.
(72):一個表一個dao, 如如question, user, user_role表的dao類為QuestionDao, UserDao, UserRoleDao.
(73):dao中方法省去掉model名字换帜,如createQuestion應該命名為create,getUserByUserName命名成getByUserName.
(74):service一般指真正實體,如user, question會有service, 應中間表user_role不會出現service.
(75):service方法名盡量使用業(yè)務名稱鹤啡,如登陸(login),注冊(register), 只有在找不到合適的名稱時惯驼,才與dao方法名一致
(75):Servlet有兩種寫法
1:為每一個動作定義一個Servlet, 如SaveQuestionServlet, EditQuestionServlet, ListQuestionServlet,CreateQuestionServlet等
2:以實體為標準定義Servlet, 如QuestionServlet, 然后在get/post方法中根據request中參數(可以命名為action)的值寫if/elseif代碼段
(76): 如果是長字符聯接递瑰,請不要使用+, 應該使用StringBuffer, StringBuilder, 方法中的變量使用StringBuilder, 對象中變量使用StringBuffer
(77): 變量命名如果是類或者是接口祟牲,只須把類名或者接口名第一個字母大小改為小字就可以了, 如UserService userService, User user. 不要使用userServiceImpl
(78): 可以為每一個主實體建立一個Service類,關聯表抖部,如role_user, 不需要.
(79): 驗證種分说贝,1:數據合法性驗證,2:業(yè)務驗證慎颗, 前面一種無須查數據庫乡恕,如果要查數據進行的都是第二種
(80): util包下的類里的方法都要使用static, 類定義上最好加上final, 不允許繼承
(81): 一個url,最好支持post就是post, get就是get, 無須post,get都要支持
(82): 配置spring中俯萎,如果使用 classpath:xxxxx, 不能在xxxxx前面加空格,如 classpath: xxxxx