歡迎光臨
每天分享高質量文章

Java Web技術經驗總結(四)

  1. Spring MVC中傳回JSON資料的不同方法

  • Spring 3 MVC ContentNegotiatingViewResolver example,該檢視解析器,可以用於將同一份模型資料展現為不同的表現形式,例如JSON、XML和RSS等;

  • 利用@ResponseBody註解修飾控制器方法,併在xxx-servlet.xml中開啟spring mvc支援——,這種機制背後的原理是MessageConverter。

  • 最近用Mockito寫單元測試的感受,單元測試有兩點好處:(1)利於解耦程式碼,降低程式碼的耦合性,在寫單測的過程中,你會不自覺將不屬於當前業務邏輯的程式碼分割出去;(2)單元測試是修改程式碼的有力保障,使得我們在修改程式碼之後能及時測試本次修改是否正確。總之:單元測試並不只是為了驗證你當前所寫的程式碼是否存在問題,更為重要的是它可以很大程度的保障日後因業務變更、修複Bug或重構等引起的程式碼變更而導致(或新增)的風險。

  • IDEA的使用經驗

    • 必備外掛:Maven Helper,用於分析jar包衝突

    • 常用快捷鍵

    • Idea的左下角,灰色方塊,游標cover上去以後可快速喚出各個View

    • Comman + Y,刪除一行

    • alt + Enter:當游標在類名時,使用該快捷鍵可以建立測試用例、建立子類和使得該類區域性化;當游標在區域性變數上時,使用該快捷鍵可以新增Javadoc、轉變成ThreadLocal變數、轉變成Atomic變數、改變變數的開放級別;當游標在函式上時,也有對應的功能,可自己去探索;

    • alt + Command + u:將游標放在某個類上,透過該快捷鍵可以構造出該類所屬的繼承體系,如下圖所示: 

    • Refactor功能,具體可參考《重構》一書;我之前也有一篇讀書筆記:《重構》閱讀筆記-程式碼的壞味道

    • Git版本管理

    • 檢視commit記錄

    • 檢視每個commit的修改記錄

    • 檢視指定檔案的修改歷史

    • 比較不同版本直接的diff

    • 提交程式碼(提交之前可做靜態掃描、最佳化import、檢視todo等)

    • 分支合併,區分rebase和merge的區別

    • 遠端除錯功能 :在Edit Configuration中可新建Remote,指定遠端伺服器的IP地址和埠,即可遠端除錯

  • 效能測試時需要註意的

    • 日誌級別調成warn級別;

    • 發現CPU佔用過高時,利用jstack檢視行程棧,看看什麼動作比較耗CPU;具體可參考關於JVM CPU資源佔用過高的問題排查。我最近遇到一個case,是RSA解密消耗了大量的CPU時間,那麼我們在開發時,要註意儘量減少RSA解密的次數。

  • MyBatis報錯:“Error querying database. Cause: java.lang.UnsupportedOperationException”,錯誤程式碼如下:在這裡,resultType指的是查詢到的每條記錄的型別,因此應該用java.lang.String

  • 作為一個對外開放的介面,或者供其他模組呼叫的介面,必須做到以下幾件事:

    • 入參檢查

    • 異常處理

    • 統一的結果生成

    • 配套的單元測試和介面測試用例,防止程式碼修改引入新的bug

  • 在ArrayList中去掉重覆的物件(按照自定義的重覆定義規則),如:[原創]JAVA技巧:去除ArrayList裡面的重覆記錄](http://www.cnblogs.com/jizha/p/javaarraylistduplicate.html)

  • 在透過URL引數傳入時間時,後臺可考慮使用InitBinder自動將時間字串轉換成Date物件,並系結到Controller的入參,例子程式碼如下: “` //the parameter was converted in initBinder @RequestMapping(“/date”) public String date(Date date){ System.out.println(date); return “hello”; }

    //At the time of initialization,convert the type “String” to type “date” @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat(“yyyy-MM-dd”), true)); } “`

  • 關於Spring MVC中@ResponseBodyHttpMessagerConverter等的實現原理,SpringMVC關於json、xml自動轉換的原理研究[附帶原始碼分析]這篇文章,以及對應的程式碼分析,基本上都講清楚了。PS:MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter的區別在於,Spring 4版本都用前一個。

  • 常用Git作為程式碼管理工具,除了熟練使用IDEA中提供的圖形化Git管理功能,也需要瞭解這些GUI背後對應的指令,那麼久需要看如下資料:

    • 猴子都能懂的Git入門

    • Pro Git(V2)

  • Spring MVC基礎知識總結:史上最全的SpringMVC學習筆記。在第十七節,作者只是提出了要建兩個容器配置檔案(applicationContext.xml和xxx-servlet.xml),並透過exclude和include配置防止bean的重覆載入,不過沒有深入講解其背後的原因。 Spring 容器(Spring 的背景關係)這篇文章給出了詳細解釋:在Spring MVC專案中,這兩個父子容器的角色不同:(1)父容器中儲存資料源、服務層、DAO層、事務的Bean;(2)子容器中儲存Mvc相關的Action的Bean。對應到例子中,applicationContext.xml定義父容器,xxx-servlet.xml定義子容器。 取用官方檔案中的一張圖片,可以清晰地看出dispatcherservlet背景關係和Root應用背景關係之間的關係:Root應用背景關係用於提供service、資料庫等bean,可供多個dispatcherservlet背景關係使用。

  • 最後,再重溫下spring mvc的處理流程,在進行Java Web開發的時候,也時刻不要忘記對HttpRequest的處理流程。 

    贊(0)

    分享創造快樂