2、過濾器 ......................................................................................................................................................... 2php
3、攔截器.......................................................................................................................................................... 3css
4、Spring MVC PK Struts2................................................................................................................................. 5html
Struts框架........................................................................................................................................................... 6前端
Struts2和struts1的比較.................................................................................................................................... 8java
Spring MVC......................................................................................................................................................... 14mysql
5、spring.......................................................................................................................................................... 19linux
6、Hibernate框架簡述.............................................................................................................................. 29git
7、PL/SQL........................................................................................................................................................ 30程序員
Java項目通常發佈在什麼環境?...................................................................................................................... 31web
Java項目打包發佈............................................................................................................................................ 31
九、Mybatis......................................................................................................................................................... 32
十、Svn使用教程............................................................................................................................................. 37
十一、項目流程.................................................................................................................................................... 63
Spring框架總結
目的:解決企業應用開發的複雜性
功能:使用Javabean代替Ejb,並提供了更多的企業級應用
簡答來講:Java就是一個輕量級依賴注入(IOC)和麪向切面的過程(aop)
1、監聽器:
監聽器其實是一個類,這個類實現了特定的接口,而後將這個類在web.xml文件中進行描述,這樣服務器在啓動的時候就能夠實例化這個類,啓動監聽器。當範圍內對象狀態發生改變的時候,服務器自動調用監聽器對象中的方法。例如統計在線人數。
在web監聽器是Servlet規範中定義的一種特殊類,用於監聽ServletContext,HttpSession,ServletRequest等域對象的建立、銷燬、以及屬性的變化等,能夠在事件發生前、發生後處理。
監聽器的用途:
一、統計在線人數
二、系統加載時進行信息的初始化
三、統計網站的訪問量
四、跟Spring結合
4 監聽器的分類
按監聽的對象劃分,能夠分爲監聽
一、ServletContext對象
二、HttpSession對象
三、ServletRequest對象
按監聽的事件劃分
域對象自身的建立和銷燬
一、域對象中屬性的建立和消除
二、綁定到session中的某個對象的狀態
三、因爲不少監聽的方式一致,所以咱們只考慮其中的HttpSession對象:
在web.xml中配置session超時
1 2 3 |
|
2、過濾器
是一箇中間組件,用於攔截資源數據和目的數據之間的信息,用於過濾二者之間的傳遞的數據,其做用是阻止不想要的信息從一個點傳遞到另外一個點
開發過濾器的步驟
編碼
必須實現javax.servlet.Filter接口
實現Filter中的三個方法 init() doFilter() destroy()
Init()方法是用來初始化過濾器的
doFilter()方法與Servlet中的service()方法同樣由web容器調用
destroy()方法與Servlet中的destroy()方法同樣也是最後一個由web容器調用的方法
須要注意的是doFilter()方法 由於Filter中有一個而FilterChain中也有一個。
FilterChain中的doFilter()方法是將請求繼續發送
編譯
將類進行編譯
部署
將編譯好的class文件放到WEB-INF中的classes文件夾中
在web.xml文件中部署即 filter節點中有兩個子節點 filter-name 中寫上名稱 在節點filter-class中寫上類名的路徑
例如:<!-- 配置一個過濾器 -->
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.sun.TestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<!-- 映射到程序中使用 -->
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
還有一個與filter節點同級 filter-mapping語法和Servlet註冊時是同樣的方式
運行
在瀏覽器中訪問的時候就能夠避免一些問題,譬如說:直接登陸某個頁面就不行了
過濾器的應用
認證過濾
對用戶請求進行統一的認證
登陸和審覈過濾
對用戶的訪問請求進行記錄和審覈
圖像轉換過濾
轉換圖像格式
數據壓縮過濾
對用戶發生的數據進行壓縮,從而減小傳輸量
加密過濾
對請求和響應進行加密和解密處理
令牌過濾
XSLT過濾
MIME-type過濾
濾器鏈就是多個過濾器處理同一個請求
過濾器鏈執行的順序是誰在前面註冊誰就先執行
攔截器在在流行的開源框架中很常見,依賴的技術就是Java的動態代理,攔截器就是一個類,這個類也包含方法,只是這個方法是個特殊方法,它會在目標方法調用以前「自動」執行
總結:
1.過濾器(Filter):所謂過濾器顧名思義是用來過濾的,Java的過濾器可以爲咱們提供系統級別的過濾,也就是說,能過濾全部的web請求,
這一點,是攔截器沒法作到的。在Java Web中,你傳入的request,response提早過濾掉一些信息,或者提早設置一些參數,而後再傳入servlet或者struts的action進行業務邏輯,好比過濾掉非法url(不是login.do的地址請求,若是用戶沒有登錄都過濾掉),或者在傳入servlet或者struts的action前統一設置字符集,或者去除掉一些非法字符(聊天室常常用到的,一些罵人的話)。filter 流程是線性的,url傳來以後,檢查以後,可保持原來的流程繼續向下執行,被下一個filter, servlet接收。
2.監聽器(Listener):Java的監聽器,也是系統級別的監聽。監聽器隨web應用的啓動而啓動。Java的監聽器在c/s模式裏面常常用到,它
會對特定的事件產生產生一個處理。監聽在不少模式下用到,好比說觀察者模式,就是一個使用監聽器來實現的,在好比統計網站的在線人數。
又好比struts2能夠用監聽來啓動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象能夠在事情發生前、發生後能夠作一些必要的處理。Java裏的攔截器提供的是非系統級別發攔截,也就是說,就覆蓋面來講,攔截器不如過濾器強大,可是更有針對性。
3.攔截器(Interceptor):java裏的攔截器提供的是非系統級別的攔截,Java中的攔截器是基於Java反射機制實現的,更準確的劃分,應該是基於JDK實現的動態代理。它依賴於具體的接口,在運行期間動態生成字節碼。
攔截器是動態攔截Action調用的對象,它提供了一種機制可使開發者在一個Action執行的先後執行一段代碼,也能夠在一個Action執行前阻止其
執行,同時也提供了一種能夠提取Action中可重用部分代碼的方式。在AOP中,攔截器用於在某個方法或者字段被訪問以前,進行攔截而後再以前或
者以後加入某些操做。java的攔截器主要是用在插件上,擴展件上好比 Hibernate Spring Struts2等,有點相似面向切片的技術,在用以前先要在
配置文件即xml,文件裏聲明一段的那個東西。
一、攔截器是基於java的反射機制的,而過濾器是基於函數回調
二、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
三、攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求起做用
四、攔截器能夠訪問action上下文、值棧裏的對象,而過濾器不能
五、在action的生命週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次
在action的生命週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截後 - 過濾後。
我的認爲過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登陸用戶不能訪問內部頁面的處理);
過濾經過後,攔截器將檢查用戶提交數據的驗證,作一些前期的數據處理,接着把處理後的數據發給對應的Action;
Action處理完成返回後,攔截器還能夠作其餘過程,再向上返回到過濾器的後續操做。
咱們用struts2時採用的傳統的配置文件的方式,並無使用傳說中的0配置。spring3 mvc能夠認爲已經100%零配置了(除了配置spring mvc-servlet.xml外)。
Spring MVC和Struts2的區別:
1. 機制:spring mvc的入口是servlet,而struts2是filter(這裏要指出,filter和servlet是不一樣的。之前認爲filter是servlet的一種特殊),這樣就致使了兩者的機制不一樣,這裏就牽涉到servlet和filter的區別了。
2. 性能:spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會實例一個action,每一個action都會被注入屬性,而spring基於方法,粒度更細,但要當心把握像在servlet控制數據同樣。spring3 mvc是方法級別的攔截,攔截到方法後根據參數上的註解,把request數據注入進去,在spring3 mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,而後調用setter getter方法把request中的數據注入;struts2其實是經過setter getter方法與request打交道的;struts2中,一個Action對象對應一個request上下文。
3. 參數傳遞:struts是在接受參數的時候,能夠用屬性來接受參數,這就說明參數是讓多個方法共享的。Struts2中自身提供多種參數接受,其實都是經過(ValueStack)進行傳遞和賦值,而SpringMvc是經過方法的參數進行接收
4. 設計思想上:struts更加符合oop的編程思想, spring就比較謹慎,在servlet上擴展。
5. intercepter的實現機制:struts有以本身的interceptor機制,spring mvc用的是獨立的AOP方式。這樣致使struts的配置文件量仍是比spring mvc大,雖然struts的配置能繼承,因此我以爲論使用上來說,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,由於struts2 action的一個方法能夠對應一個url;而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。spring3 mvc的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,處理結果經過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨立的,但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼,讀程序時帶來麻煩。
6. 另外,spring3 mvc的驗證也是一個亮點,支持JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,而後直接返回響應文本便可。送上一段代碼:
@RequestMapping(value="/whitelists")
public String index(ModelMap map) {
Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());
List<Group> groupList = groupManager.findAllGroup(account.getId());
map.put("account", account);
map.put("groupList", groupList);
return "/group/group-index";
}
// @ResponseBody ajax響應,處理Ajax請求也很方便
@RequestMapping(value="/whitelist/{whiteListId}/del")
@ResponseBody
public String delete(@PathVariable Integer whiteListId) {
whiteListManager.deleteWhiteList(whiteListId);
return "success";
}
一,Struts2簡介:
1,來由:Struts(金屬支架),在程序中表示起支撐做用的通用程序代碼,Struts2是在Struts1框架的基礎上融合了WebWork優秀框架升級獲得的。
2,解釋:Struts2框架是一個輕量級的MVC流程框架,輕量級是指程序的代碼不是不少,運行時佔用的資源不是不少,MVC流程框架就是說它是支持分層開發,控制數據的流程,從哪裏來,到那裏去,怎麼來,怎麼去的這樣一個框架;
3,升級的改善:
Struts1的缺點:
struts框架基於servlet進行開發的,因此servlet的問題在這個框架中都能體現出來
struts框架的流程是固定的,想要擴展業務流程很是的不方便。
只支持動態視圖JSP展示數據,對於如今的SEO(搜索引擎優化)支持很差
Struts2框架改善的地方:
核心基於Filter
流程能夠動態擴展
多例建立對象
支持多種視圖展示技術(JSP,Freemarker,Volicity)
一個請求在Struts2框架中的處理大概分爲如下幾個步驟
一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin)
三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否須要調用某個Action
FilterDispatcher是控制器的核心,就是mvc中c控制層的核心。下面粗略的分析下我理解的FilterDispatcher工做流程和原理:FilterDispatcher進行初始化並啓用核心doFilter
四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
五、ActionProxy經過ConfigurationManager詢問框架的配置文件,找到須要調用的Action類 ,這裏,咱們通常是從struts.xml配置中讀取。
六、ActionProxy建立一個ActionInvocation的實例。
七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
struts2相對於struts1來講簡單了不少,而且功能強大了不少,咱們能夠從幾個方面來看:
從體系結構來看:struts2大量使用攔截器來出來請求,從而容許與業務邏輯控制器 與 servlet-api分離,避免了侵入性;而struts1.x在action中明顯的侵入了servlet-api.
從線程安全分析:struts2.x是線程安全的,每個對象產生一個實例,避免了線程安全問題;而struts1.x在action中屬於單線程。
性能方面:struts2.x測試能夠脫離web容器,而struts1.x依賴servlet-api,測試須要依賴web容器。
請求參數封裝對比:struts2.x使用ModelDriven模式,這樣咱們 直接 封裝model對象,無須要繼承任何struts2的基類,避免了侵入性。
標籤的優點:標籤庫幾乎能夠徹底替代JSTL的標籤庫,而且 struts2.x支持強大的ognl表達式。
固然,struts2和struts1相比,在 文件上傳,數據校驗 等方面也 方便了好多。在這就不詳談了。
1. Struts壓縮包內容
文件夾jakarta-struts-1.0.2包含兩個目錄,lib和webapps。在lib目錄中有使用struts建立應用程序是所需的文件:
文件 |
描述 |
jdbc2_0-stdext.jar |
包含JDBC2.0 Optional Package API類。若是咱們要使用struts提供的數據資源,就須要將這個文件拷貝到WEB-INF/lib下 |
Struts.jar |
包含struts中全部的Java類。一樣也須要拷貝到WEB-INF/lib下 |
*.tld |
標記庫描述器文件,描述了多個struts標記庫中的自定義標記。一樣要拷貝到WEB-INF/lib下 |
在webapps目錄下有以下文件:
Web應用程序 |
描述 |
Struts-blank.war |
一個簡單的web應用程序 |
Struts-documentation.war |
包含struts站點上全部struts文檔 |
Struts-example.war |
Struts不少特性的示範 |
Struts-exercisetaglib.war |
主要用於對自定義標籤庫進行增長而使用的測試頁,但也能夠示範如何使用struts標記 |
Struts-template.war |
包含struts模板標記的介紹和範例 |
Struts-upload.war |
一個簡單的例子,示範如何使用struts框架上傳文件 |
框架中所使用的組件:
ActionServlet |
控制器 |
ActionClass |
包含事務邏輯 |
ActionForm |
顯示模塊數據 |
ActionMapping |
幫助控制器將請求映射到操做 |
ActionForward |
用來指示操做轉移的對象 |
ActionError |
用來存儲和回收錯誤 |
Struts標記庫 |
能夠減輕開發顯示層次的工做 |
二、Struts 2 驗證框架的應用
Struts 2 提供了大量的數據校驗器,包括表單域校驗器和非表單域校驗器。
(1)必填字符串校驗器
該校驗器的名字是 requiredstring 其校驗規則定義文件以下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<field name = "username">
<!-- 須要驗證的字段的字段名 -->
<field-validators type = "requiredstring">
<!-- 去空格 -->
<param name = "trim">true</param>
<!-- 錯誤提示信息 -->
<message>請輸入用戶名</message>
</field-validators>
</field></validators>
文件命名:ActionName-validation.xml:其中ActionName 就是須要校驗的用戶自定義的Action 類的名字。並且該文件應該與Action 類文件放置在同一路徑下。
(2)必填校驗器
該校驗器的名字就是 required 。該校驗器與requiredstring 的差異就是 能夠有空字符串。配置以下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 須要驗證的字段的字段名 -->
<field name = "username">
<field-validators type = "required">
<!-- 錯誤提示信息 -->
<message>請輸入用戶名</message>
</field-validators>
</field></validators>
(3)整數校驗器
該校驗器的名字爲 int ,該校驗器要求字段的整數值必須在必定範圍內。配置以下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 須要驗證的字段的字段名 -->
<field name = "number">
<field-validators type = "int">
<!-- 數值的最小值 -->
<param name = "min">50</param>
<!-- 數值的最大值 -->
<param name = "max">100</param>
<!-- 錯誤提示信息 -->
<message>大小必須在50至100之間</message>
</field-validators>
</field></validators>
(4) 日期校驗器
該校驗器的名字是 date , 該校驗器要求字段的日期值必須在指定範圍類,因此也有 min 和 max 參數。配置格式:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 須要驗證的字段的字段名 -->
<field name = "date">
<field-validators type = "date">
<!-- 時間的最小值 -->
<param name = "min">1900-01-01</param>
<!-- 時間的最大值 -->
<param name = "max">9999-01-01</param>
<!-- 錯誤提示信息 -->
<message>時間必須在1900-01-01至9999-01-01之間</message>
</field-validators>
</field></validators>
(5) 郵件地址校驗器
該校驗器的名稱是 email ,該校驗器要求字段的字符若是非空,就必須是合法的郵件地址。格式以下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 須要驗證的字段的字段名 -->
<field name = "email">
<field-validators type = "email">
<!-- 錯誤提示信息 -->
<message>郵箱地址無效</message>
</field-validators>
</field></validators>
(6) 網址校驗器
該校驗器的名稱是 url , 該校驗器要求字段的字符若是非空,就必須是合法的URL地址 。 格式 和 (5)郵箱校驗器 相似。
(7) 字符穿長度校驗器
該校驗器的名稱是 stringlength ,該校驗器要求字段的字符長度必須在指定的範圍之間 ,因此它有 minLength 和 maxLength 兩個參數。
它的個數如 (3)整數校驗器 相似。
(8) 正則表達式校驗器
該校驗器的名稱是 regex ,它檢查被校驗字段是否匹配一個正則表達式。
三、Struts 2 攔截器:
Struts 2 框架的絕大部分功能是經過攔截器來完成的,當FilterDispatcher攔截到用戶請求後,大量攔截器將會對用戶請求進行處理,而後調用用戶
自定義的Action 類中的方法來處理請求。
攔截器的配置:
在struts.xml文件中來定義的,使用<interceptor.../>元素,格式以下:
<interceptor name = "攔截器名" class = "攔截器實現的類">
<param name = "參數名">參數值</param>
</interceptor>
其中<param.../>能夠省略,但在有的時候就須要爲其傳入攔截器參數。
有時候一個Action要配置不僅一個攔截器,每每多個攔截器一塊兒使用來進行過濾。這時候就要配置幾個攔截器組成的攔截器棧。定義攔截器棧用
<interceptor-stack.../>,格式以下:
<interceptor-stack name = "攔截器棧名">
<interceptor-ref name = "攔截器一"></interceptor-ref>
<interceptor-ref name = "攔截器二"></interceptor-ref>
<interceptor-ref name = "攔截器三"></interceptor-ref>
</interceptor-stack>
注意:在配置攔截器棧時,用到的攔截器必須是已經存在的攔截器。攔截器棧也能夠引用攔截器棧。
攔截器實現類:
Struts 2 提供了一些接口或類供程序員自定義攔截器。如:com.opensymphony.xwork2.interceptor.Interceptor 接口。
該接口中有三個方法:
void init () :用於初始化資源。
String intercept (ActionInvocation invocation) :用於實現攔截的動做。
destroy () :用於銷燬在init()方法中打開的資源。
模型-視圖-控制器(MVC)是一個衆所周知的以設計界面應用程序爲基礎的設計模式。它主要經過分離模型、視圖及控制器在應用程序中的角色將業務邏輯從界面中解耦。一般,模型負責封裝應用程序數據在視圖層展現。視圖僅僅只是展現這些數據,不包含任何業務邏輯。控制器負責接收來自用戶的請求,並調用後臺服務(manager或者dao)來處理業務邏輯。處理後,後臺業務層可能會返回了一些數據在視圖層展現。控制器收集這些數據及準備模型在視圖層展現。MVC模式的核心思想是將業務邏輯從界面中分離出來,容許它們單獨改變而不會相互影響。
DispatcherServlet是前置控制器,配置在web.xml文件中
<load-on-startup>1</load-on-startup>是啓動順序,讓這個Servlet隨Servletp容器一塊兒啓動。
HandlerMapping接口 -- 處理請求的映射
HandlerMapping接口的實現類:
SimpleUrlHandlerMapping 經過配置文件,把一個URL映射到Controller
DefaultAnnotationHandlerMapping 經過註解,把一個URL映射到Controller類上
<!-- 啓用spring mvc 註解 -->
<context:annotation-config />
<!-- 設置使用註解的類所在的jar包 -->
<context:component-scan base-package="controller"></context:component-scan>
@Controller //相似Struts的Action
@RequestMapping("test/login.do") // 請求url地址映射,相似Struts的action-mapping
// @RequestParam是指請求url地址映射中必須含有的參數(除非屬性required=false)
// @RequestParam可簡寫爲:@RequestParam("username")
@Resource(name = "loginService") // 獲取applicationContext.xml中bean的id爲loginService的,並注入
private LoginService loginService; //等價於spring傳統注入方式寫get和set方法,這樣的好處是簡潔工整,省去了沒必要要得代碼
@Controller 聲明Action組件
@Service 聲明Service組件 @Service("myMovieLister")
@Repository 聲明Dao組件
@Component 泛指組件, 當很差歸類時.
@RequestMapping("/menu") 請求映射
@Resource 用於注入,( j2ee提供的 ) 默認按名稱裝配,@Resource(name="beanName")
@Autowired 用於注入,(srping提供的) 默認按類型裝配
@Transactional( rollbackFor={Exception.class}) 事務管理
@ResponseBody 用於ajax return用於返回數據
@Scope("prototype") 設定bean的做用域
轉發與重定向
能夠經過redirect/forward:url方式轉到另外一個Action進行連續的處理。
能夠經過redirect:url 防止表單重複提交 。
寫法以下:
return "forward:/order/add";
return "redirect:/index.jsp";
Xml代碼
<!-- 自動掃描的包名 -->
<context:component-scan base-package="com.app,com.core,JUnit4" ></context:component-scan>
<!-- 默認的註解映射的支持 -->
<mvc:annotation-driven />
<!-- 視圖解釋類 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/><!--可爲空,方便實現自已的依據擴展名來選擇視圖解釋類的邏輯 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
<!-- 攔截器 -->
<mvc:interceptors>
<bean class="com.core.mvc.MyInteceptor" />
</mvc:interceptors>
<!-- 對靜態資源文件的訪問 方案一 (二選一) -->
<mvc:default-servlet-handler/>
<!-- 對靜態資源文件的訪問 方案二 (二選一)-->
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>
<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>
實現全局的異常處理?
在spring MVC的配置文件中:
Xml代碼
<!-- 總錯誤處理-->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>/error/error</value>
</property>
<property name="defaultStatusCode">
<value>500</value>
</property>
<property name="warnLogCategory">
<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
</property>
</bean>
1,什麼是spring框架
spring是J2EE應用程序框架,是輕量級的IoC和AOP的容器框架,主要是針對javaBean的生命週期進行管理的輕量級容器,能夠單獨使用,也能夠和Struts框架,ibatis框架等組合使用。
2,架構概述
1)IoC(Inversion of Control)控制反轉,對象建立責任的反轉,在spring中BeanFacotory是IoC容器的核心接口,負責實例化,定位,配置應用程序中的對象及創建這些對象間的依賴。XmlBeanFacotory實現BeanFactory接口,經過獲取xml配置文件數據,組成應用對象及對象間的依賴關係。
spring中有三種注入方式,一種是set注入,一種是接口注入,另外一種是構造方法注入。
2)AOP面向切面編程
aop就是縱向的編程,以下圖所示,業務1和業務2都須要一個共同的操做,與其往每一個業務中都添加一樣的代碼,不如寫一遍代碼,讓兩個業務共同使用這段代碼。
spring中面向切面變成的實現有兩種方式,一種是動態代理,一種是CGLIB,動態代理必需要提供接口,而CGLIB實現是有繼承。
3,爲何使用spring框架
在不使用spring框架以前,咱們的service層中要使用dao層的對象,不得不在service層中new一個對象。以下:
[java] view plain copy print?
//dao層對象
public class UserDao{
publicvoid insert(User user){}
}
//service層對象
public classUserService{
publicvoid insert(User user){
UserDaouserdao = new UserDao();
userdao.insert(user);
}
}
存在的問題:層與層之間的依賴。
使用框架後:
[java] view plain copy print?
//dao層對象
public class UserDao{
publicvoid insert(User user){}
}
//service層對象
public classUserService{
privateUserDao userdao;
publicUserDao getUserdao() {
returnuserdao;
}
publicvoid setUserdao(UserDao userdao) {
this.userdao= userdao;
}
publicvoid insert(User user){
userdao.insert(user);
}
}
service層要用dao層對象須要配置到xml配置文件中,至於對象是怎麼建立的,關係是怎麼組合的都交給了spring框架去實現。
4,框架優勢
輕量級的容器框架沒有侵入性
使用IoC容器更加容易組合對象直接間關係,面向接口編程,下降耦合
Aop能夠更加容易的進行功能擴展,遵循ocp開發原則
建立對象默認是單例的,不須要再使用單例模式進行處理
5,缺點:業務功能依賴spring特有的功能,依賴與spring環境。
Spring七大亮點:
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉(IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。
BeanFactory和ApplicationContext是瞭解Spring核心的關鍵。
org.springframework.beans和org.springframework.context這兩個包是Spring最基本、最重要的包,爲了實現一種無侵入式的框架,代碼中大量引用java中的反射機制,經過動態調用的方式避免了硬編碼,爲Spring的反向控制特性提供了基礎。在這兩個包中,最重要的類是BeanFactory:提供一種先進的配置機制來管理任何種類的Bean。ApplicationContext:創建在BeanFactory的基礎上,並增長了其餘的功能。例如對於國際化的支持、獲取資源、事件傳遞等
三、在文件中配置
<bean id="springContextHolder" class="com.ipan.base.utils.spring.SpringContextHolder" lazy-init="false"/>
Spring AOP:AOP(Aspect Oriented Programming),即面向切面編程,能夠說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入封裝、繼承、多態等概念來創建一種對象層次結構,用於模擬公共行爲的一個集合。不過OOP容許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌代碼每每橫向地散佈在全部對象層次中,而與它對應的對象的核心功能毫無關係對於其餘類型的代碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的代碼被稱爲橫切(cross cutting),在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。
AOP技術偏偏相反,它利用一種稱爲"橫切"的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其命名爲"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊之間的耦合度,並有利於將來的可操做性和可維護性。
使用"橫切"技術,AOP把軟件系統分爲兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特色是,他們常常發生在覈心關注點的多處,而各處基本類似,好比權限認證、日誌、事物。AOP的做用在於分離系統中的各類關注點,將核心關注點和橫切關注點分離開來。
AOP核心概念
一、橫切關注點
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之爲橫切關注點
二、切面(aspect)
類是對物體特徵的抽象,切面就是對橫切關注點的抽象
三、鏈接點(joinpoint)
被攔截到的點,由於Spring只支持方法類型的鏈接點,因此在Spring中鏈接點指的就是被攔截到的方法,實際上鍊接點還能夠是字段或者構造器
四、切入點(pointcut)
對鏈接點進行攔截的定義
五、通知(advice)
所謂通知指的就是指攔截到鏈接點以後要執行的代碼,通知分爲前置、後置、異常、最終、環繞通知五類
六、目標對象
代理的目標對象
七、織入(weave)
將切面應用到目標對象並致使代理對象建立的過程
八、引入(introduction)
在不修改代碼的前提下,引入能夠在運行期爲類動態地添加一些方法或字段
Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不一樣數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,而且極大地下降了須要編寫的異常代碼數量(例如打開和關閉鏈接)。Spring DAO 的面向 JDBC 的異常聽從通用的 DAO 異常層次結構。
1)優化了的異常類型體系:
細化了數據訪問異常,豐富了異常類型
(都是 Unchecked Exception,這種異常不會變更,採用同一種異常,表示同一種現象,與使用的持久化技術無關)
2)使用模板回調模式,開發者再也不寫模式化代碼,簡化編程:
不變:資源的獲取,資源的釋放,異常轉化(Spring提供了模板類對此負責)
變化:SQL,變量,結果集的提取
基於JDBC的DAO實現
基於 Hibernate 的DAO實現
DataSource接口:
Spring使用DataSource對象來完成獲取數據庫鏈接。
使用Spring JDBC時,既能夠從JNDI獲取數據源,也能夠自行配置數據源。
DBCP:DBCP是apache一個數據庫鏈接池項目,使用DBCP須要有三個包:COMMON-DBCP.JAR,COMMON-POOL.JAR和COMMON-COLLECTIONS.JAR
配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>
C3P0是一個開源的JDBC鏈接池,它實現了數據源和JNDI綁定。配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>
C3P0與DBCP的區別:dbcp沒有自動的去回收空閒鏈接的功能,C3P0有
Spring ORM(對象關係映射):Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部這些都聽從 Spring 的通用事務和 DAO 異常層次結構。
爲何須要ORM (Hibernate\Entity EJB\ IBATIS\TopLink)
表明了目前程序設計語言的主流和趨勢,其具有很是多的優點,好比:
 面向對象的建模、操做。
 多態、繼承。
 摒棄難以理解的過程。
 簡單易用,易理解性。
