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

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

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

    隨筆-54  評論-0  文章-2  trackbacks-0
     

       今天是jBPM的第二天,內容不多,定義不少,主要講了流程變量,節點和事件等知識,全是新的知識,剛學肯定生疏,久了就沒問題了,編程嘛,多敲代碼,多 調試,才是王道。
     
    1. 流程變量

    通過org.jbpm.context.exe.ContextInstance來操 作變量。

    2.變量的生命周期

    變量的訪問和賦值是在某一個token上進行的,缺省時,是基于root Token。每個Token(執行路線)有它自己的一套流程變量。變量的作用域和所屬的Token的生命周期一致,不同的Token上的同名變量互不影 響。
     
    3.變量值要求

    變量名的類型為java.lang.String,支持的變量值類型如下(文檔10.1節)。(

    如 果變量值是classes that are persistable with hibernate,則POJO的id應為long型或String型。
     
    saveOrUpdate( po );
    savePoIdAndPoClassAsVariable()
    session.get( class, id )
    節點

    1. 流程圖中的各種節點的作用及用法

    為什么需要多種節點類型?

    需要有不同類型(作用)的節點,才能設計出復雜的流程圖。 Jbpm有一套預先定義好的節點類型。如果不夠用,也可以使用自定義節點進行擴展,以完成不同的流程的需要。

    不同的節點類型代表不同的行 為。

    每個流程都必須要有開始節點和結束節點。

    2.預定義節點

    start-state,開始節點:標識流 程開始、
    end-state,結束節點:標識流程結束、
    task-node,任務節點:可以放0個或多個任務、
    decision, 決策節點:路徑選擇,只使用一個流轉(叉路口)、
    fork/join,分支節點/合并節點:可以分為多個并行執行的分支、
    state,狀 態節點:等待。


    每個節點都對應一個類(Jbpm的持久化類),都是org.jbpm.graph.def.Node的子類。節點 都有名字、流轉(end-state除外)。

    event事件

    事 件。

    1, 有幾種事件,分別在什么時候觸發
    2, 怎么指定當事件觸發時做什么事(Action)
     1, 節點的事件

    a)      進入節點(node-enter)。(開始節點沒有)

    b)      離開節點(node-leave)。(結束節點沒有)

    2, 流轉的事件

    a)      只有一個:使用流轉(take a transition)

    3, 任務的事件

    a)      創建任務(task-create)

    b)      分配任務(task-assign)

    c)      開始任務(task-start)à TaskInstance.start()

    d)      結束任務(task-end)à TaskInstance.end()
     每個事件有一個動作(action)清單。當jBPM引擎產生一個事件,動作(action)清單就會被 執行. 不同的節點支持的事件類型不同,是由event元素所在的節點的類型決定的,例如transition只有一個事件。
    可以在event元 素用可以指定一個動作,當指定的事件發生時,這個動作被執行。

    可以給同一個事件指定多個動作,當這個事件觸發的時候,這些動作執行的順序 和定義先后順序是一致的。

    不同元素支持不同的事件類型:

    一般的節點都具有的事件:node-enter,進入節點、 node-leave,離開節點;
    start-state只有node-leave;
    end-state只有node-enter;
    transition 只有一個執行轉換的事件(taking a transition)。因為只有一個事件,所以配置時不用寫event元素,而直接配置Action。
    task 有task-create,任務創建、task-assign,任務分配、task-start,任務開始、task-end,任務結束。

    關 于哪些元素支持哪些事件,可以通過文檔的18.4節中的xml文件的寫法中獲得。

    如果配置的事件類型不存在,不會報錯,也不會執行。

    注 意:在事件中定義的動作(Action)不應該(不能)影響流程的執行。即不要在事件的動作中給token發信號,否則會拋異常:token is locked。(在Node中配置的Action可以給Token發信號。)

    事件執行的順序:

    已觸發事件:node-leave

    已觸發事件:transition

    已 觸發事件:node-enter

    已觸發事件:task-create

    已觸發事件:task-assign

    已 觸發事件:task-start

    已觸發事件:task-end
     

    ************************* 動態的創建不確定數量的任務實例 *********

    會簽。

    實現任務分配給多個人,在流程定義中定義的相 應的任務,不指定參與者,也不知道指定為誰。需要做以下工作:
    1,  阻止jBPM自動創建任務實例(設置task-node的create-tasks="false")
    2,  在node-enter事件中定義一個動作指定用于創建TaskInstance的類。

    類 CreateTaskInstancesAction要接管兩個操作:創建與分配任務實例。
     創建任務實例要調用方法:

      TaskMgmtInstance.createTaskInstance(Task, ExecutionContext);

    其中的 Task 是任務的定義,可以先得到當前的節點:

      TaskNode taskNode = (TaskNode) executionContext.getNode();

    然后通過任務的名字得到任務的定義:

      Task task = taskNode.getTask("審批");

     

    任務分配

    個人任務:actor-id=”xxx”
                       

    查詢組任務列表的方法為:

    TaskMgmtSession.findPooledTaskInstances(String actorId)
                          

    對于一個組任務,如果他的actorId為null,組中所 有的用戶都可以在組任務列表中看到這個任務。如果使用TaskInstance.setActorId(String)方法設置這個任務由指定的 acrorId來辦理,這時pooledActors中的其他人就看不到這個任務了,就是說actorId會屏蔽pooledActors; 當這個用戶因某些原因不能辦理任務時,可以把這個任務再退回到組任務列表中,方法是調用TaskInstance.setActorId(null)設置 actorId為null,這時pooledActors中的所有人又都可以看到這個任務了。

    不管使用哪種方式分配任務,參與者 (Actor-id,字符串類型)的計算(確定)都是由業務層負責解釋的。

        最后湯兄給我們推薦了一些好書,學習java必須準備三樣: 心態,基礎,睡覺。能學多少學多少。明天才是OA工作流項目的開始!加油。。。
    posted @ 2010-02-01 21:59 d66380022| 編輯 收藏
    JBPMOA項目

       哈 哈,今天終于要開始做項目了,心情特別好,在第一天中湯兄讓我們先明白了什么是工作流,怎樣很好的解決這一類問題等,接著來了個Helloworld,就入門了。每天都在學習,每天都有收獲,感覺真好。還要再提一下,OA(辦公自動化)主要技術之一就是工作流,好,還是仔細總結一下一天所學:

     

    1. 工作流就是工 作流程的計算機化

      流程(OA),數量多,隨時更改

      網購:提交訂單>配貨>發貨>收貨>付款

    當我們想增加、修改流程時,而不想編程則需要用到工作流引擎,由它負責判斷下一步 做什么。下圖是它的原理:

      狀態機 +if else

     

    2. 工作流要解決的主要問題是:為實現某個業務目 標,在多個參與者之間,利用計算機,按某種預定規則自 動傳遞文檔、信息或者任務。

    通俗的說,就是多個人在一起合作完成某件事情。

     

    接下來是jBPM介紹

    3.jBPM介紹

     jBPM全稱是Java Business Process Management。是一種基于J2EE的輕量級工作流管理系統,jBPM是公開源 代碼項目

    官方主頁http://labs.jboss.com/

    下載地址:http://labs.jboss.com/jbossjbpm

     

    最重要的還是接下來的jBPM的使用

     4.Jbpm的使用

    server:提供的一個執行、測試工作流和平臺(Web應用程序)。

     

    流程圖是一個有向圖,由兩部分組成:節點和流轉。節點有各種各樣形狀(代表各種各 樣的作用)。流轉就是指單箭頭,代表從一個節點到下一個節點。

     

    此文件的約束就是 jPDL

    jPDL中,不同 的節點,就用不同的標簽。

     

    1.xml文件名必須為:processdefinition.xml

    2.必須要在一個zip文件的根目 錄中。

    3.可以有一個名為processimage.jpg的文件,是流程圖。

     

    應用myEclipse設 計流程圖步驟:

     

    1.jbpm-jpdl-3.2.2插件:

    找到jbpm-jpdl-3.2.2下的designer路 徑復制一下,注意路徑中不能有中文

    2.之后在桌面上myEclipse快 捷方式,點右鍵,查找目標,找到myEclipse安裝目錄,再其下的links目錄下 加入a.link文件 (a可以隨意寫),內容為 path=粘貼  注意里路徑變為雙斜線,之后關閉myEclipse,再打開就OK了。

    3.myEclipse下新建介紹java工程,在src下,新建Process Definition點下一步,為Process name :起個名,比如HelloWorld 。。。。

     

    4啟動服務器:server/start.bat

    5訪問http://localhost:8080/jbpm-console登陸后Deploy下圖

     6.zip文件部署

           7.點Deploy

    8.start

    9.tokens 后點singal,后在其下點singal

    10.tasks,點start ,按部就班搞定

     

    注意事項:

     

    1.怎么從開始節點往下走?Tokens à Signal(只點一次)

    2.怎么沒有properties窗口?Window à Show View à Properties

    3.怎么一點Signal,就結束了呢?沒有在Task-Node中 定義任務吧。要說明任務名稱與任務的執行者。

    4.點擊Process Image,在圖片上沒有一個正在運 行的標志,而且在上方還有一個錯誤提示?把節點的名稱改為英文,重新Deploy就可 以了。

    Jboss Server所在的路徑中不能有 中文或特殊 字符(如&,有的在文件夾jbpm&oa中,這樣就不行),否則不能運行

     

    Token的解釋:流程實例通過Token的維護 當前正在執行的節點

    入門程序:

    HelloWorld

    1, 設計流程定義à 打包為zip文件(流程 定義文檔,說明par的格式要 求)

    2, 部署流程定義à 把工作流交給工 作流管理系統保存起來。只需要執行一次,一般是管理員進行操作。

    3, 執行流程à 多個操作:

    a)      啟動(創建)流程實例(Signal

    b)      獲取任務列表(只是自已的任務實 例列表)

    c)      辦理任務

                        i.        開始任務

                        ii.        結束任務

    今天就這么多了,明天再寫!

    posted @ 2010-01-31 23:36 d66380022| 編輯 收藏
         今天繼續講的是lucene的分詞器,湯兄先回顧了昨天的所學內容,很好。今天講了lucene的細節,比如分詞器和高亮器,以及高級搜索等功能的實現框架Compass,案例是傳智的貼吧搜索功能的實現,用的當然也是lucene

     

                                          全文檢索(Lucene)的深入

    分詞器:對文本資源進行切分,將文本按規則切 分為一個個可以進行索引的最小單位(關鍵詞)。

    某文檔中的一段文本,經過分詞后如下:

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    Internet

    采集

    信息

    軟件

    叫做

    爬蟲

    蜘蛛

     

    建立索引和進行搜索時都要用到分詞器。為了保證能正確的搜索到結果,在建立索引 與進行搜索時使用的分詞器應是同一個。

     

    全文檢索不區分大小寫

    對于中文分詞,通常有三種方式:單字分詞、二分法分詞、詞典分詞。

    最好的分詞器:詞庫分詞

      高亮器:

    1.作用:

      1.截取摘要(大小)

      2.高亮關鍵字(前綴 后綴)

    2.怎么用:

       過濾器 Filter

    RangeFilter,可以對搜索出來的結果進行過 濾。

     排序 sort

    Lucene的搜索結果默認按相關度排序的。所謂相關度,就是文檔的得分。Lucene有一個評分機制,就是對檢索結果按某種標準進行評估,然后按分值的高低來對結果進行排序。


    查詢對象

    TermQuery

     Term是查詢的最小單位,第一個參數是屬性,第 二個是要查詢的內容,下面的代碼的

    整個意思就是在title中查詢檢索

      Term term = new Term(“title”,”檢索”);

      Query query = new TermQuery(term);

     

    關鍵詞查詢RangeQuery

    范圍查詢WildcardQueryPhraseQuery

    短語查詢

    BooleanQuery

    public void add(Query query, Occur occur)

     

    Occur 用于表示布爾查詢子句關系的類,包括:

    Occur.MUSTOccur.MUST_NOTOccur.SHOULD

     

    1,  MUSTMUST:取得連個查詢子句的交集。

    2,  MUSTMUST_NOT:包含MUST并且查詢結果中不包含MUST_NOT的檢索結果。

    3,  SHOULDSHOULD,表示“或”關系,最終檢索結果為所有檢索子句的并集。


                                    Compass框架

    Lucene  + Hibernate

    Hibernate操作實現原理:

    主配置文件 hibernate.cfg.xml

                1.連接信息

                         2.聲明映射文件

                3.其他配置

    映射文件:.hbm.xml

              對象

                    屬性

    同樣,Compass實現原理如圖:

    posted @ 2010-01-31 23:35 d66380022| 編輯 收藏
     
               Lucene

    今天由湯陽光老師(不如說是湯兄)給我們講lucene,一見湯兄,太年輕了,真是這感覺真讓我有些小慚愧,呵呵。。。還是學好技術是第一要務。

    從 現在到年前都是湯兄給我們上課,今天和明天是搜索引擎,存儲數據用的是Hibernate,全文檢索的簡化框架是Compass,Lucene講1.5 天,Compass講半天。總結一天所學的.全文檢索是目前最流行的技術,由于用數據庫搜索實現的匹配度,相關度排序和搜索速度太慢,而這些都非常致命。 下面詳細回顧:

    1.信息檢索:找出與用戶需求相關的信息

    平時接觸的信息有文:html,doc,pdf和 txt,

    多媒體:音頻,視頻,圖片...

    全文檢索:  1.只關注文本。比如我搜索:中國的首都在哪里?和我搜索中國 首都 北京是一樣的,我們主要是研究出現了某些詞的文本 2.不處理語義,只是詞匹配

    全文檢索的作用:1.bbs,blog,news,商城的站內搜索,資源有限

    Eclipse的幫助就是用Lucene做的

    2.入門

    運行原理/入門概念

    Hello World

    需求:就像百度的搜索框一樣,輸入內容,點擊搜索,得出結果,并且要求時間非常短
    后臺:點搜索后,會去信息集合(索引庫)里搜索,注:這個索引庫是按照一定的結構存儲,這個結構可以實現快速搜索
    使用流程:1事先就不停再找,建立索引,2.搜索
    索引庫的結構:索引庫是存到一些二進制文件,這些文件在同一個目錄下  --à索引庫目錄
    Document  一條數據
    Field  數據中的一個字段

    Field是組成Document的元素

    實現:
    步驟:1.建立索引

          2.搜索

          都用到的是分詞器(analyzer),應使用同一種分詞器

    實現HelloWorld:添加jar包

    lucene-core-2.4.0.jar(核心);
    contrib/analyzers/lucene-analyzers-2.4.0.jar(分詞器);
    contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);
      1.建立Article.java,屬性有id,title,content
     2.HelloWorld.java.兩個主要方法:
        1.建立索引:
         createIndex()    
        2.搜索
        search()
    進行搜索
    public void search() throws Exception {
        String queryString = "document";
        // 1,把要搜索的文本解析為 Query
        String[] fields = { "name", "content" };
       QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
        Query query = queryParser.parse(queryString);
     
        // 2,進行查詢
        IndexSearcher indexSearcher = new IndexSearcher(indexPath);
        Filter filter = null;
        TopDocs topDocs = indexSearcher.search(query, filter, 10000);
        System.out.println("總共有【"+topDocs.totalHits+"】條匹配結果");
           // 3,打印結果
        for(ScoreDoc scoreDoc : topDocs.scoreDocs){
           int docSn = scoreDoc.doc; // 文檔內部編號
           Document doc = indexSearcher.doc(docSn); // 根據編號取出相應的文檔
           File2DocumentUtils.printDocumentInfo(doc; // 打印出文檔信息
        }
    }

    IndexWriter:操作索引庫,增刪改
    主要方法介紹:

           // 構造方法:如果索引庫不存在,會自動創建。如果存在,就使用他
           new IndexWriter(String/Directory indexPath, Analyzer a, MaxFieldLength mfl)
           // 構造方法:第三個參數指定是否創建一個新的索引庫。
           // 1,有索引庫,create為true:會重新創建。2,沒有索引庫,create為false,會報錯。
           new IndexWriter(String/Directory indexPath, Analyzer a, boolean create, MaxFieldLe
    ngth mfl)
           // 添加索引
           addDocument( Document doc )
           // 更新
           updateDocument(Term term, Document doc)
           // 刪除
           deleteDocument(Term term)
           // 合并索引庫
           addIndexesNoOptimize(Directory[])

    今天學了Lucene的入門,明天學習Lucene的高級知識,以及compass框架!
           // 優化索引庫
           optimize()
    IndexSearcher:操作索引庫,查詢
           // 構造方法,索引庫不存在,就報錯
           new IndexSearcher( String indexPath )
           // 搜索
           TopDocs search( Query query, Filter filer, int n )
           // 搜索
           TopDocs search( Query query, Filter filer, int n , Sort sort)
          
    Document doc( int docSn )
    Documet:Lucene所操作的對象
    Field:組成Document的元素,代表一個屬性。Store、Index
      new Field( String name, String value, Store store, Index index )

    Directory:索引庫(目錄)
           FSDirectory    :真實的目錄
           RAMDirectory:在內存中的一個虛擬的目錄
     
    QueryParser:把查詢字符串變為查詢對象的工具。使用子類: MultiFieldQueryParser
          new MultiFieldQueryParser(String[] fields, Analyzer a)
    Term:代表某個屬性中的一個關鍵詞(目錄中出現的條目),是搜索的最小單位
    Query :查詢對象(封裝的過濾條件)。有很多子類,對應各種各樣的查詢方式。
    TopDocs(一套) :代表查詢結果
    今天知識比較少,可回顧以前的知識,呵呵。。。
    posted @ 2010-01-31 23:33 d66380022| 編輯 收藏

    徐老師已經把常見的異常在課堂上進行了演示,說實話,這兩天都有點郁悶啊,Hibernate咋挺難懂的,老師講的比較深,一天下來,晚上再看一遍老師的視頻,才基本上可以搞清楚課堂上不理解 的知識點。今天講的雙向關聯和檢索策略。

    1.雙向關聯

    1.一對多關聯關系

    屬性方式

    2.在昨天的custrom.java中,主要代碼:

           private Set<Order> orders = new HashSet<Order>();

          

           public Set<Order> getOrders() {

                  return orders;

           }

           public void setOrders(Set<Order> orders) {

                  this.orders = orders;

           }

    3.Custromer.hbm.xml

    <class>中加上:

    <set name="orders" lazy="false" inverse="true">

                         <key column="cid" />

                         <one-to-many class="cn.itcast.hibernate.persistence.Order" />

                  </set>

     

    4.測試: 主要代碼:

    Customer c = new Customer();

                  c.setAge(12);

                 

                  Order o = new Order();

                  o.setOrderNumber("No003");

                  o.setPrice(500f);

                  //設置關聯關系

                  o.setCustomer(c);

                 

                  //s.save(c);

                  s.save(o);

     

    5.通過Hibernate 查詢客戶所有訂單

     

    s.get(Order.class,new Long(1));

    debug模式查看所有訂單信息

     

    注意:雙向關聯是兩端同時進 行

    2.操縱持久化對象:

    對緩存的理解:首先明白一點:

    顯式回收:

    當沒有任何一個對象引用或者指針指向他時,就回收

     

    1.當用session 增刪改查對象時,用seesion.flush()方法可以實現將數據插入數據庫,但不提交事務,。

      之后調用session.clear(),清空本地緩存

     

    2.commit()方法默認包含兩步操作:先清理緩 存,后提交

     

    緩存里放的全是引用

     

    s.flush();//清理緩存  以緩存為準,讓數據庫 和緩存保持同步,讓緩存進行一系列增刪該查, 改變將進入數據庫,但不提交 ,仍然可以回滾等操作

    s.refresh();  //刷新緩存  讓緩存和數據庫保持同步, 以數據庫為準,觸發一個查詢操作,把數據找回來

    s.clear();//顯式清空    緩存是集合 ,里面放了很多引用,把緩存清掉,為的是釋放內存,如果緩存內有指向它的引用,則清掉,但如果緩存外還有其他引用到達他,則不釋放內存

     

    例如:

    Customer c = new Customer(“TOM”,new HashSet());

    session.save(c);

    Long id = c.getId();

    c = null;

    Customer c2 = (Customer)session.load(Customer.class,id);

    tx.commit();

    session.close();

    c2.getName(); //這時仍然可以得到name

    C2 = null;//之后如果再調用上面的語句,則不能得到name

    ---------------------------------------------------------------------------------------------

    緩存的作用:

    1。減少訪問數據庫的頻率。

    2。保證緩存中的對象與數據庫中的相關記錄保持同步。

    3。當緩存中的持久化對象之間存在循環關聯關系時,Session會保證不出現訪問對象圖的死循

         還,以及由死循環引起的JVM堆棧溢出異常。

    提示:

    session加載了customer對象后,會為customer對象的值類型的屬性復制一份快照。當清理

    緩存時,通過比較對象的當前屬性和快照,來判斷對象的那些屬性發生了變化。

     

    3.hibernatejava對象的狀態

    臨時狀態(transient):剛剛用new語句創建,沒有被持久化,不處于session中。該對象

    成為臨時對象

    持久化狀態(persistent):已經被持久化,加入到session的緩存中。該狀態的對象為持久

       化對象。

    游離狀態(detached):已經被持久化,但不處于session中。該狀態的對象為游離對象。

    注意:sessiondelete方法對于游離對象,該方法從數

          據庫中刪除記錄,對于持久化對象,該方法從數據

          庫中刪除記錄,還要刪除緩存中的對象。

       close方法使緩存被清空,緩存中的所有的

          對象都變為游離對象。

    游離對象處于內存中

    posted @ 2010-01-31 23:32 d66380022| 編輯 收藏
    今天講的是一對一等知識,這兩天精力不太好,課堂效率不高,好在下課后還看視頻。整理筆記:

    一對一:用的較少
     
    舉例:人員和身份證
    設計表
    user 存在用戶表,photo存在photo表

    一對一關聯:外鍵關聯
     
    另一種方法:主鍵關聯
     
     
    注意:constrained = true
    多對多:

    老師對學生 學生有多個老師
     
    只有刪除和插入的概念,沒有更新的概念

                       
     
     檢索方式:
    檢索方式簡介
    HQL檢索方式
    1。7。調用用戶自定義的函數
    8。嵌入式查詢
    9。動態綁定參數在查詢語句中設定各種查詢條件
    2。支持投影,僅檢索出對象的部分屬性
    3。支持分頁
    4。連接查詢
    5。分組查詢
    6。內置聚集函數
    Query query = session.createQuery(“from Customer as c where c.name=:custoerNa
    me and c.age = :customerAge”);
    query.setString(“customerName”,”Tom”);
    query.setInteger(“customerAge,21);
    query.list();

    2. QBC檢索方式
     
    3.多態查詢    (查詢所有該類以及該類的子類所對應的表,如果查詢接口,則查詢的是實現的是查詢所有實現該接口的類所對應的表

    session.createQuery(“from Employee”);
    查詢出所有的實體
    from java.lang.serializable(支持接口)
    from java.lang.Object

    檢索方式簡介
    對查詢結果排序
    hql 查詢:
    session.createQuery(“from Employee c order by c.name”);
    qbc查詢:
    session.createCriteria(Customer.class).addOrder(Order.asc(“id”));

    分頁查詢
    hql 查詢:
    session.createQuery(“from Employee c order by c.name”).setFirstResult(10)
                                       .setMaxResults(10);
    qbc查詢:
    session.createCriteria(Customer.class)
                  .addOrder(Order.asc(“name”))
                  .setFirstResult(97).setMaxResult(10).list();


    檢索單個對象
    hql 查詢:
    session.createQuery(“from Employee c order by c.name”)
                         .setMaxResults(1).uniqueResult();
    qbc查詢:
    session.createCriteria(Customer.class)
                  .addOrder(Order.asc(“name”))
        .setMaxResult(1).uniqueResult();
     
    檢索方式簡介
    對查詢結果排序
    hql 查詢:
    session.createQuery(“from Employee c order by c.name”);
    qbc查詢:
    session.createCriteria(Customer.class).addOrder(Order.asc(“id”));

    分頁查詢
    hql 查詢:
    session.createQuery(“from Employee c order by c.name”).setFirstResult(10)
                                       .setMaxResults(10);
    qbc查詢:
    session.createCriteria(Customer.class)
                  .addOrder(Order.asc(“name”))
                  .setFirstResult(97).setMaxResult(10).list();


    檢索單個對象
    hql 查詢:
    session.createQuery(“from Employee c order by c.name”)
                         .setMaxResults(1).uniqueResult();
    qbc查詢:
    session.createCriteria(Customer.class)
                  .addOrder(Order.asc(“name”))
        .setMaxResult(1).uniqueResult();

    綁定參數

    hql 查詢:
    session.createQuery(“from Employee c where c.name =
                                  :customerName”);
    query.setString(“customer”,”Tom”);

       報表查詢
     
    小結
    比較方面              HQL檢索                   QBC檢索
    可讀性           優點:和sql相近,易讀         將語句肢解成一組criteria,較差
    功能             支持各種查詢                  不支持報表查詢和子查詢。有限的連接查詢
    查詢語句形式     基于字符串形式的sql           更加面向對象
    何時被解析       運行時被解析                  編譯時被解析,更易排錯
    可擴展性         不具擴展性                    用戶可擴展criteria接口
    對動態查詢語句的支持 支持動態查詢,編程麻煩    適合動態生成查詢語句

    直接弄個connection ,斷點一下,看是否用的c3p0

    在學習中一定要不斷調試代碼!努力消化一天所學!
    posted @ 2010-01-31 23:32 d66380022| 編輯 收藏
        AJAX實例

      今天是AJAXweb開 發中的典型應用,也是AJAX的最后一天課,老佟不愧是AJAX的行家,以至于每個班的AJAX都是他帶的,老佟講課風趣極了,課 堂總是不是傳來同學們笑聲。。。經過三天的js和昨天的AJAX的學習,今天終于可以體現一下無刷新的感覺。

    日期驗證

    1. 日期驗證的需求:

        1). birth 輸入框中的文字是 "請輸入您的生日" , 鼠標獲取焦點時, 文本框中的字符變為空格

        2). 當失去焦點時, 若文本框中的字符為空格, 使其值重新設為 "請輸入您的生日"

        3). 當失去焦點, 且文本框中的字符不是空格, 且其值發生變化時, 發送 Ajax 請求到服務器端驗證輸入的日期格式是否合法.

           . 若不合法, 給出 "您輸入的日期不合法"

           . 若合法, 給出 "您輸入的日期合法"

          

    2. Ajax 請求時提示信息  

    3.有等待的特效

     

    工程整體結構如圖:注:使用的是jQuery

     

    1.       新建input-date.jsp頁面,關鍵代 碼:

    2.        

    <script type="text/javascript"

    src="${pageContext.request.contextPath}/scripts/jquery-1.3.1.js"></script>

    <script type="text/javascript">

           $(function(){

                  $("#birth").focus(function(){

                         var value = $.trim(this.value);

                         if(value == this.defaultValue){

                                this.value = "";

                         }

                  }).blur(function(){

                         var value = $.trim(this.value);

                         if(value == ""){

                                this.value = this.defaultValue;

                         }

                  }).change(function(){

                         var value = $.trim(this.value);

                         //再加一個需求:當文本框中的值發生變化, 且其 值不是默認值, 長度在 8 --10 之間, 此時會發送 Ajax 請求

                         if(value != this.defaultValue && value.length >= 8 && value.length <= 10){

                                var url = "${pageContext.request.contextPath }/dateValidateServlet";

                                var args = {time: new Date(), birth: value};

                               

                                $.post(url, args, function(data){

                                       $("#datemsg").html(data);

                                });

                         }else{

                                alert("日期不合法!");

                                this.value = this.defaultValue;

                         }

                  });

           });

    </script>

    </head>

    <body>

           <h3>Ajax Validation Example</h3>

           Birth date(yyyy-MM-dd): <input id="birth" type="text" name="birth" value="請輸 入您的生日" />

           <br>

           <div id="datemsg"></div>

    </body>

    2.新建DateValidateServlet,關鍵代碼:

        //1. 獲取 birth

                  String birth = request.getParameter("birth");

                 

                  //2. 驗證

                  Pattern p = Pattern.compile("^((""d{2}(([02468][048])|([13579][26]))[""-""-""s]?((((0?" +

                                "[13578])|(1[02]))[""-""-""s]?((0?[1-9])|([1-2][0-9])|(3[01])))" +

                                "|(((0?[469])|(11))[""-""-""s]?((0?[1-9])|([1-2][0-9])|(30)))|" +

                                "(0?2[""-""-""s]?((0?[1-9])|([1-2][0-9])))))|(""d{2}(([02468][12" +

                                "35679])|([13579][01345789]))[""-""-""s]?((((0?[13578])|(1[02]))" +

                                "[""-""-""s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))" +

                                "[""-""-""s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[""-""-""s]?((0?[" +

                                "1-9])|(1[0-9])|(2[0-8]))))))");

                 

                  boolean flag = p.matcher(birth).matches();

                 

                  //3. 根據驗證結果返回字符串

                  response.setCharacterEncoding("UTF-8");

                  PrintWriter out = response.getWriter();

                  if(flag){

                         out.println("<font color='green'>日期格式合法</font>");

                  }else{

                         out.println("<font color='red'>日期格式不合法</font>");

                  }

           }

    3.加上特效:

      1.新建文件夾commons,再建ajax.jsp,寫代碼:

    如下

       <script type="text/javascript" src="${pageContext.request.contextPath }/scripts/jquery.blockUI.js"></script>

    <script type="text/javascript">

       $().ajaxStart(function(){

              $.blockUI({

                message: $('img#loading'),

                css: {

                    top:  ($(window).height() - 150) /2 + 'px',

                    left: ($(window).width() - 400) /2 + 'px',

                    border: 'none',

                    padding: '5px',

                    color: '#fff'

                },

                  overlayCSS: { backgroundColor: '#fff' }

            });

       }).ajaxStop($.unblockUI);

    </script>

    <img id="loading" alt=""

       src="${pageContext.request.contextPath }/images/loading.gif" style="display:none" />    

    注:代碼可參看jquery.blockUI的文檔

    2.input_date.jsp <head>標簽體中加上如下代碼:

    <%@ include file="/commons/ajax.jsp" %>

    3.接著導入jquery.blockUI.js文件

    4.最后,便可在tomcat下訪問:http://localhost:8080/ajax-1/input-date.jsp ,輸入合法日期,結果如圖

     

    明天是Hibernate的課程。老徐講的,老徐講 課之深入已早有所耳聞,且待明天之開始!

    posted @ 2010-01-31 23:30 d66380022| 編輯 收藏
                                             AJAX
    今天佟剛老師帶我們學習了AJAX,AJAX是現在開發的廣泛使用的技術,幾乎所有的web應用都涉及了該技術,例如,用戶名校驗,級聯下拉列表,下拉樹狀菜單,在網頁無刷新提交等方面有廣泛的應用。有前兩天的js基礎,今天的學習還行 
    1.什么是Ajax
    Ajax被認為是(Asynchronous JavaScript and XML的縮寫)。現在,允許瀏覽器與服務器通信而無須刷新當前頁面的技術都被叫做Ajax.
    Ajax這項技術,是Google在Google Labs發布Google Maps和Google Suggest后真正為人所認識。
    Ajax應用實例 - Google Suggest

    Ajax應用實例 - Google Maps
    框架:如果使用一組框架構造了一個網頁,可以只更新其中一個框架,而不必驚動整個頁面

    隱藏的iframe
    XMLHttpRequest:該對象是對 JavaScript 的一個擴展,可使網頁與服務器進行通信。是創建 Ajax 應用的最佳選擇。實際上通常把 Ajax 當成 XMLHttpRequest 對象的代名詞
    Ajax的工作原理圖
    Ajax工具包
    Ajax并不是一項新技術,它實際上是幾種技術,每種技術各盡其職,以一種全新的方式聚合在一起

    XMLHttpRequest最早是在IE5中以ActiveX組件的形式實現的。非W3C標準.
      創建XMLHttpRequest對象(由于非標準所以實現方法不統一)
    Internet Explorer把XMLHttpRequest實現為一個ActiveX對象
    其他瀏覽器(Firefox、Safari、Opera…)把它實現為一個本地的JavaScript對象。

    具體實現流程
    :先創建XMLHttpRequest對象
    //1. 獲取 XMLHttpRequest 對象xhr
    //2. 發送 Ajax 請求
    //2.1 準備請求: 參數1 -- 請求方式, 參數2 -- 請求路徑
    xhr.open("GET", url);
    //2.2 發送請求, 因為是 GET 請求, 所以不需要發送數據
    xhr.send(null);
    //3當 XMLHttpRequest 對象的 readyState 屬性被服務器改變的時候, 觸發 onreadystatechange 事件
    //3.1當 XMLHttpRequest 對象的 readyState 屬性被服務器改變為 4 的時候表示相應已經完成,
    if(xhr.readyState == 4){
    //相應完成, 可以獲取相應信息: 在 XMLHttpRequest 對象的responseText 屬性中包含了相應信息
    //可以進一步的控制打印時機: 當相應正確返回時, 即返回的信息碼為 200 時
    if(xhr.status == 200){
    alert(xhr.responseText);
    }else{
    alert("請求異常...");
    }

    }

    常用狀態碼及其含義:
    • 404 沒找到頁面(not found)
    • 403 禁止訪問(forbidden)
    • 500 內部服務器出錯(internal service error)
    • 200 一切正常(ok)
    • 304 沒有被修改(not modified)
    接收相應
    responseText
    • XMLHttpRequest 的 responseText 屬性包含了從服務器發送的數據。它是一個HTML,XML或普通文本,這取決于服務器發送的內容。
    • 當 readyState 屬性值變成 4 時, responseText 屬性才可用,表明 Ajax 請求已經結束。
    接收相應
      responseXML
    • 如果服務器返回的是 XML, 那么數據將儲存在 responseXML 屬性中。
    • 只用服務器發送了帶有正確首部信息的數據時, responseXML 屬性才是可用的。 MIME 類型必須為 text/xml

    匯總
    數據格式提要
      在服務器端 AJAX 是一門與語言無關的技術。在業務邏輯層使用何種服務器端語言都可以。
      從服務器端接收數據的時候,那些數據必須以瀏覽器能夠理解的格式來發送。服務器端的編程語言只能以如下 3 種格式返回數據:
    • XML
    • JSON
    • HTML

    對比小結


      若應用程序不需要與其他應用程序共享數據的時候, 使用 HTML 片段來返回數據時最簡單的
      如果數據需要重用, JSON 文件是個不錯的選擇, 其在性能和文件大小方面有優勢
      當遠程應用程序未知時, XML 文檔是首選, 因為 XML 是 web 服務領域的 “世界語”
      jQuery 對 Ajax 操作進行了封裝, 在 jQuery 中最底層的方法時 $.ajax(), 第二層是 load(), $.get() 和 $.post(), 第三層是 $.getScript() 和 $.getJSON()
    load() 方法

     load() 方法是 jQuery 中最為簡單和常用的 Ajax 方法, 能載入遠程的 HTML 代碼并插入到 DOM 中. 它的結構是: load(url[, data][,callback])。

      明天繼續!






    posted @ 2010-01-22 00:04 d66380022| 編輯 收藏

      今天AJAX必須用JS,做前端必須用JS,由于課程緊,只安排了一天時間,只講了Dom

    DOM 可在J2SEAPIDocument,便可以查看方法

    DOM:節點node)的層次。

      節點分為三種類型:

      節點(node):來源于網絡理論,代表網絡中的一個連接點。網絡是由節點構成的集合

    1.節點分為三種類型
      element node    attribute node    text node

    2.使用 Aptana 編輯器 :

    3.查找節點:

      1)在哪兒寫代碼:

        不能直接寫在<body> 元素的前面 :因為此時 DOM沒有被完全解析

        可以把 js 寫在 </html> 的后面

        按慣例應該把 js 代碼寫在 <head>中,<title>節點后,此時需要使用 js 函數window.onload = function(){

                  //alert("window.onload...");

                  var cityElement = document.getElementById("city");

                  alert(cityElement.nodeName);

              };

      2Dom屬性:nodeName   nodeType   nodeValue

    nodeName:一個字符串,其內容是給定節點的名字。

       var name = node.nodeName;

    如果給定節點是一個元素節點或屬性節點,nodeName 屬性將返回這個元素的名字。

    如果給定節點是一個文本節點,nodeName 屬性將返回內容為 #text 的字符串。

    nodeName 是一個只讀屬性。

     

    nodeType返回一個整數,這個數值代表著給定節點的類型。

    nodeType 屬性返回的整數值對應著 12 種節點類型:

    Node.ELEMENT_NODE (1)      -- 元素節點

    Node.ATTRIBUTE_NODE (2)    -- 屬性節點

    Node.TEXT_NODE (3)         -- 文本節點

    nodeType 是個只讀屬性 

    nodeValue返回給定節點的當前值(字符串)

              如果給定節點是一個屬性節點,返回值是這個屬性的值

              如果給定節點是一個文本節點,返回值是這個文本節點的

       內容。

              如果給定節點是一個元素節點,返回值是 null

              nodeValue 是一個 / 屬性,但不能對元素節點的    

       nodeValue 屬性設置值,但可以為文本節點的 nodeValue

       屬性設置一個值

     

     4. 關于子節點:

           1). 獲取方法:

                  元素節點的 childNodes 屬性可以獲取指定元素節點的所有子節點.

           2). 火狐 ie 的實現方式不一樣: 火狐包含空格的文本節點    

           3). 提前判斷當前節點是否有子節點:

                  通過元素節點的 hasChildNodes() 方法. 文本節點和屬性節點都沒有子節點, 所以他們的 hasChildNodes() 方法總返回 false     

           4). 可以通過元素節點的 firstChild(lastChild) 來獲取元素節點的第一個子節點(最后一個子節點)  

    可以通過元素節點的 firstChild/lastChild 來獲取元素節點的第一個子節點(最后一個節點)            

    5. 正則表達式

       用途:

    1.        數據有效性驗證

    2.        查找和替換 

    文本格式: /pattern/flags

    參數說明:

    pattern :一個正則表達式文本

    flags : 如果存在,將是以下值:

    g global match(全局匹配)

    i ignore case(忽略大小寫)

    gi both global match and ignore case(匹配所有可能的值,也忽略大小寫)

     

    java中相當重要,可謂必備知識,可惜我這方面沒看過,就列

    一些常用的正則表達式示例:

     

    1、匹配所有的正數:^[0-9]+$

    2、匹配所有的小數:^\-?[0-9]*\.?[0-9]*$

    3匹配所有的整數:^\-?[0-9]+$

    4、提取信息中的中文字符串: [\u4e00-\u9fa5]* ; 

    5、提取信息中的郵件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    6
    、提取信息中的中國手機號碼:(86)*0*13\d{9}
    7
    、提取信息中的中國固定電話號碼:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
    8
    、提取信息中的中國郵政編碼:[1-9]{1}(\d+){5}
    9
    、提取信息中的中國身份證號碼:\d{18}|\d{15}
    10
    、提取信息中的任何數字:(-?\d*)(\.\d+)?
    11
    匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/

     

    6. 創建節點:

           1). 創建元素節點: document.createElement

           2). 創建文本節點: document.createTextNode

           3).創建屬性節點: 可以直接為其添加屬性節點:

                  liNode.onclick = function(){

                         alert(this.firstChild.nodeValue);

                  };

           4). 插入節點:

                  appendChild

                  insertBefore

                  可以自定義 insertAfter

    7. 其它:

           1). 替換節點: replaceChild. **注意: 該方法除了可以替換還可以移動, 一般的, 直接單獨使用該方法時并不多.

           2). 刪除節點: removeChild

           3). innerHTML屬性:   

          

    8. 關于 value nodeValue:

           1). value: html 表單元素的某個節點的 value 屬性值. <input type="text" value=""> -- value 值可通過 .value 獲取; <p value=""></p> 中的 value 屬性值無法通過 .value 干獲取

           2). nodeValue: 文檔(html xml) 中節點的一個屬性, 該屬性和 nodeType, nodeName 并列. 該屬性通常用來獲取文本節點的文本值

          

    9. 關于 if() 中可以放置的表達式: if 中的表達式為 false, undefined, null, "", 0 時表示不滿足條件, 此外都滿足條件.     

          

    10. 作業: dom-8.html 中的: "為所有的 li 添加 click 事件, 實現 game city 對應位置的 li 子節點的互換"   

     

     

    posted @ 2010-01-18 22:20 d66380022| 編輯 收藏

    今天內容密度相當大,而且還有點細,知識點比較多。今天是馮老師的最后一天課程,與老馮的將近一個月的接觸,老馮講課有特點:幽默,上課時時不時幽一下,很提神的;聲音比較大,以至于老馮有句極像口頭禪的“小點聲,不然隔壁又找來了”;最重要的是上課的代碼每天都有超強的注釋,比較有特點的是超強的 readme.txt ,深的同學喜愛;講課特別敬業,這兒的老師都是特別敬業的。聽說老馮嘔心瀝血,自己做了個項目,年后會公布在網上,到時真的研究研究,相當期待。老師最后給我們了個郵箱,以后有問題,仍然可詢問下。

    把今天講的內容總結下,今天講了昨天留的作業(Struts做的客戶信息系統)Struts1.x的驗證機制,表單重復提交,同步令牌機制,上傳的實現,轉換器,國際化內容,由于內容多,只記不會的

    1.處理表單重復提交

    解決方法:

    1. 生成一個唯一的編號,該編號在添加信息的頁面存放在隱藏域中

    該代碼執行后自動添加在customer.jsp頁面中添加如下信息 session中保存一份

    代碼如下:注意:在execute方法中{

    //Actionexecute方法開始加上

    this.saveToken(request);

    //在調用service層增刪改查前加從request中獲取隱藏域的值

    // Stirng gxxxValue=request.getParameter("org.apache.struts.taglib.html.TOKEN");

    // 在從session中取出 String keyValue=session.getAttribute("key");

    // 如果兩個值相等 gxxxValue=keyValue,數據提交

    boolean flag=this.isTokenValid(request);

    if(flag){

    //應該從session中清除session.removeAttribute(key)

    this.resetToken(request);

    / /插入數據庫的方法以下面一句為例

    customerService.saveCustomer(c);

    }else{

    System.out.println("表單重復提交了");

    }

    注意:原理:

    * request中獲取隱藏域的值

    Stirng gxxxValue=request.getParameter("org.apache.struts.taglib.html.TOKEN");

    * 在從session中取出 String keyValue=session.getAttribute("key");

    * 如果兩個值相等 gxxxValue=keyValue,數據提交

    當數據提交后要從sessioon中刪除key sessioon.removeAttribute("key")

    2.轉換器:

     

    當我們在開發時,會遇到數據庫中的數據類型和ActionForm中的類型不一致的情況,為減少轉換的麻煩,Struts給我們了轉換器,她能自動轉化很多類型,但遇到如果遇到Date類型就不能轉換

     

     

    這時要定義轉換器

    如何定義一個轉化器:

    1.定義一個類 String2DateConvert implements Converter

    重寫接口中的方法

    2.注冊轉化器(一定在使用前注冊) struts中常用的轉換器Struts自己給注冊了

    實際是把信息放置到一個Map中,原理:

    * key是轉化數據類型的名稱

    * 轉化器的對象

    converters.put(clazz, converter);

    converters.put(java.util.Date, new String2Dateconverter());

    下面是代碼:在Action類中(注意不是在方法體中),加:

    static{

    /**

    * register(new String2DateConvert(), java.util.Date.class);

    * 第一個參數是轉化器的實例

    * 第二個參數要轉化的數據類型(本類中用的String-java.util.Date)

    */

    ConvertUtils.register(new String2DateConvert(), java.util.Date.class);

    }

    剩下的就是用Struts自己的,代碼:

    BeanUtils.copyProperties(與數據庫交道的form, 與頁面交道的form);

    最后

    建議:開發中ActionForm中的所有屬性定義為String, 不管什么樣的數值我都接收,接收到之后在進行檢驗

    3.國際化:

    struts中的國際化:

    * 定義資源文件

    命名規則基名_語言_國家.properties

    定義支持中文和英文的資源包

    * resource.properties(默認)

    * resource_zh_CN.properties

    * resource_en_US.properties

    把資源包放置到當前web應用的src下,經構建后保存到/WEB-INF/classes目留下

    中文要進行編碼轉化

    native2ascii -encoding gb2312源文件目標文件.properites

    * struts中如何使用

    * struts-config.xml文件中引入 parameter="resource"的值基名

    <message-resources parameter="resource"></message-resources>

    * jsp頁面中如何使用

    引入bean標簽庫

    <%@ taglib uri=http://struts.apache.org/tags-bean prefix="bean"%>

    <bean:message key="username"/> key 是資源文件中=前面的值

    * 如有多個資源文件

    * struts-config.xml文件中引入 parameter="resource"的值基名

    增加屬性key 加以區分

    <message-resources

    parameter="resource1" key="backup"></message-resources>

    *jsp頁面中如何使用

    <bean:message key="username" bundle="backup"/>

    今天就至此了,明天是佟剛老師講AJAX ,每天都有收獲,是我最開心的事情,

    好好休息,靜待明天的來到!

    posted @ 2010-01-17 21:15 d66380022| 編輯 收藏
    僅列出標題
    共5頁: 上一頁 1 2 3 4 5 下一頁 
    主站蜘蛛池模板: 亚洲人成电影网站免费| 亚洲成A人片在线观看中文| 免费理论片51人人看电影| 亚洲愉拍一区二区三区| 亚洲精品自拍视频| 噜噜噜亚洲色成人网站∨| 亚洲va无码va在线va天堂| 国产亚洲精品a在线无码| 99久久这里只精品国产免费| 最近中文字幕高清免费中文字幕mv| 免费成人在线视频观看| 两个人看的www高清免费视频| www在线观看播放免费视频日本| 日韩免费在线中文字幕| 国产精品免费视频观看拍拍| 好吊色永久免费视频大全| 亚洲毛片免费视频| 亚洲欧洲在线播放| 亚洲一级毛片免观看| 亚洲人成无码网站在线观看| 亚洲国产成人AV在线播放| 特级av毛片免费观看| 国产区在线免费观看| 国产三级在线免费| 中国人xxxxx69免费视频| 一个人看www在线高清免费看| 成年女人毛片免费观看97| 免费看男女下面日出水视频| 国产成人亚洲影院在线观看| 亚洲AV综合色区无码一区爱AV| 亚洲精品在线播放| 亚洲熟女综合色一区二区三区 | 免费无码一区二区三区蜜桃大| 日本一区免费电影| 91制片厂制作传媒免费版樱花| 亚洲精品视频免费在线观看| 四虎影院免费在线播放| 精品国产日韩亚洲一区| 亚洲人成网www| 亚洲av无码专区在线观看下载| 国产精品免费在线播放|