Java開發心得

1. Spring概述

  Spring 是一個開源框架,是爲了解決企業應用程序開發複雜性由Rod Johnson建立的。框架的主要優點之一就是其分層架構,分層架構容許使用者選擇使用哪個組件,同時爲 J2EE 應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成之前只可能由EJB完成的事情。
  強大的基於 JavaBeans 的採用控制翻轉(Inversion of Control,IoC)原則的配置管理,使得應用程序的組建更加快捷簡易。前端

2. Spring MVC

  Spring MVC框架是有一個MVC框架,經過實現Model-View-Controller模式來很好地將數據、業務與展示進行分離。URL的處理流程見下圖:java

  

  

  1. 當DispatcherServlet接到請求時,他先回查找適當的處理程序來處理請求。DispatcherServlet經過一個或者多個處理程序映射,將每一個請求映射處處理程序中。處理程序映射配置在web應用程序的上下文中,是實現了HandlerMapping接口的Bean。它負責爲請求返回一個適當的處理程序(也就是Controller)。處理程序映射一般根據請求的URL將請求映射處處理程序(Controller)。
  2. 一旦DispatcherServlet選擇了適當的控制器(Controller),它就會調用這個控制器來處理請求。
  3. 控制器處理完請求後,會將模型和視圖名(有時候是視圖對象)返回給DispatcherServlet。模型包含了控制器要傳遞給視圖進行顯示的屬性。若是返回的是視圖名稱,它會被解析成視圖對象再進行呈現。綁定模型和視圖的基本類是ModelAndView。
說明:本項目全部Controller返回的都是JSON數據,視圖的邏輯都是在前臺由ExtJs實現的。
  4. 當DispatcherServlet接收到模型和視圖名稱時,它會將邏輯視圖名稱解析成視圖對象再進行呈現。DispatcherServlet從一個或者多個視圖解析器中解析視圖。視圖解析器配置在Web應用程序上下文中,是實現了ViewResolver接口的Bean。它的任務是根據邏輯視圖名稱返回試圖對象。
  5. 一旦DispatcherServlet將視圖名稱解析稱爲試圖對象,它就會呈現視圖對象,並傳遞控制器返回的模型。視圖的任務是將模型屬性展現給用戶。mysql

3. 裝配組件

  裝配組件可使用配置文件,也可使用註解。
  項目的Spring配置文件:

  若是使用註解,須要在配置文件中指明搜索註解的位置;程序員

  <context:annotation-config />
  <context:component-scan base-package="com.topsec.ai.config" />
  <context:component-scan base-package="com.topsec.ai.model" />
  <context:component-scan base-package="com.topsec.ai.controller" />
  <context:component-scan base-package="com.topsec.ai.service" />
  <context:component-scan base-package="com.topsec.ai.dao" />

  本項目使用的註解含義:
  @Controller 用於標註控制層組件
  @Autowired 完成自動裝配的工做,經過@Autowired的使用來消除set和get方法
  @RequestMapping 配置URL請求
  @ResponseBody 後臺返回數據使用JSON格式
  @RequestParam 必選參數,URL中必有含有該參數才能匹配上
  @Service 服務層組件,用於標註業務層組件
  @Transactional 在service類前加,聲明這個service全部方法須要事務管理。每個業務方法開始時都會打開一個事務
  @Repository 持久層組件,用於標註數據訪問組件,即DAO組件web

4. Hibernate

  Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。
  本項目使用的註解含義:
  配置項 做用
  @JsonAutoDetect 自動生成JSON格式數據
  @Entity 實體類
  @Table 映射數據庫代表
  @Id 映射主鍵
  @Column 映射字段
  @DateTimeFormat 時間日期字符串解釋器
  @Transient 不存入數據庫字段ajax

5. ExtJs

  ExtJS是一種主要用於建立前端用戶界面,是一個基本與後臺技術無關的前端ajax框架。
  AJAX即「Asynchronous JavaScript and XML」(異步JavaScript和XML)。AJAX的做用是使用Javascript向服務器提出請求並處理響應而不阻塞用戶。核心對象XMLHTTPRequest。經過這個對象,您的JavaScript可在不重載頁面的狀況與Web服務器交換數據。
  說明:Java和JavaScript是徹底不一樣的2中語言,JavaScript是腳本語言,前臺瀏覽器能夠運行。Java是跨平臺的語言,應用很廣。
  注意:用戶的輸入能夠在前臺使用JavaScript判斷,這樣作是爲了減輕後臺服務器的壓力,提升效率。可是從安全角度出發,用戶輸入的有效性後臺仍是必須再判斷一次的。spring

6. JUnit

  JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma創建,逐漸成爲源於Kent Beck的sUnit的xUnit家族中爲最成功的一個。 JUnit是在極限編程和重構(refactor)中被極力推薦使用的工具,由於在實現自動單元測試的狀況下能夠大大的提升開發的效率。另外,在項目初期階段,整個平臺框架尚未搭建起來,這時候寫的代碼只能經過JUnit來測試。sql