但數據庫的發展並未與程序設計語言同步,並且,關係數據庫系統的某些優點,也是面向對象的語言目前沒法解決的。好比:
 大量數據操做查找、排序。
 集合數據鏈接操做、映射。
 數據庫訪問的併發、事務。
 數據庫的約束、隔離。
面對這種面嚮對象語言與關係數據庫系統並存的局面,採用ORM就變成一種必然。
Spring Web 模塊:Web 上下文模塊創建在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。因此,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。
Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。經過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
一、首先,對於一個web應用,其部署在web容器中,web容器提供其一個全局的上下文環境,這個上下文就是ServletContext,其爲後面的spring IoC容器提供宿主環境;
二、其次,在web.xml中會提供有contextLoaderListener。在web容器啓動時,會觸發容器初始化事件,此時contextLoaderListener會監聽到這個事件,其contextInitialized方法會被調用,在這個方法中,spring會初始化一個啓動上下文,這個上下文被稱爲根上下文,即WebApplicationContext,這是一個接口類,確切的說,其實際的實現類是XmlWebApplicationContext。這個就是spring的IoC容器,其對應的Bean定義的配置由web.xml中的context-param標籤指定。在這個IoC容器初始化完畢後,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE爲屬性Key,將其存儲到ServletContext中,便於獲取;
三、再次,contextLoaderListener監聽器初始化完畢後,開始初始化web.xml中配置的Servlet,這個servlet能夠配置多個,以最多見的DispatcherServlet爲例,這個servlet其實是一個標準的前端控制器,用以轉發、匹配、處理每一個servlet請求。DispatcherServlet上下文在初始化的時候會創建本身的IoC上下文,用以持有spring mvc相關的bean。在創建DispatcherServlet本身的IoC上下文時,會利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先從ServletContext中獲取以前的根上下文(即WebApplicationContext)做爲本身上下文的parent上下文。有了這個parent上下文以後,再初始化本身持有的上下文。這個DispatcherServlet初始化本身上下文的工做在其initStrategies方法中能夠看到,大概的工做就是初始化處理器映射、視圖解析等。這個servlet本身持有的上下文默認實現類也是mlWebApplicationContext。初始化完畢後,spring以與servlet的名字相關(此處不是簡單的以servlet名爲Key,而是經過一些轉換,具體可自行查看源碼)的屬性爲屬性Key,也將其存到ServletContext中,以便後續使用。這樣每一個servlet就持有本身的上下文,即擁有本身獨立的bean空間,同時各個servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定義的那些bean。
Hibernate的核心組件
在基於MVC設計模式的JAVA WEB應用中,Hibernate能夠做爲模型層/數據訪問層。它經過配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA對象或PO(Persistent Object,持久化對象)映射到數據庫中的數據庫,而後經過操做PO,對數據表中的數據進行增,刪,改,查等操做。
除配置文件,映射文件和持久化類外,Hibernate的核心組件包括如下幾部分:
Configuration類:用來讀取Hibernate配置文件,並生成SessionFactory對象。
b)SessionFactory接口:產生Session實例工廠。
c)Session接口:用來操做PO。它有get(),load(),save(),update()和delete()等方法用來對PO進行加載,保存,更新及刪除等操做。它是Hibernate的核心接口。
d)Query接口:用來對PO進行查詢操。它能夠從Session的createQuery()方法生成。
e)Transaction接口:用來管理Hibernate事務,它主要方法有commit()和rollback(),能夠從Session的beginTrancation()方法生成。
Hibernate的運行過程
Hibernate的運行過程以下:
A:應用程序先調用Configration類,該類讀取Hibernate的配置文件及映射文件中的信息,並用這些信息生成一個SessionFactpry對象。
B:而後從SessionFactory對象生成一個Session對象,並用Session對象生成Transaction對象;可經過Session對象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對PO進行加載,保存,更新,刪除等操做;在查詢的狀況下,可經過Session對象生成一個Query對象,而後利用Query對象執行查詢操做;若是沒有異常,Transaction對象將 提交這些操做結果到數據庫中。
Hibernate的運行過程以下圖:
PL/SQL也是一種程序語言,叫作過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增長了編程語言的特色,因此PL/SQL就是把數據操做和查詢語句組織在PL/SQL代碼的過程性單元中,經過邏輯判斷、循環等操做實現複雜的功能或者計算的程序語言
1 PL/SQL的做用
使用PL/SQL能夠編寫具備不少高級功能的程序,雖然經過多個SQL語句可能也能實現一樣的功能,可是相比而言,PL/SQL具備更爲明顯的一些優勢:
⒈可以使一組SQL語句的功能更具模塊化程序特色;
⒉採用了過程性語言控制程序的結構;
⒊能夠對程序中的錯誤進行自動處理,使程序可以在遇到錯誤的時候不會被中斷;
⒋具備較好的可移植性,能夠移植到另外一個 Oracle數據庫中;
⒌集成在數據庫中,調用更快;
⒍減小了網絡的交互,有助於提升程序性能。
2 PL/SQL程序的基本結構
PL/SQL塊由四個基本部分組成:聲明、執行體開始、 異常處理、執行體結束。
下面是四個部分的基本結構:
DECLARE —— 可選部分
……
BEGIN —— 必要部分
SQL語句和PL/SQL語句構成的執行程序
……
EXCEPTION —— 可選部分
程序出現異常時,捕捉異常並處理異常
……
END;—— 必須部分
通常都採用linux,相對windows而言,有幾個優點:
1:免費
2:更安全
3:選擇ubuntu server版,更省資源,系統更快
4:成本低,不過對開法者要求更高一些。
若是隻想發佈爲一個可執行的jar包,使用eclipse的Export功能就能夠了 使用eclipse的Export功能,將項目中的全部package打包爲一個pet.jar文件,假定項目中全部配置文件都在項目根目錄的config文件夾.
新建一個文件夾bushu,將項目中的config文件夾放進來 用winrar打開項目引用的全部jar文件,將文件中的全部包文件夾添加進pet.jar文件 建立pet.dat文件,內容:start java -Xmx512m -jar pet.jar 運行pet.dat 若是最終想發佈爲可執行程序 我使用開源項目jsmooth提供的軟件 項目地址 使用eclipse的Export功能,將項目中的全部package打包爲一個pet.jar文件,個人項目中全部配置文件都在項目根目錄的config文件夾. 新建一個文件夾bushu,將項目中的config文件夾、引用的外部jar包和pet.jar文件都放進來,全部包文件都放到bushu下的lib目錄下 打開jsmooth,新建一個項目,設置好後編譯就能夠生成exe文件,附件中我截取了全部jsmooth配置的圖片. 首先,將編譯好的程序打包成jar文件,而後作出exe,這樣代碼就不可見了;可是exe文件在沒有安裝jre的電腦上不能運行,若是要求客戶再去安裝jre 設置環境變量 就不雅了。咱們須要將jre打包。 這幾步操做網上介紹的插件和方法不少,但有的好用有的很差用,並且有的還須要註冊。通過嘗試比較,在「千里冰封」的博客上獲得了很大的幫助。整理一下。使用這幾個工具,您也能夠順利的發佈您的java程序! 1 打包成雙擊可執行的jar文件。 推薦插件:fatJar(Eclipse使用) 下載地址 http://sourceforge.net/project/showfiles.php?group_id=115990&package_id=125924 我用的是Eclipse,它自帶的打包方法在打包一些圖片等資源時不是很爽。可使用這個插件。
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎全部的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄。
添加相應的jar包
【mybatis】
mybatis-3.1.1.jar
【MYSQL驅動包】
mysql-connector-java-5.1.7-bin.jar
若是使用 Maven 來構建項目,則需將下面的 dependency 代碼置於 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
1、添加Mybatis的配置文件conf.xml
在src目錄下建立一個conf.xml文件,以下圖所示:
<?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
3 <configuration>
4 <environments default="development">
5 <environment id="development">
6 <transactionManager type="JDBC" />
7 <!-- 配置數據庫鏈接信息 -->
8 <dataSource type="POOLED">
9 <property name="driver" value="com.mysql.jdbc.Driver" />
10 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11 <property name="username" value="root" />
12 <property name="password" value="XDP" />
13 </dataSource>
14 </environment>
15 </environments>
16
17 </configuration>
User類的代碼以下:
複製代碼
1 package me.gacl.domain;
2
3 /**
4 * @author gacl
5 * users表所對應的實體類
6 */
7 public class User {
8
9 //實體類的屬性和表的字段名稱一一對應
10 private int id;
11 private String name;
12 private int age;
13
14 public int getId() {
15 return id;
16 }
17
18 public void setId(int id) {
19 this.id = id;
20 }
21
22 public String getName() {
23 return name;
24 }
25
26 public void setName(String name) {
27 this.name = name;
28 }
29
30 public int getAge() {
31 return age;
32 }
33
34 public void setAge(int age) {
35 this.age = age;
36 }
37
38 @Override
39 public String toString() {
40 return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
41 }
42 }
定義操做users表的sql映射文件userMapper.xml
建立一個me.gacl.mapping包,專門用於存放sql映射文件,在包中建立一個userMapper.xml文件,
userMapper.xml文件的內容以下:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 <!-- 爲這個mapper指定一個惟一的namespace,namespace的值習慣上設置成包名+sql映射文件名,這樣就可以保證namespace的值是惟一的
4 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除後綴)
5 -->
6 <mapper namespace="me.gacl.mapping.userMapper">
7 <!-- 在select標籤中編寫查詢的SQL語句, 設置select標籤的id屬性爲getUser,id屬性值必須是惟一的,不可以重複
8 使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型
9 resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的對象返回
10 User類就是users表所對應的實體類
11 -->
12 <!--
13 根據id查詢獲得一個user對象
14 -->
15 <select id="getUser" parameterType="int"
16 resultType="me.gacl.domain.User">
17 select * from users where id=#{id}
18 </select>
19 </mapper>
四、在conf.xml文件中註冊userMapper.xml文件
複製代碼
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
3 <configuration>
4 <environments default="development">
5 <environment id="development">
6 <transactionManager type="JDBC" />
7 <!-- 配置數據庫鏈接信息 -->
8 <dataSource type="POOLED">
9 <property name="driver" value="com.mysql.jdbc.Driver" />
10 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11 <property name="username" value="root" />
12 <property name="password" value="XDP" />
13 </dataSource>
14 </environment>
15 </environments>
16
17 <mappers>
18 <!-- 註冊userMapper.xml文件,
19 userMapper.xml位於me.gacl.mapping這個包下,因此resource寫成me/gacl/mapping/userMapper.xml-->
20 <mapper resource="me/gacl/mapping/userMapper.xml"/>
21 </mappers>
22
23 </configuration>
五、編寫測試代碼:執行定義的select語句
建立一個Test1類,編寫以下的測試代碼:
package me.gacl.test;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import me.gacl.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test1 {
public static void main(String[] args) throws IOException {
//mybatis的配置文件
String resource = "conf.xml";
//使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)
InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
//構建sqlSession的工廠
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//構建sqlSession的工廠
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//建立能執行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的標識字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper標籤的namespace屬性的值,
* getUser是select標籤的id屬性值,經過select標籤的id屬性值就能夠找到要執行的SQL
*/
String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的標識字符串
//執行查詢返回一個惟一user對象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}
}
http://www.cnblogs.com/armyfai/p/3985660.html
創建用戶組,在VisualSVN Server Manager窗口的左側右鍵單擊用戶組,選擇Create Group或者新建->Group,
注意事項:
.svn這個隱藏目錄記錄着兩項關鍵信息:工做文件的基準版本和一個本地副本最後更新的時間戳,千萬不要手動修改或者刪除這個.svn隱藏目錄和裏面的文件!!,不然將會致使你本地的工做拷貝(靜態試圖)被破壞,沒法再進行操做。
1) TortoiseSVN圖標介紹
一個新檢出的工做複本使用綠色的對勾重載,表示Subversion狀態正常。
在你開始編輯一個文件以後,狀態就變成了已修改,而圖標重載已變成了紅色感嘆號。經過這種方式,你能夠很容易地看出那些文件從你上次更新工做複本被修改過,且須要提交。
若是在提交的過程當中出現了衝突,圖標就會變成了黃色感嘆號。
加號告訴你有一個文件或者目錄已經被計劃加入到版本控制中。
2. 增長(Add)
在test項目文件下,新建一個b.txt文件,提交到版本庫的方法以下2種:
1. 先提到變動列表中,再commit到配置庫中,選擇新增文件,右鍵SVN菜單執行「Add「操做提交到」變動列表中」,而後右鍵SVN菜單執行」SVN Commit」提交到版本庫中。
2. 不提交到變動列表中,而是直接commit配置庫中,選擇該文件,右鍵svn菜單執行」SVN Commit」操做。
3. 刪除(Delete)
若是被刪除的文件還未入版本庫,則能夠直接使用操做系統的刪除操做刪除該文件。
若是被刪除的文件已入版本庫,則刪除的方法以下:
使用操做系統的刪除操做刪除該文件,而後選擇被刪除文件的父目錄,右鍵svn菜單執行」SVN Commit」,在變動列表中選擇被刪除的文件
4. 更名(Rename)
修改文件名,選中須要重命名的文件或文件夾,而後右鍵「TortoiseSVNàRename「,在彈出的對話框中輸入新名稱,點擊」ok」按鈕,並將修改文件名後的文件或文件夾經過 「SVN Commit」提交到SVN服務器上。
5. SVN還原(SVN Revert)
右擊想要回退的文件或者文件夾,在TortoiseSVN彈出菜單中選擇」Update to reversion…」
6. 檢查更新(Check for modifications)
此功能能夠顯示你所作的修改有哪些尚未提交的,此功能不光能看到對文件的修改變化,全部的變化都能看到,包括增長文件或者目錄,刪除文件或者目錄,移動文件或者目錄等,若是你點擊了檢查版本庫,那你還能夠看到版本庫裏的改動,既別人提交了哪些文件的改動,你還沒更新到本地,以下:
7. SVN更新(SVN Update)
更新本地代碼與SVN服務器上最新的版本一致,只要在須要更新的文件夾上點擊右鍵或者在文件下空白處點擊右鍵,選擇」SVN Update」 (獲取指定版本中的內容,點擊右鍵執行SVN菜單中的「Update to reversion「),就能夠了。
7.1 如何解決衝突文件
對於每一個衝突的文件Subversion在你的目錄下放置了三個文件:以下:
爲何會產生衝突代碼呢?緣由很簡單就是由於不一樣的人,同時修改了同一個文件的同一個地方,這時候,他提交了,我沒有提交,我就提交不了,這個時候咱們要進行先更新,而後在進行提交便可,那若是產生衝突,會生成如上3個文件。
解決方案以下:
首先咱們能夠看下1.txt代碼以下:
<<<<<<< .mine
aaaasdf11222333 dderderder
=======
b>>>>>>> .r5
而後我去掉多餘的代碼,1.txt變成這樣
aaaasdf11222333 dderderder
進行提交,仍是提交不了,以下所示:
爲何?由於衝突會產生上面的三個文件,有上面3個文件存在確定提交不了,這三個文件代碼及解釋以下:
aaaasdf11222333 dderderder
2. 1.txt.r4 是衝突前本地的版本文件
內容以下:aaaasdf11222333
3. 1.txt.r5 是別人趕在你以前提交的版本
內容以下: b
其中,<<<<<<<<.mine .....=======之間的代碼是你本身的,而======......>>>>>>>.r5是別人與你衝突的代碼部分
這樣就不難理解爲何會產生衝突這種奇怪的東西了,由於大家修改的同一塊代碼,固然會產生衝突。
解決方案以下:
<<<<<<< .mine
6666666666666600000
=======
66666666666aaaaaaaaaa666
>>>>>>> .r16
前面說過 <<<<<<< .mine …… =======
……之間的代碼是我未產生衝突以前修改的代碼,
======= ………>>>>>>> .r16 這中間……的代碼是別人與我衝突代碼的部分,從上面的代碼能夠看到 aaaaaaaaa是我同事新增的 ,00000是我後增長的。
點擊ok按鈕後 能夠看到其餘三個文件都自動刪掉了,1.txt代碼變成以下代碼:
66666666666aaaaaaaaaa666
也就是a用戶提交的代碼,我本身更新的代碼須要本身動手複製進去便可提交commit。
<<<<<<< .mine
333333338888888888888=======
3333cccccccccc3333>>>>>>> .r16
經過第一點咱們知道,333333338888888888888這個內容是我修改後,未產生衝突以前的內容,3333cccccccccc3333這個代碼是A用戶提交的代碼,從上面得知 A用戶新增內容是ccccccc,而我新增的內容是8888888。
那麼第二種解決方法以下:
選擇文件->右鍵Editconficts:這種方法須要衝突雙方通過協商以後將代碼更改統一以後再提交。不只解決了衝突並且還保證了代碼是正確的,由於只有一方的代碼被提交.
如上圖所示,紅色的部分是衝突代碼:theirs表示當前服務器端最新的代碼,Mine表示本身修改後的代碼,Merged表示合併後的代碼。點擊紅色後右鍵選擇:use this text block就能夠將該部分代碼做爲合併後的代碼
接下來再說說因爲衝突致使重要代碼被覆蓋的狀況。衝突發生時若是採起的措施不對可能會致使部分代碼丟失,若是想要還原以前的代碼也很容易。
選擇文件->右鍵選擇show log在這裏面你能夠看見以前提交的全部版本,找到你想要恢復的版本右鍵選擇revert to this version 就能夠恢復了.
SVN提交(SVN Commit)
Svn的提交是將在工做空間作的修改進行提交,包括文件內容的修改,文件或目錄的添加,刪除,命名,移動等操做。以下圖所示:
8. 顯示日誌(Show log)
經過此功能能夠查到誰,何時,對那個目錄下的那些文件進行了那些操做,以下圖:
9. 版本庫瀏覽(Repo-browser)
此功能是用來瀏覽須要查看的資料庫,在本地文件夾下點擊右鍵,選擇TortoiseSVNàRepo-browser,在彈出的對話框中輸入資料庫地址,再輸入用戶名和密碼,就能查看到你須要查看到版本庫的內容,在這你還能看到那些文件被誰鎖定了,以下圖:
三: 建立分支合併相互操做
項目中爲什麼要建立分支,及合併?
好比我如今項目全部的文件放在主幹上(trunk)中,因爲需求的變動,須要增長新的需求,可是咱們主幹上還要繼續往下開發,在此咱們能夠新建一個分支,來作增長新的需求那一塊,主幹上繼續開發,等分支上代碼沒有問題的時候,再合併到主幹上來。
建立分支的最大的目的就是跟主線進行並行開發時候不影響主線的開發。
如何操做?
假如我本地新建一個文件夾test下有2個文件夾trunk(存放主幹上的代碼)和branch(存放分支上的代碼),以下所示:
一:先提取主幹上的代碼。
點擊trunk --> 鼠標右鍵 --> 點擊SVN Checkout --> 彈出一個對話框,以下圖所示:
其中上面的URL是從服務器VisualSVN Server上獲取的,以下所示:
直接右鍵qianduan3 --> Copy URL to Clipboard 便可。
其中qianduan3項目有以下文件,以下圖所示:
最後點擊上面的checkout按鈕後,就能夠在主幹上把代碼從遠程服務器上獲取到,以下所示:
二:新建分支
從trunk(主幹上)建立分支(branch)步驟以下:
1. 右鍵trunk --> branch/Tag 以下圖:
在彈出的對話框以下圖:
點擊ok按鈕後,就能夠在VisualSVN Serval服務器上新增newBranch,是從如上服務器qianduan3上的文件拷貝一份的,以下所示:
如今咱們能夠再來看看本地branch文件夾了,我如今直接進入branch文件下,右鍵 --> Chenckout下,就能夠把newBranch下的全部文件提取出來了,以下所示:
點擊ok按鈕就能夠把文件提取出來了,以下圖所示:
分支目前創建在svn的服務器端,本地並無更新,對本地branch文件夾 右鍵--> update便可,就能夠更新到分支代碼,以下所示:
四:合併分支到主幹上
好比我如今對branch分支上新增3.txt文件,而後提交上去,以下所示:
我如今想把分支上的代碼3.txt合併到主幹上trunk,如今要怎麼合併呢?步驟以下:
1. 回到咱們剛剛的主幹(trunk)文件夾下,鼠標右鍵該文件夾 --> TortoiseSVN --> Merge 以下圖所示:
在彈出的窗口,以下圖所示:
接着點擊【Next】下一步,以下圖所示:
再接着【Next】下一步,以下圖所示:
就能夠看到主幹trunk上多加了一個3.txt,就是從分支上合併過來的。
五:合併主幹到分支。
若是主幹上有一些更新,好比說jar包更新等等,那麼這些要更新到分支上去,如何操做呢?好比我如今在主幹上新建一個4.txt文件,好比以下:
我如今的分支上目錄以下:
如今是想把主幹上的4.txt合併到分支上來,要如何操做?
步驟以下,仍是和剛剛操做相似.
1. 咱們在分支點擊branch --> 右鍵TortoiseSVN --> Merge 以下圖所示:
在彈出新窗口後,以下圖所示:
接着點擊【Next】下一步,以下圖所示:
繼續下一步,以下圖:
最後直接merge,就能夠看到分支branch上也有主幹上的4.txt文件了,也就是說,合併主幹到分支上也是能夠的,以下圖所示:
理論上應該是:
1、立項
一、項目的功能的範圍、實現技術方法和細節
二、須要多少人,須要的開發週期(根據客戶的需求)
三、分析成本和風險
四、有相應的利潤,能夠立項
2、需求調研;
3、需求評審、肯定;
4、概要設計(對技術框架、模塊、功能的肯定);
5、詳要設計(對錶、業務聯繫的肯定);
6、架構師總體架構軟件、佈置開發任務;
7、整合軟件;
8、測試;
9、試運行、維護;
10、正式運行
在實際中跟過二個項目,都是具體和用戶交涉,和理論仍是有出入的。
------解決方案--------------------