<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Gay Bird

    登高者必自卑,行遠者必自邇,在這個世界上,重要的不是你正站在那里,而是你正朝什么方向移動......

    2008年9月25日 #

    JAVA幾種對象的解釋

    posted @ 2008-10-16 12:52 Sky Yi 閱讀(273) | 評論 (0)編輯 收藏

    MSSQL事務、事務隔離級別、鎖的簡單總結

    一、數據庫事務
    1、事務是作為單個邏輯工作單元執行的一系列操作。可以是一條SQL語句也可以是多條SQL語句。

    2、事務具有四個特性
       原子性:不可分隔、成則具成、敗則具敗。
       恢灤裕菏攣裨諭瓿墑保 匭朧顧 械氖 荻急3忠恢倫刺?
       隔離性:獨立的執行互不干擾。由并發事務所作的修改必須與任何其他并發事務所作的修改隔離(另外的描述:多個事務同時進行,它們之間應該互不干擾.應該防止一個事務處理其他事務也要修改的數據時,不合理的存取和不完整的讀取數據)
      
    3、啟動事務:使用 API 函數和 Transact-SQL 語句,可以按顯式、自動提交或隱式的方式來啟動事務。

    4、結束事務:您可以使用 COMMIT(成功) 或 ROLLBACK(失敗) 語句,或者通過 API 函數來結束事務。

    5、創建事務的原則:
       盡可能使事務保持簡短很重要,當事務啟動后,數據庫管理系統 (DBMS) 必須在事務結束之前保留很多資源、以保證事務的正確安全執行。
       特別是在大量并發的系統中, 保持事務簡短以減少并發 資源鎖定爭奪,將先得更為重要。
       1、事務處理,禁止與用戶交互,在事務開始前完成用戶輸入。
       2、在瀏覽數據時,盡量不要打開事務
       3、盡可能使事務保持簡短。
       4、考慮為只讀查詢使用快照隔離,以減少阻塞。
       5、靈活地使用更低的事務隔離級別。
       6、靈活地使用更低的游標并發選項,例如開放式并發選項。
       7、在事務中盡量使訪問的數據量最小。

     

    二、事務的隔離級別

    1、數據庫事務的隔離級別:四種

    隔離級別 臟讀(Dirty Read) 不可重復讀(NonRepeatable Read) 幻讀(Phantom Read)
    讀未提交(Read uncommitted) 可能 可能 可能
    讀已提交(Read committed) 不可能 可能 可能
    可重復讀(Repeatable read) 不可能 不可能 可能
    可串行化(Serializable ) 不可能 不可能 不可能

    2、數據庫一般的默認隔離離級別是“讀已提交”,默認的事務隔離級別下:Insert,update ,delete下的是X鎖, 會等待事務完成。通常情況下可以把隔離級別設為Read Commited,它能避免臟讀,而且有較好的并發性能。盡管它會導致不可重復讀、虛讀和第二類更新丟失等問題,在可能出現這類問題的個別場合可以由應用程序釆用悲觀鎖或樂觀鎖來控制。


    3、SQL語句可以使用SET TRANSACTION ISOLATION LEVEL來設置事務的隔離級別。如:SET TRANSACTION ISOLATION LEVEL   Read Committed。若要在應用程序中使用更嚴格或較寬松的隔離級別,可以通過使用   set transaction isolation level語句設置會話的隔離級別,來自定義整個會話的鎖定。  
    指定隔離級別后,sql server會話中所有select語句的鎖定行為都運行于該隔離級別上,并一直保持有效直到會話終止或者將隔離級別設置為另一個級別。

    4、另外要提一點:SQL標準對事務隔離級別的規定,是按該級別不可能發生什么問題來確定的,不一定會發生這樣的問題;所以,不同的數據庫對事務隔離的級別約定不一樣,比如,有的數據庫把 可重復讀級別按可串行化來對待。(lkdlhw_2000個人理解:各個數據庫應該都遵循四種標準的事務隔離等級的定義,但是某些數據庫具體實現可能不存在四種,因為串行化可以避免不可重復讀,因此某些數據庫語法上支持設置事務隔離等級為不可重復讀,但實際上是串行化在起作用。也就是說只要該級別能夠避免不可重復讀的問題,就可以稱之為不可重復讀取級別。)

    5、該隔離級別定義一個事務必須與其他事務所進行的資源或數據更改相隔離的程度。事務隔離級別控制:
         讀取數據時是否占用鎖以及所請求的鎖類型。
         占用讀取鎖的時間。
         引用其他事務修改的行的讀取操作是否:
         在該行上的排他鎖被釋放之前阻塞其他事務。
         檢索在啟動語句或事務時存在的行的已提交版本。
         讀取未提交的數據修改

    三、鎖

    1、分類:從數據庫系統的角度來看:分為獨占鎖(即排它鎖),共享鎖和更新鎖

    2、事務使用鎖,防止其他用戶修改另外一個還沒有完成的事務中的數據。對于多用戶系統來說,鎖機制是必須的。SQL Server有多種鎖,允許事務鎖定不同的資源。鎖就是保護指定的資源,不被其他事務操作。SQL Server有多種鎖,允許事務鎖定不同的資源。鎖就是保護指定的資源,不被其他事務操作。為了最小化鎖的成本,SQL Server自動地以與任務相應等級的鎖來鎖定資源對象。鎖定比較小的對象,例如鎖定行,雖然可以提高并發性,但是卻有較高的開支,因為如果鎖定許多行,那么需要占有更多的鎖。鎖定比較大的對象,例如鎖定表,會大大降低并發性,因為鎖定整個表就限制了其他事務訪問該表的其他部分,但是成本開支比較低,因為只需維護比較少的鎖。

    3、 鎖的特點:
    1. 鎖是保證并發控制的手段
    2. 可以鎖定的資源包括行、頁、簇、表和數據庫
    3. 鎖的類型主要包括共享鎖和排它鎖
    4. 特殊類型的鎖包括意圖鎖、修改鎖和模式鎖
    5. 共享鎖允許其他事務繼續使用鎖定的資源
    6. 排它鎖只允許一個事務訪問數據
    7. 系統本身可以處理死鎖
    8. 用戶可以根據實際情況定制鎖的一些特征

    4、鎖是定義到sql語句上的,對數據進行操作的sql就是:select,Insert,update ,delete。不同的事物隔離即被在執行sql的時候會向表上發送不同的鎖。

    關于鎖的更多描述,可以去網上搜索一下。http://www.bitscn.com/windows/sql/200604/1068.html

    四、多個用戶同時對數據庫的并發操作時會帶來以下數據不一致的問題:

    臟讀dirty reads:
       當事務讀取還未被提交的數據時,就會發生這種事件。舉例來說:Transaction1修改了一行數據,然后Transaction2在Transaction1還未提交修改操作之前讀取了被修改的行。如果Transaction1回滾了修改操作,那么Transaction2讀取的數據就可以看作是從未存在過的。
    不可重復的讀non-repeatable reads:
       當事務兩次讀取同一行數據,但每次得到的數據都不一樣時,就會發生這種事件。舉例來說:Transaction1讀取一行數據,然后Transaction2修改或刪除該行并提交修改操作。當Transaction1試圖重新讀取該行時,它就會得到不同的數據值(如果該行被更新)或發現該行不再存在(如果該行被刪除)。    
    虛讀phantom read:
       如果符合搜索條件的一行數據在后面的讀取操作中出現,但該行數據卻不屬于最初的數據,就會發生這種事件。舉例來說Transactio1讀取滿足某種搜索條件的一些行,然后Transaction2插入了符合Transaction1的搜索條件的一個新行。如果Transaction1重新執行產生原來那些行的查詢,就會得到不同的行。

    為了解決這些問題,數據庫引入了“鎖”的機制(從數據庫系統的角度來看:分為獨占鎖(即排它鎖),共享鎖和更新鎖,詳細內容不再描述)。

     

    五、lkdlhw_2000個人理解(以下問題都是推測,還沒有證實):

    隔離級別是由鎖來實現的,之所以出現事務的隔離級別相當于數據庫開發商根據一般的業務需求實現定義好的一組鎖使用的規則,便于我們時候,當我們將事務隔離級別定義到某一級上后如果不能滿足需求,我們還可以自行定義sql的鎖來覆蓋事務隔離級別默認的鎖機制?

    鎖存在兩個問題:一個是鎖的粒度,一個是鎖的時間,鎖的時間應該包括兩種一種是sql執行完就釋放鎖,領一中是事務結束后釋放鎖

    六、參考文章

    http://www.es-ivision.com/Channel-4-10-108-0.html
    http://tech.ccidnet.com/art/1105/20050602/261573_1.html
    http://www.tkk7.com/zhengtengfeng/archive/2007/04/23/113025.html

    七、事務隔離級別的例子

    1. Read Uncommitted:最低等級的事務隔離,僅僅保證了讀取過程中不會讀取到非法數據。上訴4種不確定情況均有可能發生。
    2. Read Committed:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用于大多數系統。
    第一個查詢事務
    SET TRANSACTION ISOLATION LEVEL   Read Committed
    begin tran
       update Cate SET Sname=Sname+'b' where ID=1
       SELECT * FROM cate where ID=1
       waitfor delay '00:00:6'  
       rollback tran --回滾事務
    select Getdate()
    SELECT * FROM cate where ID=1
    第二個查詢事務
    SET TRANSACTION ISOLATION LEVEL Read committed   --把committed換成Read uncommitted可看到“臟讀取”的示例。
    SELECT * FROM cate where ID=1
    select Getdate()
    可以看到使用 Read Committed 成功的避免了“臟讀取”.
    3. Repeatable Read:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。
    第一個查詢事務
    SET TRANSACTION ISOLATION LEVEL Repeatable Read --   把Repeatable Read換成Read committed可以看到“不可重復讀取”的示例
    begin tran
    SELECT * FROM cate where ID=33 --第一次讀取數據
       waitfor delay '00:00:6'  
    SELECT * FROM cate where ID=33 --第二次讀取數據,不可重復讀取
    commit
    第二個查詢事務
    SET TRANSACTION ISOLATION LEVEL Read committed
    update cate set Sname=Sname+'JD' where ID=33
    SELECT * FROM cate where ID>30
    4. Serializable:最高等級的事務隔離,上面3種不確定情況都將被規避。這個級別將模擬事務的串行執行。
    在第一個查詢窗口執行
    SET TRANSACTION ISOLATION LEVEL Serializable -- 把Serializable換成Repeatable Read 可看到“幻像讀”的示例
    begin tran
    SELECT * FROM cate where ID>30 --第一次讀取數據,“幻像讀”的示例
       waitfor delay '00:00:6'   --延遲6秒讀取
    SELECT * FROM cate where ID>30 --第一次讀取數據
    commit
    第二個查詢事務
    SET TRANSACTION ISOLATION LEVEL Read committed
    Delete from cate where ID>33
    SELECT * FROM cate where ID>30
    創建事務

    設置事務級別:SET TRANSACTION ISOLATION LEVEL
    開始事務:begin tran
    提交事務:COMMIT
    回滾事務:ROLLBACK
    創建事務保存點:SAVE TRANSACTION savepoint_name
    回滾到事務點:ROLLBACK TRANSACTION savepoint_name



    1、并發的影響:http://technet.microsoft.com/zh-cn/library/ms190805.aspx
          該文章列出了并發引起的四種影響:丟失更新、臟讀(未提交的依賴關系)、不可重復讀(不一致的分析)、幻讀
      
    2、并發控制類型:http://technet.microsoft.com/zh-cn/library/ms189132.aspx
         當許多人試圖同時修改數據庫中的數據時,必須實現一個控制系統,使一個人所做的修改不會對他人所做的修改產生負面影響。這稱為并發控制。并發控制類型分為兩大類:樂觀并發控制和悲觀并發控制
      
    3、數據庫引擎中的隔離級別:http://technet.microsoft.com/zh-cn/library/ms189122.aspx
         1)講到了事務隔離級別控制的內容:
               事務隔離級別控制:
              讀取數據時是否占用鎖以及所請求的鎖類型。
              占用讀取鎖的時間。
              引用其他事務修改的行的讀取操作是否:
                     在該行上的排他鎖被釋放之前阻塞其他事務。
                    檢索在啟動語句或事務時存在的行的已提交版本。
                     讀取未提交的數據修改。
          2)列出了事務的隔離級別:
            未提交讀(隔離事務的最低級別,只能保證不讀取物理上損壞的數據)
             已提交讀(數據庫引擎的默認級別)
             可重復讀
             可序列化(隔離事務的最高級別,事務之間完全隔離)

         3)選擇事務隔離級別不影響為保護數據修改而獲取的鎖。事務總是在其修改的任何數據上獲取排他鎖并在事務完成之前持有該鎖,不管為該事務設置了什么樣的隔離級別。對于讀取操作,事務隔離級別主要定義保護級別,以防受到其他事務所做更改的影響。
      
    4、SET TRANSACTION ISOLATION LEVEL (Transact-SQL) 設置事務隔離級別http://technet.microsoft.com/zh-cn/library/ms173763.aspx
         該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同
    5、總結:
         通過以上幾篇文章基本上可以了解數據庫事務和鎖之間的關系。數據庫事務隔級別也是由鎖機制來最實現的。要想了解關于鎖的更深層析的內容還需要專門學習鎖的相關知識。

    posted @ 2008-10-11 13:11 Sky Yi 閱讀(5555) | 評論 (1)編輯 收藏

    struts2筆記 - 配置

         摘要: 與Struts 1.X不同,Struts2引入了WebWork的配置機制,在很大程度上提高了配置的靈活度。通過使用配置可以配置如下內容: 配置類型 配置文件 ...  閱讀全文

    posted @ 2008-10-08 14:36 Sky Yi 閱讀(703) | 評論 (0)編輯 收藏

    struts2筆記 - helloworld

    可以從Apache Struts 的官方站點(http://struts.apache.org)下載發布版本,當前最新的版本是2.0.9。下載的版本中包含struts2-core.jar和相關的依賴類庫文件,示例程序,HTML格式的文檔,和全部的源代碼。

    1,導入struts2需要的jar文件
    commons-logging-1.0.4.jar              日志記錄接口,可以配置選擇使用jdk1.4 log 或者 log4j
    freemarker-2.3.8.jar                        所有標簽的模板都是用Freemarker編寫
    ognl-2.6.11.jar                               Objet Graph NavigationLanguage,Struts2表達式的基礎。
    struts2-core-2.0.9.jar                      struts2框架類庫
    xwork-2.0.4.jar                               xwork類庫,struts2的基礎

    2,配置web.xml文件
    <?xml version="1.0"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd"
    >

    <web-app>
      
    <display-name>My Application</display-name>
      
    <filter>
        
    <!--配置struts過濾器-->
        
    <filter-name>struts2</filter-name>
        
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
      
    </filter>

      
    <filter-mapping>
        
    <filter-name>struts2</filter-name>
        
    <url-pattern>/*</url-pattern>
      
    </filter-mapping>
    </web-app>

    3,配置struts.xml文件
    必須要把該文件建立在編譯好的WEB-INF下的classes目下
    在myeclipse可以把它新建到src下。src下的所有資源文件等都會在保存時自動編譯到classes目錄
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"
    >

    <struts>
        
    <!-- 配置默認的包. -->
        
    <package name="default" extends="struts-default">
             
        
    </package>
    </struts>


    3,建立頁面文件
    Struts2提交一個請求的時候,輸入的數據并沒有直接送給下一個頁面,而是送給了一個你提供的Java類。這種Java類被稱為Action。當 Action執行之后,Struts2會選擇一個結果作為返回,通常情況下是一個JSP頁面,但是也可以是PDF文件,Excel表單或者Java Applet窗口。
    這時需要做的是
  • 創建一個JSP頁面來顯示歡迎消息
  • 創建一個Action類來生成歡迎消息
  • 在struts.xml中創建一個配置項來關聯上述的Action和JSP頁面

  • 建立jsp頁面
    第一行引入了struts2的標簽庫,在之后的頁面中可以使用s標簽了。這行在幾乎所有的struts2應用的jsp頁面中都會出現

    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
        
    <head>
            
    <title>Hello World!</title>
        
    </head>
        
    <body>
            
    <s:form action="hello">
             
    <s:textfield name="name" label="name" />
           
    </s:form>
        
    </body>
    </html>

    創建action類
    execute方法用來處理業務操作
    import com.opensymphony.xwork2.ActionSupport;
    public class HelloWorld extends ActionSupport {

        
    private String name;
        
    public String execute() throws Exception {
           
    return SUCCESS;
        }


        
    public void setName(String name){
            
    this.name= name;
        }


        
    public String getName() {
            
    return name;
        }

    }

    配置struts.xml關聯jsp和action
    <!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        
    <package name="tutorial" extends="struts-default">        
            
    <action name="HelloWorld" class="tutorial.HelloWorld">         
                
    <result>/HelloWorld.jsp</result>        
            
    </action>       
         
    </package>
    </struts>

    工作原理
    當瀏覽器發送請求 http://localhost:8080/tutorial/HelloWorld.action 的時候,在服務器上發生了如下事件:

    1. 服務器接收到對HelloWorld.action的請求,根據web.xml文件中的配置,所有以.action結尾的請求都會被 org.apache.struts2.dispatcher.FilterDispatcher過濾,所以這個請求被發送給 FilterDispatcher,FilterDispatcher是Struts 2 框架的入口點。
    2. Struts 2 框架查找HelloWorld.action對應的Java 類,發現是HelloWorld.java,之后Struts 2 框架實例化了一個HelloWorld類,并且調用了這個類的execute方法。
    3. execute方法設置了message的內容,并且返回SUCCESS。框架卻定返回值SUCCESS,并且找到對應的內容HelloWorld.jsp,并且通知服務器將HelloWorld.jsp作為返回內容。
    4. 在HelloWorld.jsp被處理的過程中,<s:property value="message" />標簽的內容被替換為HelloWorld 的getMessage方法調用的結果
    5. 根據HelloWorld.jsp內容生成的HTML內容被發回到請求的瀏覽器。
    結果類型(Result Type)
    Action 處理完成之后,會選擇一個結果返回給客戶,這個結果可能是簡單的HTML頁面,JSP頁面,FreeMarker模板,Velocity模板,或者是一個 PDF文旦個或者是更復雜的JasperReports。一個Action可能有幾個可選的結果類型,為了決定到底使用那個結果類型,Action類的 execute方法必須返回一個標記結果類型的字符串。
    struts.xml
    <action name="Logon" class="tutorial.Logon">
      <result type="redirect-action">Menu</result>
      <result name="input">/tutorial/Logon.jsp</result>
    </action>
    如果我們輸入了用戶名和密碼,Logon Action會返回“success”。"success"是默認的返回結果,這個時候會使用Menu action作為結果。
    如果我們什么也不輸入,Logon Action 會返回"input", Struts 2會使用Logon.jsp 作為結果返回

    posted @ 2008-10-08 14:31 Sky Yi 閱讀(486) | 評論 (0)編輯 收藏

    struts2筆記 - 概述

    Struts 2 中不想要要在在處理和HTTP相關的操作,自需要使用框架的接口即可。
           在Strut 2 中不再會涉及到諸如 HttpServletRequest, HttpServletResponse, HttpSession等Http相關的Servlet接口類,取而代之的是Struts 2 的接口,例如RequestAware,SessionAware等。

    Struts 2 的標簽基于 CSS,標簽可以提供自己需要的HTML支持。
            Struts 2 的標簽利用了CSS和模板,使用起來會非常方便,在Struts 1.x中我們需要使用Table來組織表單,但是在Struts 2中所有的標簽自帶了Table內容,可以方便的處理格式。例如<s:textfield> 標簽自動添加了 <tr> <td> 等標簽。

    有狀態的Checkbox,可以以一種統一的方式記錄checkbox狀態的變化。
           在Struts 2中即使沒有被選中的checkbox其內容仍然存在于Struts 2 框架中,不必像在Struts 1.x中那樣需要做特殊的存在性判斷。

     靈活的取消按鈕,在取消按鈕點擊的時候可以指向一個不同的action。
           @TODO
           可以在制定Form的action的同時,制定cancel按鈕的action,當點擊submit和cancel的時候出現完全按不同的功能。

        第一等級的AJAX的支持,在普通struts 標簽的基礎上,使用AJAX增加了交互性和靈活性。
           Struts 2 的標簽內置了Ajax的支持。Struts 2 的標簽使用了Dojotoolkit Ajax框架,不但能夠使用Ajax特性,而且能夠使用非常豐富和強大的瀏覽器小控件,例如日期選擇控件

        見到那集成Spring框架,非常簡單的使用Spring框架提供的依賴注入功能。
           可以方便的使用Spring管理Struts 2 的action的創建,通過使用Spring可以充分的利用Spring的依賴諸如功能,并且能夠很好的集成其他的框架,例如Hibernate,iBatis等。

        更多的返回形式,除了JSP還支持,JasperReports,JFreeChart, Action鏈,文件下載等。
           除了支持JSP的表現形式,還支持JasperResports報表, JFreechart圖標,Action鏈,文件下載等。

        POJO表單,不再需要ActionForms,使用Javabean獲得客戶的收入或者將屬性表示出來,
        完全消除了ActionForm組建,可以使用任意合適的類型來接受頁面傳來的數據或者將數據表現出來。ActionFrom可以使用POJO的 JavaBean來替代,JavaBean中的屬性可以使用String,也可以使用具體的類型,例如Date,Int等。

        POJO Action,使用任意的類作為Action類,甚至可以使用接口。
           任何類都可以作為Action類,只要接口滿足一些簡單的定義,不需要在使用Action類似的基類,你可以完全自由的發揮。
    部署
        插件結構,使用jar文件擴展框架功能,不需要在做手動的配置,內置了JavaServer Faces, JasperResports, JFreeChart, Tiles等插件。
           擴展一個功能只需要添加一個插件,插件甚至可以熱插拔,在你的應用不停止的情況下追加新的功能。

        集成了分析功能,可以方便的找到程序性能的問題點。
           可以不借助外力發現程序的熱點,找到問題的所在,

        準確的報告錯誤,可以非常準確的指出程序的問題點。
           準確的報告運行時的錯誤,方便解決問題。

    維護
        Action容易測試,直接測試Struts 2的Action,不需要使用Mock Http對象來測試。
           Action是普通的類,不需要特殊的環境,所以Struts 2 的Action 特別容易測試。

        聰明的默認值,不需要配置不必要的配置,大部分的框架配置元素的都有非常合適的默認值,基本上你不需要在做任何配置。
           Struts 2 有很多的配置項,但是每一個都有默認值,基本額上不需要更改默認的選項即可保證最佳

        容易定制的控制器,可以定制每一個Action的處理過程。
           可以使用Intercepter來過濾每一個Action,在Action執行前后追加自定義的操作。

        集成了Debugging,可以使用內容之的debugging工具找到問題。
          
         靈活的標簽庫,可以通過修改FreeMarker模板來定制標簽的輸出,不需要在操作像天書異樣的JSP Taglib API,模板語言支持,Freemarker和Velocity     
           可以自定義模板庫,或者修改已有模板的內容來定制頁面的顯示。

    Struts 2 中使用的模式
    Command
    Chain of responsibility

    Struts2 處理流程概要




    上圖來源于Struts2官方站點,是Struts 2 的整體結構。
    一個請求在Struts2框架中的處理大概分為以下幾個步驟
    1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
    2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
    3 接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action
    4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
    5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類
    6 ActionProxy創建一個ActionInvocation的實例。
    7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
    8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper
     
    在上述過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創建的。

    posted @ 2008-10-08 13:56 Sky Yi 閱讀(635) | 評論 (0)編輯 收藏

    MyEclipse 快捷鍵

    MyEclipse 快捷鍵
    (1)Ctrl+M切換窗口的大小
    (2)Ctrl+Q跳到最后一次的編輯處
    (3)F2當鼠標放在一個標記處出現Tooltip時候按F2則把鼠標移開時Tooltip還會顯示即Show Tooltip Description。
              F3跳到聲明或定義的地方。
              F5單步調試進入函數內部。
              F6單步調試不進入函數內部,如果裝了金山詞霸2006則要把“取詞開關”的快捷鍵改成其他的。
              F7由函數內部返回到調用處。
              F8一直執行到下一個斷點。
    (4)Ctrl+Pg~對于XML文件是切換代碼和圖示窗口
    (5)Ctrl+Alt+I看Java文件中變量的相關信息
    (6)Ctrl+PgUp對于代碼窗口是打開“Show List”下拉框,在此下拉框里顯示有最近曾打開的文件
    (7)Ctrl+/ 在代碼窗口中是這種//~注釋。
              Ctrl+Shift+/ 在代碼窗口中是這種/*~*/注釋,在JSP文件窗口中是<!--~-->。
    (8)Alt+Shift+O(或點擊工具欄中的Toggle Mark Occurrences按鈕) 當點擊某個標記時可使本頁面中其他地方的此標記黃色凸顯,并且窗口的右邊框會出現白色的方塊,點擊此方塊會跳到此標記處。
    (9)右擊窗口的左邊框即加斷點的地方選Show Line Numbers可以加行號。
    (10)Ctrl+I格式化激活的元素Format Active Elements。
                Ctrl+Shift+F格式化文件Format Document。
    (11)Ctrl+S保存當前文件。
                Ctrl+Shift+S保存所有未保存的文件。
    (12)Ctrl+Shift+M(先把光標放在需導入包的類名上) 作用是加Import語句。
                Ctrl+Shift+O作用是缺少的Import語句被加入,多余的Import語句被刪除。
    (13)Ctrl+Space提示鍵入內容即Content Assist,此時要將輸入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷鍵(用于切換英文和其他文字)改成其他的。
                Ctrl+Shift+Space提示信息即Context Information。
    (14)雙擊窗口的左邊框可以加斷點。
    (15)Ctrl+D刪除當前行。


    ---待續


    [以下為轉載]
    Eclipse快捷鍵大全
    Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了)
    Ctrl+D: 刪除當前行
    Ctrl+Alt+↓ 復制當前行到下一行(復制增加)
    Ctrl+Alt+↑ 復制當前行到上一行(復制增加)

    Alt+↓ 當前行和下面一行交互位置(特別實用,可以省去先剪切,再粘貼了)
    Alt+↑ 當前行和上面一行交互位置(同上)
    Alt+← 前一個編輯的頁面
    Alt+→ 下一個編輯的頁面(當然是針對上面那條來說了)

    Alt+Enter 顯示當前選擇資源(工程,or 文件 or文件)的屬性

    Shift+Enter 在當前行的下一行插入空行(這時鼠標可以在當前行的任一位置,不一定是最后)
    Shift+Ctrl+Enter 在當前行插入空行(原理同上條)

    Ctrl+Q 定位到最后編輯的地方
    Ctrl+L 定位在某行 (對于程序超過100的人就有福音了)
    Ctrl+M 最大化當前的Edit或View (再按則反之)
    Ctrl+/ 注釋當前行,再按則取消注釋
    Ctrl+O 快速顯示 OutLine
    Ctrl+T 快速顯示當前類的繼承結構
    Ctrl+W 關閉當前Editer
    Ctrl+K 參照選中的Word快速定位到下一個
    Ctrl+E 快速顯示當前Editer的下拉列表(如果當前頁面沒有顯示的用黑體表示)

    Ctrl+/(小鍵盤) 折疊當前類中的所有代碼

    Ctrl+×(小鍵盤) 展開當前類中的所有代碼

    Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來代替)

    Ctrl+Shift+E 顯示管理當前打開的所有的View的管理器(可以選擇關閉,激活等操作)

    Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個字母編輯器都提供快速匹配定位到某個單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個單詞時,特別實用,這個功能Idea兩年前就有了)

    Ctrl+Shift+J 反向增量查找(和上條相同,只不過是從后往前查)

    Ctrl+Shift+F4 關閉所有打開的Editer

    Ctrl+Shift+X 把當前選中的文本全部變味小寫

    Ctrl+Shift+Y 把當前選中的文本全部變為小寫

    Ctrl+Shift+F 格式化當前代碼

    Ctrl+Shift+P 定位到對于的匹配符(譬如{}) (從前面定位后面時,光標要在匹配符里面,后面到前面,則反之)

    下面的快捷鍵是重構里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構的快捷鍵都是Alt+Shift開頭的了)

    Alt+Shift+R 重命名 (是我自己最愛用的一個了,尤其是變量和類的Rename,比手工方法能節省很多勞動力)

    Alt+Shift+M 抽取方法 (這是重構里面最常用的方法之一了,尤其是對一大堆泥團代碼有用)

    Alt+Shift+C 修改函數結構(比較實用,有N個函數調用了這個方法,修改一次搞定)

    Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數字和字符串抽取成一個變量,尤其是多處調用的時候)

    Alt+Shift+F 把Class中的local變量變為field變量 (比較實用的功能)

    Alt+Shift+I 合并變量(可能這樣說有點不妥Inline)
    Alt+Shift+V 移動函數和變量(不怎么常用)
    Alt+Shift+Z 重構的后悔藥(Undo)

    posted @ 2008-09-26 20:41 Sky Yi 閱讀(450) | 評論 (0)編輯 收藏

    Sql Server 中一個非常強大的日期格式化函數



    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
    Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
    Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
    Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
    Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
    Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
    Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
    Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
    Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
    Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
    Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
    Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
    Select CONVERT(varchar(100), GETDATE(), 12): 060516
    Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
    Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
    Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
    Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
    Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
    Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
    Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
    Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
    Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
    Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
    Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
    Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
    Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
    Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
    Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
    Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
    Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
    Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
    Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
    Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
    Select CONVERT(varchar(100), GETDATE(), 112): 20060516
    Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
    Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
    Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
    Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
    Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
    Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
    Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM


    常用:
    Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
    Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
    Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
    Select CONVERT(varchar(100), GETDATE(), 12): 060516
    Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16  

    posted @ 2008-09-25 15:40 Sky Yi 閱讀(358) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲欧洲日本国产| 亚洲处破女AV日韩精品| 亚洲国产精品免费观看| 日本一卡精品视频免费| 亚洲AV美女一区二区三区| 花蝴蝶免费视频在线观看高清版| 久久久久亚洲精品天堂久久久久久 | 牛牛在线精品免费视频观看| 四虎AV永久在线精品免费观看| 精品无码专区亚洲| 亚洲国产精品无码久久九九| 成人在线免费视频| 亚洲午夜福利在线观看| 免费萌白酱国产一区二区三区| 亚洲国产精彩中文乱码AV| 免费A级毛片无码A∨免费| 亚洲精品二三区伊人久久| 国产精品免费综合一区视频| 免费无码又爽又黄又刺激网站| 国产国拍精品亚洲AV片| 嫩草在线视频www免费观看| 亚洲日韩中文字幕| 日韩在线a视频免费播放| 看成年女人免费午夜视频| 国产亚洲成av片在线观看| 猫咪免费人成网站在线观看| 亚洲国产无线乱码在线观看| 亚洲麻豆精品国偷自产在线91| 免费观看在线禁片| 一本色道久久88亚洲精品综合| 亚洲AV之男人的天堂| 伊人久久免费视频| 亚洲国产精品嫩草影院| 久久激情亚洲精品无码?V| 99国产精品永久免费视频| 欧洲美女大片免费播放器视频| 亚洲av鲁丝一区二区三区| 日韩特黄特色大片免费视频| 99re8这里有精品热视频免费| 激情亚洲一区国产精品| 亚洲中文字幕视频国产|