7. Quartz

  Quartz是一個徹底由java編寫的開源做業調度框架。項目中每日構建規則庫,運行規則庫識別率誤報率和定時備份數據庫,都是由Quartz實現調度的。
  配置觸發器的cronExpression屬性能夠定義觸發時間。數據庫

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="methodInvokingJobDetail" />
        </property>
        <property name="cronExpression">
            <value>00 01 00 * * ?</value>
        </property>
</bean>

  cronExpression配置值說明:編程

字段 容許值 容許的特殊字符
0-59 , - * /
0-59 , - * /
小時 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可選) 留空 或者1970-2099 , - * /

通配符說明:
* 表示全部值. 例如:在分的字段上設置 "*",表示每一分鐘都會觸發。
? 表示不指定值。使用的場景爲不須要關心當前設置這個字段的值。例如:要在每個月的10號觸發一個操做,但不關心是周幾,因此須要周位置的那個字段設置爲"?" 具體設置爲 0 0 0 10 * ?
- 表示區間。例如 在小時上設置 "10-12",表示 10,11,12點都會觸發。
, 表示指定多個值,例如在周字段上設置 "MON,WED,FRI" 表示週一,週三和週五觸發
/ 用於遞增觸發。如在秒上面設置"5/15" 表示從5秒開始,每增15秒觸發(5,20,35,50)。 在月字段上設置'1/3'所示每個月1號開始,每隔三天觸發一次。
L 表示最後的意思。在日字段設置上,表示當月的最後一天(依據當前月份,若是是二月還會依據是不是潤年[leap]), 在周字段上表示星期六,至關於"7"或"SAT"。若是在"L"前加上數字,則表示該數據的最後一個。例如在周字段上設置"6L"這樣的格式,則表示「本月最後一個星期五"
W 表示離指定日期的最近那個工做日(週一至週五). 例如在日字段上設置"15W",表示離每個月15號最近的那個工做日觸發。若是15號正好是週六,則找最近的週五(14號)觸發, 若是15號是周未,則找最近的下週一(16號)觸發.若是15號正好在工做日(週一至週五),則就在該天觸發。若是指定格式爲 "1W",它則表示每個月1號日後最近的工做日觸發。若是1號正是週六,則將在3號下週一觸發。(注,"W"前只能設置具體的數字,不容許區間"-").
# 序號(表示每個月的第幾個周幾),例如在周字段上設置"6#3"表示在每個月的第三個週六.注意若是指定"#5",正好第五週沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了) ;

小提示:
'L'和 'W'能夠一組合使用。若是在日字段上設置"LW",則表示在本月的最後一個工做日觸發;
周字段的設置,若使用英文字母是不區分大小寫的,即MON 與mon相同;

例子:

1    "0 0 12 * * ?" 天天中午12點觸發  
2    "0 15 10 ? * *" 天天上午10:15觸發  
3    "0 15 10 * * ?" 天天上午10:15觸發  
4    "0 15 10 * * ? *" 天天上午10:15觸發  
5    "0 15 10 * * ? 2005" 2005年的天天上午10:15觸發  
6    "0 * 14 * * ?" 在天天下午2點到下午2:59期間的每1分鐘觸發  
7    "0 0/5 14 * * ?" 在天天下午2點到下午2:55期間的每5分鐘觸發  
8    "0 0/5 14,18 * * ?" 在天天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發  
9    "0 0-5 14 * * ?" 在天天下午2點到下午2:05期間的每1分鐘觸發  
10    "0 10,44 14 ? 3 WED" 每一年三月的星期三的下午2:10和2:44觸發  
11    "0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發  
12    "0 15 10 15 * ?" 每個月15日上午10:15觸發  
13    "0 15 10 L * ?" 每個月最後一日的上午10:15觸發  
14    "0 15 10 ? * 6L" 每個月的最後一個星期五上午10:15觸發  
15    "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每個月的最後一個星期五上午10:15觸發  
16    "0 15 10 ? * 6#3" 每個月的第三個星期五上午10:15觸發  
17    「0 0 6 * * *」  天天早上6點 
18    「0 0 */2 * * *」  每兩個小時 
19    「0 0 23-7/2,8 * * *」  晚上11點到早上7點之間每兩個小時,早上八點
20    「0 0 11 4 * 1-3」  每月的4號和每一個禮拜的禮拜一到禮拜三的早上11點
21    「0 0 4 1 1 *」  1月1日早上4點

8. 經驗總結

1. 權限控制是經過Spring MVC的攔截器實現的

<mvc:interceptors>
<bean class="com.topsec.ai.common.PermissionAnnotationInterceptor"></bean>
</mvc:interceptors>

2. 上傳和下載文件都使用流傳輸文件。
上傳文件,前臺可使用Ext自帶的FileUpload組件,後臺直接使用request.getReader()方法可以獲得流數據。
下載文件,後臺response要作以下設置:

response.setContentType("application/doc");
response.setContentLength((int) file.length());
response.setHeader("fileName", fileName);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

前臺使用Ext.core.DomHelper.append()方法能夠下載文件。

3. app.js是ExtJs的入口文件。4. 要管理mysql數據庫須要配置其餘機器可以經過3306端口鏈接mysql。首先進入mysql,而後使用gant命令配置遠程鏈接的機器IP地址。5. 時間日期的轉換,ExtJs想要解析後臺傳來的時間類型,就要設置dateFormat=time。

相關文章
相關標籤/搜索