隨筆-54  評(píng)論-0  文章-2  trackbacks-0
           

             今天是jBPM的第二天,內(nèi)容不多,定義不少,主要講了流程變量,節(jié)點(diǎn)和事件等知識(shí),全是新的知識(shí),剛學(xué)肯定生疏,久了就沒(méi)問(wèn)題了,編程嘛,多敲代碼,多 調(diào)試,才是王道。
           
          1. 流程變量

          通過(guò)org.jbpm.context.exe.ContextInstance來(lái)操 作變量。

          2.變量的生命周期

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

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

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

          1. 流程圖中的各種節(jié)點(diǎn)的作用及用法

          為什么需要多種節(jié)點(diǎn)類型?

          需要有不同類型(作用)的節(jié)點(diǎn),才能設(shè)計(jì)出復(fù)雜的流程圖。 Jbpm有一套預(yù)先定義好的節(jié)點(diǎn)類型。如果不夠用,也可以使用自定義節(jié)點(diǎn)進(jìn)行擴(kuò)展,以完成不同的流程的需要。

          不同的節(jié)點(diǎn)類型代表不同的行 為。

          每個(gè)流程都必須要有開(kāi)始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)。

          2.預(yù)定義節(jié)點(diǎn)

          start-state,開(kāi)始節(jié)點(diǎn):標(biāo)識(shí)流 程開(kāi)始、
          end-state,結(jié)束節(jié)點(diǎn):標(biāo)識(shí)流程結(jié)束、
          task-node,任務(wù)節(jié)點(diǎn):可以放0個(gè)或多個(gè)任務(wù)、
          decision, 決策節(jié)點(diǎn):路徑選擇,只使用一個(gè)流轉(zhuǎn)(叉路口)、
          fork/join,分支節(jié)點(diǎn)/合并節(jié)點(diǎn):可以分為多個(gè)并行執(zhí)行的分支、
          state,狀 態(tài)節(jié)點(diǎn):等待。


          每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一個(gè)類(Jbpm的持久化類),都是org.jbpm.graph.def.Node的子類。節(jié)點(diǎn) 都有名字、流轉(zhuǎn)(end-state除外)。

          event事件

          事 件。

          1, 有幾種事件,分別在什么時(shí)候觸發(fā)
          2, 怎么指定當(dāng)事件觸發(fā)時(shí)做什么事(Action)
           1, 節(jié)點(diǎn)的事件

          a)      進(jìn)入節(jié)點(diǎn)(node-enter)。(開(kāi)始節(jié)點(diǎn)沒(méi)有)

          b)      離開(kāi)節(jié)點(diǎn)(node-leave)。(結(jié)束節(jié)點(diǎn)沒(méi)有)

          2, 流轉(zhuǎn)的事件

          a)      只有一個(gè):使用流轉(zhuǎn)(take a transition)

          3, 任務(wù)的事件

          a)      創(chuàng)建任務(wù)(task-create)

          b)      分配任務(wù)(task-assign)

          c)      開(kāi)始任務(wù)(task-start)à TaskInstance.start()

          d)      結(jié)束任務(wù)(task-end)à TaskInstance.end()
           每個(gè)事件有一個(gè)動(dòng)作(action)清單。當(dāng)jBPM引擎產(chǎn)生一個(gè)事件,動(dòng)作(action)清單就會(huì)被 執(zhí)行. 不同的節(jié)點(diǎn)支持的事件類型不同,是由event元素所在的節(jié)點(diǎn)的類型決定的,例如transition只有一個(gè)事件。
          可以在event元 素用可以指定一個(gè)動(dòng)作,當(dāng)指定的事件發(fā)生時(shí),這個(gè)動(dòng)作被執(zhí)行。

          可以給同一個(gè)事件指定多個(gè)動(dòng)作,當(dāng)這個(gè)事件觸發(fā)的時(shí)候,這些動(dòng)作執(zhí)行的順序 和定義先后順序是一致的。

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

          一般的節(jié)點(diǎn)都具有的事件:node-enter,進(jìn)入節(jié)點(diǎn)、 node-leave,離開(kāi)節(jié)點(diǎn);
          start-state只有node-leave;
          end-state只有node-enter;
          transition 只有一個(gè)執(zhí)行轉(zhuǎn)換的事件(taking a transition)。因?yàn)橹挥幸粋€(gè)事件,所以配置時(shí)不用寫(xiě)event元素,而直接配置Action。
          task 有task-create,任務(wù)創(chuàng)建、task-assign,任務(wù)分配、task-start,任務(wù)開(kāi)始、task-end,任務(wù)結(jié)束。

          關(guān) 于哪些元素支持哪些事件,可以通過(guò)文檔的18.4節(jié)中的xml文件的寫(xiě)法中獲得。

          如果配置的事件類型不存在,不會(huì)報(bào)錯(cuò),也不會(huì)執(zhí)行。

          注 意:在事件中定義的動(dòng)作(Action)不應(yīng)該(不能)影響流程的執(zhí)行。即不要在事件的動(dòng)作中給token發(fā)信號(hào),否則會(huì)拋異常:token is locked。(在Node中配置的Action可以給Token發(fā)信號(hào)。)

          事件執(zhí)行的順序:

          已觸發(fā)事件:node-leave

          已觸發(fā)事件:transition

          已 觸發(fā)事件:node-enter

          已觸發(fā)事件:task-create

          已觸發(fā)事件:task-assign

          已 觸發(fā)事件:task-start

          已觸發(fā)事件:task-end
           

          ************************* 動(dòng)態(tài)的創(chuàng)建不確定數(shù)量的任務(wù)實(shí)例 *********

          會(huì)簽。

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

          類 CreateTaskInstancesAction要接管兩個(gè)操作:創(chuàng)建與分配任務(wù)實(shí)例。
           創(chuàng)建任務(wù)實(shí)例要調(diào)用方法:

            TaskMgmtInstance.createTaskInstance(Task, ExecutionContext);

          其中的 Task 是任務(wù)的定義,可以先得到當(dāng)前的節(jié)點(diǎn):

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

          然后通過(guò)任務(wù)的名字得到任務(wù)的定義:

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

           

          任務(wù)分配

          個(gè)人任務(wù):actor-id=”xxx”
                             

          查詢組任務(wù)列表的方法為:

          TaskMgmtSession.findPooledTaskInstances(String actorId)
                                

          對(duì)于一個(gè)組任務(wù),如果他的actorId為null,組中所 有的用戶都可以在組任務(wù)列表中看到這個(gè)任務(wù)。如果使用TaskInstance.setActorId(String)方法設(shè)置這個(gè)任務(wù)由指定的 acrorId來(lái)辦理,這時(shí)pooledActors中的其他人就看不到這個(gè)任務(wù)了,就是說(shuō)actorId會(huì)屏蔽pooledActors; 當(dāng)這個(gè)用戶因某些原因不能辦理任務(wù)時(shí),可以把這個(gè)任務(wù)再退回到組任務(wù)列表中,方法是調(diào)用TaskInstance.setActorId(null)設(shè)置 actorId為null,這時(shí)pooledActors中的所有人又都可以看到這個(gè)任務(wù)了。

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

              最后湯兄給我們推薦了一些好書(shū),學(xué)習(xí)java必須準(zhǔn)備三樣: 心態(tài),基礎(chǔ),睡覺(jué)。能學(xué)多少學(xué)多少。明天才是OA工作流項(xiàng)目的開(kāi)始!加油。。。
          posted @ 2010-02-01 21:59 d66380022| 編輯 收藏
          JBPMOA項(xiàng)目

             哈 哈,今天終于要開(kāi)始做項(xiàng)目了,心情特別好,在第一天中湯兄讓我們先明白了什么是工作流,怎樣很好的解決這一類問(wèn)題等,接著來(lái)了個(gè)Helloworld,就入門(mén)了。每天都在學(xué)習(xí),每天都有收獲,感覺(jué)真好。還要再提一下,OA(辦公自動(dòng)化)主要技術(shù)之一就是工作流,好,還是仔細(xì)總結(jié)一下一天所學(xué):

           

          1. 工作流就是工 作流程的計(jì)算機(jī)化

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

            網(wǎng)購(gòu):提交訂單>配貨>發(fā)貨>收貨>付款

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

            狀態(tài)機(jī) +if else

           

          2. 工作流要解決的主要問(wèn)題是:為實(shí)現(xiàn)某個(gè)業(yè)務(wù)目 標(biāo),在多個(gè)參與者之間,利用計(jì)算機(jī),按某種預(yù)定規(guī)則自 動(dòng)傳遞文檔、信息或者任務(wù)。

          通俗的說(shuō),就是多個(gè)人在一起合作完成某件事情。

           

          接下來(lái)是jBPM介紹

          3.jBPM介紹

           jBPM全稱是Java Business Process Management。是一種基于J2EE的輕量級(jí)工作流管理系統(tǒng),jBPM是公開(kāi)源 代碼項(xiàng)目

          官方主頁(yè)http://labs.jboss.com/

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

           

          最重要的還是接下來(lái)的jBPM的使用

           4.Jbpm的使用

          server:提供的一個(gè)執(zhí)行、測(cè)試工作流和平臺(tái)(Web應(yīng)用程序)。

           

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

           

          此文件的約束就是 jPDL

          jPDL中,不同 的節(jié)點(diǎn),就用不同的標(biāo)簽。

           

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

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

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

           

          應(yīng)用myEclipse設(shè) 計(jì)流程圖步驟:

           

          1.jbpm-jpdl-3.2.2插件:

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

          2.之后在桌面上myEclipse快 捷方式,點(diǎn)右鍵,查找目標(biāo),找到myEclipse安裝目錄,再其下的links目錄下 加入a.link文件 (a可以隨意寫(xiě)),內(nèi)容為 path=粘貼  注意里路徑變?yōu)殡p斜線,之后關(guān)閉myEclipse,再打開(kāi)就OK了。

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

           

          4啟動(dòng)服務(wù)器:server/start.bat

          5訪問(wèn)http://localhost:8080/jbpm-console登陸后點(diǎn)Deploy下圖

           6.zip文件部署

                 7.點(diǎn)Deploy

          8.點(diǎn)start

          9.點(diǎn)tokens 后點(diǎn)singal,后在其下點(diǎn)singal

          10.點(diǎn)tasks,點(diǎn)start ,按部就班搞定

           

          注意事項(xiàng):

           

          1.怎么從開(kāi)始節(jié)點(diǎn)往下走?Tokens à Signal(只點(diǎn)一次)

          2.怎么沒(méi)有properties窗口?Window à Show View à Properties

          3.怎么一點(diǎn)Signal,就結(jié)束了呢?沒(méi)有在Task-Node中 定義任務(wù)吧。要說(shuō)明任務(wù)名稱與任務(wù)的執(zhí)行者。

          4.點(diǎn)擊Process Image,在圖片上沒(méi)有一個(gè)正在運(yùn) 行的標(biāo)志,而且在上方還有一個(gè)錯(cuò)誤提示?把節(jié)點(diǎn)的名稱改為英文,重新Deploy就可 以了。

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

           

          Token的解釋:流程實(shí)例通過(guò)Token的維護(hù) 當(dāng)前正在執(zhí)行的節(jié)點(diǎn)

          入門(mén)程序:

          HelloWorld

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

          2, 部署流程定義à 把工作流交給工 作流管理系統(tǒng)保存起來(lái)。只需要執(zhí)行一次,一般是管理員進(jìn)行操作。

          3, 執(zhí)行流程à 多個(gè)操作:

          a)      啟動(dòng)(創(chuàng)建)流程實(shí)例(Signal

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

          c)      辦理任務(wù)

                              i.        開(kāi)始任務(wù)

                              ii.        結(jié)束任務(wù)

          今天就這么多了,明天再寫(xiě)!

          posted @ 2010-01-31 23:36 d66380022| 編輯 收藏
               今天繼續(xù)講的是lucene的分詞器,湯兄先回顧了昨天的所學(xué)內(nèi)容,很好。今天講了lucene的細(xì)節(jié),比如分詞器和高亮器,以及高級(jí)搜索等功能的實(shí)現(xiàn)框架Compass,案例是傳智的貼吧搜索功能的實(shí)現(xiàn),用的當(dāng)然也是lucene

           

                                                全文檢索(Lucene)的深入

          分詞器:對(duì)文本資源進(jìn)行切分,將文本按規(guī)則切 分為一個(gè)個(gè)可以進(jìn)行索引的最小單位(關(guān)鍵詞)。

          某文檔中的一段文本,經(jīng)過(guò)分詞后如下:

           

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          Internet

          采集

          信息

          軟件

          叫做

          爬蟲(chóng)

          蜘蛛

           

          建立索引和進(jìn)行搜索時(shí)都要用到分詞器。為了保證能正確的搜索到結(jié)果,在建立索引 與進(jìn)行搜索時(shí)使用的分詞器應(yīng)是同一個(gè)。

           

          全文檢索不區(qū)分大小寫(xiě)

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

          最好的分詞器:詞庫(kù)分詞

            高亮器:

          1.作用:

            1.截取摘要(大小)

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

          2.怎么用:

             過(guò)濾器 Filter

          RangeFilter,可以對(duì)搜索出來(lái)的結(jié)果進(jìn)行過(guò) 濾。

           排序 sort

          Lucene的搜索結(jié)果默認(rèn)按相關(guān)度排序的。所謂相關(guān)度,就是文檔的得分。Lucene有一個(gè)評(píng)分機(jī)制,就是對(duì)檢索結(jié)果按某種標(biāo)準(zhǔn)進(jìn)行評(píng)估,然后按分值的高低來(lái)對(duì)結(jié)果進(jìn)行排序。


          查詢對(duì)象

          TermQuery

           Term是查詢的最小單位,第一個(gè)參數(shù)是屬性,第 二個(gè)是要查詢的內(nèi)容,下面的代碼的

          整個(gè)意思就是在title中查詢檢索

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

            Query query = new TermQuery(term);

           

          關(guān)鍵詞查詢RangeQuery

          范圍查詢WildcardQueryPhraseQuery

          短語(yǔ)查詢

          BooleanQuery

          public void add(Query query, Occur occur)

           

          Occur 用于表示布爾查詢子句關(guān)系的類,包括:

          Occur.MUSTOccur.MUST_NOTOccur.SHOULD

           

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

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

          3,  SHOULDSHOULD,表示“或”關(guān)系,最終檢索結(jié)果為所有檢索子句的并集。


                                          Compass框架

          Lucene  + Hibernate

          Hibernate操作實(shí)現(xiàn)原理:

          主配置文件 hibernate.cfg.xml

                      1.連接信息

                               2.聲明映射文件

                      3.其他配置

          映射文件:.hbm.xml

                    對(duì)象

                          屬性

          同樣,Compass實(shí)現(xiàn)原理如圖:

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

          今天由湯陽(yáng)光老師(不如說(shuō)是湯兄)給我們講lucene,一見(jiàn)湯兄,太年輕了,真是這感覺(jué)真讓我有些小慚愧,呵呵。。。還是學(xué)好技術(shù)是第一要?jiǎng)?wù)。

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

          1.信息檢索:找出與用戶需求相關(guān)的信息

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

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

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

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

          Eclipse的幫助就是用Lucene做的

          2.入門(mén)

          運(yùn)行原理/入門(mén)概念

          Hello World

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

          Field是組成Document的元素

          實(shí)現(xiàn):
          步驟:1.建立索引

                2.搜索

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

          實(shí)現(xiàn)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.兩個(gè)主要方法:
              1.建立索引:
               createIndex()    
              2.搜索
              search()
          進(jìn)行搜索
          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,進(jìn)行查詢
              IndexSearcher indexSearcher = new IndexSearcher(indexPath);
              Filter filter = null;
              TopDocs topDocs = indexSearcher.search(query, filter, 10000);
              System.out.println("總共有【"+topDocs.totalHits+"】條匹配結(jié)果");
                 // 3,打印結(jié)果
              for(ScoreDoc scoreDoc : topDocs.scoreDocs){
                 int docSn = scoreDoc.doc; // 文檔內(nèi)部編號(hào)
                 Document doc = indexSearcher.doc(docSn); // 根據(jù)編號(hào)取出相應(yīng)的文檔
                 File2DocumentUtils.printDocumentInfo(doc; // 打印出文檔信息
              }
          }

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

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

          今天學(xué)了Lucene的入門(mén),明天學(xué)習(xí)Lucene的高級(jí)知識(shí),以及compass框架!
                 // 優(yōu)化索引庫(kù)
                 optimize()
          IndexSearcher:操作索引庫(kù),查詢
                 // 構(gòu)造方法,索引庫(kù)不存在,就報(bào)錯(cuò)
                 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所操作的對(duì)象
          Field:組成Document的元素,代表一個(gè)屬性。Store、Index
            new Field( String name, String value, Store store, Index index )

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

          徐老師已經(jīng)把常見(jiàn)的異常在課堂上進(jìn)行了演示,說(shuō)實(shí)話,這兩天都有點(diǎn)郁悶啊,Hibernate咋挺難懂的,老師講的比較深,一天下來(lái),晚上再看一遍老師的視頻,才基本上可以搞清楚課堂上不理解 的知識(shí)點(diǎn)。今天講的雙向關(guān)聯(lián)和檢索策略。

          1.雙向關(guān)聯(lián)

          1.一對(duì)多關(guān)聯(lián)關(guān)系

          屬性方式

          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.測(cè)試: 主要代碼:

          Customer c = new Customer();

                        c.setAge(12);

                       

                        Order o = new Order();

                        o.setOrderNumber("No003");

                        o.setPrice(500f);

                        //設(shè)置關(guān)聯(lián)關(guān)系

                        o.setCustomer(c);

                       

                        //s.save(c);

                        s.save(o);

           

          5.通過(guò)Hibernate 查詢客戶所有訂單

           

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

          debug模式查看所有訂單信息

           

          注意:雙向關(guān)聯(lián)是兩端同時(shí)進(jìn) 行

          2.操縱持久化對(duì)象:

          對(duì)緩存的理解:首先明白一點(diǎn):

          顯式回收:

          當(dāng)沒(méi)有任何一個(gè)對(duì)象引用或者指針指向他時(shí),就回收

           

          1.當(dāng)用session 增刪改查對(duì)象時(shí),用seesion.flush()方法可以實(shí)現(xiàn)將數(shù)據(jù)插入數(shù)據(jù)庫(kù),但不提交事務(wù),。

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

           

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

           

          緩存里放的全是引用

           

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

          s.refresh();  //刷新緩存  讓緩存和數(shù)據(jù)庫(kù)保持同步, 以數(shù)據(jù)庫(kù)為準(zhǔn),觸發(fā)一個(gè)查詢操作,把數(shù)據(jù)找回來(lái)

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

           

          例如:

          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(); //這時(shí)仍然可以得到name

          C2 = null;//之后如果再調(diào)用上面的語(yǔ)句,則不能得到name

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

          緩存的作用:

          1。減少訪問(wèn)數(shù)據(jù)庫(kù)的頻率。

          2。保證緩存中的對(duì)象與數(shù)據(jù)庫(kù)中的相關(guān)記錄保持同步。

          3。當(dāng)緩存中的持久化對(duì)象之間存在循環(huán)關(guān)聯(lián)關(guān)系時(shí),Session會(huì)保證不出現(xiàn)訪問(wèn)對(duì)象圖的死循

               還,以及由死循環(huán)引起的JVM堆棧溢出異常。

          提示:

          當(dāng)session加載了customer對(duì)象后,會(huì)為customer對(duì)象的值類型的屬性復(fù)制一份快照。當(dāng)清理

          緩存時(shí),通過(guò)比較對(duì)象的當(dāng)前屬性和快照,來(lái)判斷對(duì)象的那些屬性發(fā)生了變化。

           

          3.hibernatejava對(duì)象的狀態(tài)

          臨時(shí)狀態(tài)(transient):剛剛用new語(yǔ)句創(chuàng)建,沒(méi)有被持久化,不處于session中。該對(duì)象

          成為臨時(shí)對(duì)象

          持久化狀態(tài)(persistent):已經(jīng)被持久化,加入到session的緩存中。該狀態(tài)的對(duì)象為持久

             化對(duì)象。

          游離狀態(tài)(detached):已經(jīng)被持久化,但不處于session中。該狀態(tài)的對(duì)象為游離對(duì)象。

          注意:sessiondelete方法對(duì)于游離對(duì)象,該方法從數(shù)

                據(jù)庫(kù)中刪除記錄,對(duì)于持久化對(duì)象,該方法從數(shù)據(jù)

                庫(kù)中刪除記錄,還要?jiǎng)h除緩存中的對(duì)象。

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

                對(duì)象都變?yōu)橛坞x對(duì)象。

          游離對(duì)象處于內(nèi)存中

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

          一對(duì)一:用的較少
           
          舉例:人員和身份證
          設(shè)計(jì)表
          user 存在用戶表,photo存在photo表

          一對(duì)一關(guān)聯(lián):外鍵關(guān)聯(lián)
           
          另一種方法:主鍵關(guān)聯(lián)
           
           
          注意:constrained = true
          多對(duì)多:

          老師對(duì)學(xué)生 學(xué)生有多個(gè)老師
           
          只有刪除和插入的概念,沒(méi)有更新的概念

                             
           
           檢索方式:
          檢索方式簡(jiǎn)介
          HQL檢索方式
          1。7。調(diào)用用戶自定義的函數(shù)
          8。嵌入式查詢
          9。動(dòng)態(tài)綁定參數(shù)在查詢語(yǔ)句中設(shè)定各種查詢條件
          2。支持投影,僅檢索出對(duì)象的部分屬性
          3。支持分頁(yè)
          4。連接查詢
          5。分組查詢
          6。內(nèi)置聚集函數(shù)
          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.多態(tài)查詢    (查詢所有該類以及該類的子類所對(duì)應(yīng)的表,如果查詢接口,則查詢的是實(shí)現(xiàn)的是查詢所有實(shí)現(xiàn)該接口的類所對(duì)應(yīng)的表

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

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

          分頁(yè)查詢
          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();


          檢索單個(gè)對(duì)象
          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();
           
          檢索方式簡(jiǎn)介
          對(duì)查詢結(jié)果排序
          hql 查詢:
          session.createQuery(“from Employee c order by c.name”);
          qbc查詢:
          session.createCriteria(Customer.class).addOrder(Order.asc(“id”));

          分頁(yè)查詢
          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();


          檢索單個(gè)對(duì)象
          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();

          綁定參數(shù)

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

             報(bào)表查詢
           
          小結(jié)
          比較方面              HQL檢索                   QBC檢索
          可讀性           優(yōu)點(diǎn):和sql相近,易讀         將語(yǔ)句肢解成一組criteria,較差
          功能             支持各種查詢                  不支持報(bào)表查詢和子查詢。有限的連接查詢
          查詢語(yǔ)句形式     基于字符串形式的sql           更加面向?qū)ο?br /> 何時(shí)被解析       運(yùn)行時(shí)被解析                  編譯時(shí)被解析,更易排錯(cuò)
          可擴(kuò)展性         不具擴(kuò)展性                    用戶可擴(kuò)展criteria接口
          對(duì)動(dòng)態(tài)查詢語(yǔ)句的支持 支持動(dòng)態(tài)查詢,編程麻煩    適合動(dòng)態(tài)生成查詢語(yǔ)句

          直接弄個(gè)connection ,斷點(diǎn)一下,看是否用的c3p0

          在學(xué)習(xí)中一定要不斷調(diào)試代碼!努力消化一天所學(xué)!
          posted @ 2010-01-31 23:32 d66380022| 編輯 收藏
              AJAX實(shí)例

            今天是AJAXweb開(kāi) 發(fā)中的典型應(yīng)用,也是AJAX的最后一天課,老佟不愧是AJAX的行家,以至于每個(gè)班的AJAX都是他帶的,老佟講課風(fēng)趣極了,課 堂總是不是傳來(lái)同學(xué)們笑聲。。。經(jīng)過(guò)三天的js和昨天的AJAX的學(xué)習(xí),今天終于可以體現(xiàn)一下無(wú)刷新的感覺(jué)。

          日期驗(yàn)證

          1. 日期驗(yàn)證的需求:

              1). 當(dāng) birth 輸入框中的文字是 "請(qǐng)輸入您的生日" 時(shí), 鼠標(biāo)獲取焦點(diǎn)時(shí), 文本框中的字符變?yōu)榭崭?/span>

              2). 當(dāng)失去焦點(diǎn)時(shí), 若文本框中的字符為空格, 使其值重新設(shè)為 "請(qǐng)輸入您的生日"

              3). 當(dāng)失去焦點(diǎn), 且文本框中的字符不是空格, 且其值發(fā)生變化時(shí), 發(fā)送 Ajax 請(qǐng)求到服務(wù)器端驗(yàn)證輸入的日期格式是否合法.

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

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

                

          2. Ajax 請(qǐng)求時(shí)提示信息  

          3.有等待的特效

           

          工程整體結(jié)構(gòu)如圖:注:使用的是jQuery庫(kù)

           

          1.       新建input-date.jsp頁(yè)面,關(guān)鍵代 碼:

          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);

                               //再加一個(gè)需求:當(dāng)文本框中的值發(fā)生變化, 且其 值不是默認(rèn)值, 長(zhǎng)度在 8 --10 之間, 此時(shí)會(huì)發(fā)送 Ajax 請(qǐng)求

                               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="請(qǐng)輸 入您的生日" />

                 <br>

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

          </body>

          2.新建DateValidateServlet,關(guān)鍵代碼:

              //1. 獲取 birth

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

                       

                        //2. 驗(yàn)證

                        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. 根據(jù)驗(yàn)證結(jié)果返回字符串

                        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,寫(xiě)代碼:

          如下

             <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>標(biāo)簽體中加上如下代碼:

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

          3.接著導(dǎo)入jquery.blockUI.js文件

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

           

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

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

          Ajax應(yīng)用實(shí)例 - Google Maps
          框架:如果使用一組框架構(gòu)造了一個(gè)網(wǎng)頁(yè),可以只更新其中一個(gè)框架,而不必驚動(dòng)整個(gè)頁(yè)面

          隱藏的iframe
          XMLHttpRequest:該對(duì)象是對(duì) JavaScript 的一個(gè)擴(kuò)展,可使網(wǎng)頁(yè)與服務(wù)器進(jìn)行通信。是創(chuàng)建 Ajax 應(yīng)用的最佳選擇。實(shí)際上通常把 Ajax 當(dāng)成 XMLHttpRequest 對(duì)象的代名詞
          Ajax的工作原理圖
          Ajax工具包
          Ajax并不是一項(xiàng)新技術(shù),它實(shí)際上是幾種技術(shù),每種技術(shù)各盡其職,以一種全新的方式聚合在一起

          XMLHttpRequest最早是在IE5中以ActiveX組件的形式實(shí)現(xiàn)的。非W3C標(biāo)準(zhǔn).
            創(chuàng)建XMLHttpRequest對(duì)象(由于非標(biāo)準(zhǔn)所以實(shí)現(xiàn)方法不統(tǒng)一)
          Internet Explorer把XMLHttpRequest實(shí)現(xiàn)為一個(gè)ActiveX對(duì)象
          其他瀏覽器(Firefox、Safari、Opera…)把它實(shí)現(xiàn)為一個(gè)本地的JavaScript對(duì)象。

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

          }

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

          匯總
          數(shù)據(jù)格式提要
            在服務(wù)器端 AJAX 是一門(mén)與語(yǔ)言無(wú)關(guān)的技術(shù)。在業(yè)務(wù)邏輯層使用何種服務(wù)器端語(yǔ)言都可以。
            從服務(wù)器端接收數(shù)據(jù)的時(shí)候,那些數(shù)據(jù)必須以瀏覽器能夠理解的格式來(lái)發(fā)送。服務(wù)器端的編程語(yǔ)言只能以如下 3 種格式返回?cái)?shù)據(jù):
          • XML
          • JSON
          • HTML

          對(duì)比小結(jié)


            若應(yīng)用程序不需要與其他應(yīng)用程序共享數(shù)據(jù)的時(shí)候, 使用 HTML 片段來(lái)返回?cái)?shù)據(jù)時(shí)最簡(jiǎn)單的
            如果數(shù)據(jù)需要重用, JSON 文件是個(gè)不錯(cuò)的選擇, 其在性能和文件大小方面有優(yōu)勢(shì)
            當(dāng)遠(yuǎn)程應(yīng)用程序未知時(shí), XML 文檔是首選, 因?yàn)?XML 是 web 服務(wù)領(lǐng)域的 “世界語(yǔ)”
            jQuery 對(duì) Ajax 操作進(jìn)行了封裝, 在 jQuery 中最底層的方法時(shí) $.ajax(), 第二層是 load(), $.get() 和 $.post(), 第三層是 $.getScript() 和 $.getJSON()
          load() 方法

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

            明天繼續(xù)!






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

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

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

          DOM樹(shù):節(jié)點(diǎn)node)的層次。

            節(jié)點(diǎn)分為三種類型:

            節(jié)點(diǎn)(node):來(lái)源于網(wǎng)絡(luò)理論,代表網(wǎng)絡(luò)中的一個(gè)連接點(diǎn)。網(wǎng)絡(luò)是由節(jié)點(diǎn)構(gòu)成的集合

          1.節(jié)點(diǎn)分為三種類型
            element node    attribute node    text node

          2.使用 Aptana 編輯器 :

          3.查找節(jié)點(diǎn):

            1)在哪兒寫(xiě)代碼:

              不能直接寫(xiě)在<body> 元素的前面 :因?yàn)榇藭r(shí) DOM沒(méi)有被完全解析

              可以把 js 寫(xiě)在 </html> 的后面

              按慣例應(yīng)該把 js 代碼寫(xiě)在 <head>中,<title>節(jié)點(diǎn)后,此時(shí)需要使用 js 函數(shù)window.onload = function(){

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

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

                        alert(cityElement.nodeName);

                    };

            2Dom屬性:nodeName   nodeType   nodeValue

          nodeName:一個(gè)字符串,其內(nèi)容是給定節(jié)點(diǎn)的名字。

             var name = node.nodeName;

          如果給定節(jié)點(diǎn)是一個(gè)元素節(jié)點(diǎn)或?qū)傩怨?jié)點(diǎn),nodeName 屬性將返回這個(gè)元素的名字。

          如果給定節(jié)點(diǎn)是一個(gè)文本節(jié)點(diǎn),nodeName 屬性將返回內(nèi)容為 #text 的字符串。

          nodeName 是一個(gè)只讀屬性。

           

          nodeType返回一個(gè)整數(shù),這個(gè)數(shù)值代表著給定節(jié)點(diǎn)的類型。

          nodeType 屬性返回的整數(shù)值對(duì)應(yīng)著 12 種節(jié)點(diǎn)類型:

          Node.ELEMENT_NODE (1)      -- 元素節(jié)點(diǎn)

          Node.ATTRIBUTE_NODE (2)    -- 屬性節(jié)點(diǎn)

          Node.TEXT_NODE (3)         -- 文本節(jié)點(diǎn)

          nodeType 是個(gè)只讀屬性 

          nodeValue返回給定節(jié)點(diǎn)的當(dāng)前值(字符串)

                    如果給定節(jié)點(diǎn)是一個(gè)屬性節(jié)點(diǎn),返回值是這個(gè)屬性的值

                    如果給定節(jié)點(diǎn)是一個(gè)文本節(jié)點(diǎn),返回值是這個(gè)文本節(jié)點(diǎn)的

             內(nèi)容。

                    如果給定節(jié)點(diǎn)是一個(gè)元素節(jié)點(diǎn),返回值是 null

                    nodeValue 是一個(gè) /寫(xiě) 屬性,但不能對(duì)元素節(jié)點(diǎn)的    

             nodeValue 屬性設(shè)置值,但可以為文本節(jié)點(diǎn)的 nodeValue

             屬性設(shè)置一個(gè)值

           

           4. 關(guān)于子節(jié)點(diǎn):

                 1). 獲取方法:

                        元素節(jié)點(diǎn)的 childNodes 屬性可以獲取指定元素節(jié)點(diǎn)的所有子節(jié)點(diǎn).

                 2). 火狐 ie 的實(shí)現(xiàn)方式不一樣: 火狐包含空格的文本節(jié)點(diǎn)    

                 3). 提前判斷當(dāng)前節(jié)點(diǎn)是否有子節(jié)點(diǎn):

                        通過(guò)元素節(jié)點(diǎn)的 hasChildNodes() 方法. 文本節(jié)點(diǎn)和屬性節(jié)點(diǎn)都沒(méi)有子節(jié)點(diǎn), 所以他們的 hasChildNodes() 方法總返回 false     

                 4). 可以通過(guò)元素節(jié)點(diǎn)的 firstChild(lastChild) 來(lái)獲取元素節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)(最后一個(gè)子節(jié)點(diǎn))  

          可以通過(guò)元素節(jié)點(diǎn)的 firstChild/lastChild 來(lái)獲取元素節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)(最后一個(gè)節(jié)點(diǎn))            

          5. 正則表達(dá)式

             用途:

          1.        數(shù)據(jù)有效性驗(yàn)證

          2.        查找和替換 

          文本格式: /pattern/flags

          參數(shù)說(shuō)明:

          pattern :一個(gè)正則表達(dá)式文本

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

          g global match(全局匹配)

          i ignore case(忽略大小寫(xiě))

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

           

          java中相當(dāng)重要,可謂必備知識(shí),可惜我這方面沒(méi)看過(guò),就列

          一些常用的正則表達(dá)式示例:

           

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

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

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

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

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

           

          6. 創(chuàng)建節(jié)點(diǎn):

                 1). 創(chuàng)建元素節(jié)點(diǎn): document.createElement

                 2). 創(chuàng)建文本節(jié)點(diǎn): document.createTextNode

                 3).創(chuàng)建屬性節(jié)點(diǎn): 可以直接為其添加屬性節(jié)點(diǎn):

                        liNode.onclick = function(){

                               alert(this.firstChild.nodeValue);

                        };

                 4). 插入節(jié)點(diǎn):

                        appendChild

                        insertBefore

                        可以自定義 insertAfter

          7. 其它:

                 1). 替換節(jié)點(diǎn): replaceChild. **注意: 該方法除了可以替換還可以移動(dòng), 一般的, 直接單獨(dú)使用該方法時(shí)并不多.

                 2). 刪除節(jié)點(diǎn): removeChild

                 3). innerHTML屬性:   

                

          8. 關(guān)于 value nodeValue:

                 1). value: html 表單元素的某個(gè)節(jié)點(diǎn)的 value 屬性值. <input type="text" value=""> -- value 值可通過(guò) .value 獲取; <p value=""></p> 中的 value 屬性值無(wú)法通過(guò) .value 干獲取

                 2). nodeValue: 文檔(html xml) 中節(jié)點(diǎn)的一個(gè)屬性, 該屬性和 nodeType, nodeName 并列. 該屬性通常用來(lái)獲取文本節(jié)點(diǎn)的文本值

                

          9. 關(guān)于 if() 中可以放置的表達(dá)式: 當(dāng) if 中的表達(dá)式為 false, undefined, null, "", 0 時(shí)表示不滿足條件, 此外都滿足條件.     

                

          10. 作業(yè): dom-8.html 中的: "為所有的 li 添加 click 事件, 實(shí)現(xiàn) game city 對(duì)應(yīng)位置的 li 子節(jié)點(diǎn)的互換"   

           

           

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

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

          把今天講的內(nèi)容總結(jié)下,今天講了昨天留的作業(yè)(Struts做的客戶信息系統(tǒng))Struts1.x的驗(yàn)證機(jī)制,表單重復(fù)提交,同步令牌機(jī)制,上傳的實(shí)現(xiàn),轉(zhuǎn)換器,國(guó)際化內(nèi)容,由于內(nèi)容多,只記不會(huì)的

          1.處理表單重復(fù)提交

          解決方法:

          1. 生成一個(gè)唯一的編號(hào),該編號(hào)在添加信息的頁(yè)面存放在隱藏域中

          該代碼執(zhí)行后自動(dòng)添加在customer.jsp頁(yè)面中添加如下信息 session中保存一份

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

          //Actionexecute方法開(kāi)始加上

          this.saveToken(request);

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

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

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

          // 如果兩個(gè)值相等 gxxxValue=keyValue,數(shù)據(jù)提交

          boolean flag=this.isTokenValid(request);

          if(flag){

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

          this.resetToken(request);

          / /插入數(shù)據(jù)庫(kù)的方法以下面一句為例

          customerService.saveCustomer(c);

          }else{

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

          }

          注意:原理:

          * request中獲取隱藏域的值

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

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

          * 如果兩個(gè)值相等 gxxxValue=keyValue,數(shù)據(jù)提交

          當(dāng)數(shù)據(jù)提交后要從sessioon中刪除key sessioon.removeAttribute("key")

          2.轉(zhuǎn)換器:

           

          當(dāng)我們?cè)陂_(kāi)發(fā)時(shí),會(huì)遇到數(shù)據(jù)庫(kù)中的數(shù)據(jù)類型和ActionForm中的類型不一致的情況,為減少轉(zhuǎn)換的麻煩,Struts給我們了轉(zhuǎn)換器,她能自動(dòng)轉(zhuǎn)化很多類型,但遇到如果遇到Date類型就不能轉(zhuǎn)換

           

           

          這時(shí)要定義轉(zhuǎn)換器

          如何定義一個(gè)轉(zhuǎn)化器:

          1.定義一個(gè)類 String2DateConvert implements Converter

          重寫(xiě)接口中的方法

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

          實(shí)際是把信息放置到一個(gè)Map中,原理:

          * key是轉(zhuǎn)化數(shù)據(jù)類型的名稱

          * 轉(zhuǎn)化器的對(duì)象

          converters.put(clazz, converter);

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

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

          static{

          /**

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

          * 第一個(gè)參數(shù)是轉(zhuǎn)化器的實(shí)例

          * 第二個(gè)參數(shù)要轉(zhuǎn)化的數(shù)據(jù)類型(本類中用的String-java.util.Date)

          */

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

          }

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

          BeanUtils.copyProperties(與數(shù)據(jù)庫(kù)交道的form, 與頁(yè)面交道的form);

          最后

          建議:開(kāi)發(fā)中ActionForm中的所有屬性定義為String, 不管什么樣的數(shù)值我都接收,接收到之后在進(jìn)行檢驗(yàn)

          3.國(guó)際化:

          struts中的國(guó)際化:

          * 定義資源文件

          命名規(guī)則基名_語(yǔ)言_國(guó)家.properties

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

          * resource.properties(默認(rèn))

          * resource_zh_CN.properties

          * resource_en_US.properties

          把資源包放置到當(dāng)前web應(yīng)用的src下,經(jīng)構(gòu)建后保存到/WEB-INF/classes目留下

          中文要進(jìn)行編碼轉(zhuǎn)化

          native2ascii -encoding gb2312源文件目標(biāo)文件.properites

          * struts中如何使用

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

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

          * jsp頁(yè)面中如何使用

          引入bean標(biāo)簽庫(kù)

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

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

          * 如有多個(gè)資源文件

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

          增加屬性key 加以區(qū)分

          <message-resources

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

          *jsp頁(yè)面中如何使用

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

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

          好好休息,靜待明天的來(lái)到!

          posted @ 2010-01-17 21:15 d66380022| 編輯 收藏
          僅列出標(biāo)題
          共5頁(yè): 上一頁(yè) 1 2 3 4 5 下一頁(yè) 
          主站蜘蛛池模板: 佛山市| 阳泉市| 洱源县| 枣阳市| 高州市| 宣化县| 玛沁县| 台前县| 报价| 津市市| 和平区| 沁阳市| 大港区| 黎城县| 宁都县| 常宁市| 米泉市| 天津市| 湘乡市| 团风县| 宁远县| 大余县| 驻马店市| 滕州市| 介休市| 扎囊县| 临邑县| 威海市| 罗城| 会同县| 南安市| 汉阴县| 偃师市| 平泉县| 泸定县| 本溪| 于都县| 泸西县| 白河县| 吴桥县| 金山区|