Venkman 是為 基于 Mozilla 的瀏覽器而提供的一個強大的 JavaScript 調試環境。本文將對Venkman 做一個簡單的介紹。
環境:Mozilla Firefox 1.0.4
JavaScript Dubugger 0.9.84 (此為Venkman 的代號)
第一步就是給 Firefox 安裝此插件。
安裝好后重啟一下 Firefox,就可在菜單工具 -> JavaScript Debugger 點擊來運行 Venkman。
Venkman 界面如下:
第二步,我們來寫一個有錯誤的代碼:
一個名為 Test.js 的 JavaScript 腳本文件。
一個名為 Test.html 的網頁文件。
我們可以看到在 Test.js 中的方法 test(str) 中有個不易被發覺得錯誤”alert(Src)”
這個 Src ,我們并沒有聲明過,像這種誤打在平時的寫代碼過程中經常有這種問題。好,我們來看看 Venkman 是如何來捕捉這個 Bug 的。
你可以在 Venkman 中打開這個 Test.js 文件,也可以不用打開,因為在你打開了 Venkman 后,用 Firefox 執行任何帶有 JavaScript 的網頁,如果發生錯誤或者異常,Venkman 都會自動打開 這個 出錯的腳本文件。當然前提是你已經對 Venkman 進行過設置了(Debug -> Error Triger -> Stop For Errors 和 Debug -> Throw Triger -> Sotp For Exceptions)。
第三步,用 Friefox 打開這個 Test.html 文件。你就會看到 Venkman 報告類似于如下的錯誤:
Stopped for error handler.
#0: function test(str=string:"Hello") in
001: function test(str) {
002: alert(Str);
Continuing from error handler.
Exception ``ReferenceError: Str is not defined'' thrown from function test(str=string:"Hello") in
[e] message = [string] "Str is not defined"
Stopped for thrown exception.
#0: function test(str=string:"Hello") in
001: function test(str) {
002: alert(Str);
Continuing from thrown exception.
Error ``ReferenceError: Str is not defined'' [xs] in file ``
其中可以很清除的看到 Str 是未聲明過的。
呵呵,這個 JavaScript 調試器的確很強大,在這里只不過做一個簡單的介紹罷了。
實踐指南
原文:Spring Web Flows - A Practical Guide
Author: Erwin Vervaet (Mail To)
translator: Dorian Shi (Mail To)
這篇文章介紹了 Spring Web Flows。用實例來說明基于 Web Flow 的原理。文章也提供了一個使用 Web Flow 和 Spring 框架來構建 Web 應用的實踐指南.
假定讀者已經了解一些 J2EE Web 應用、XML、Spirng 框架,當然還有 Spring 的 Web MVC 框架。你可以查看資源來了解這些信息。
在一個 Web 應用程序中傳統的定義一個頁面流程是一個一點也不直觀的過程。像 Struts 和 Spring 這樣的框架促使你把頁面流程放進單獨的控制器和視圖中。舉個例子:Struts 會把請求映射到一個 Action。這個 Action 會選擇一個視圖并轉發到這個視圖。雖然這是一個簡單并且實用的方法,但它有一個主要的缺點:到 Action 的定義文件 struts-config.xml 中看看,Web 應用程序的所有頁面流程一點也不清晰。因為 Action 不能簡單的被重用,靈活性同樣也會遭到損害。
Spring Web MVC 框架提供了一個細微的高級功能:表單控制器執行一個預先定義好的工作流。有兩種控制器提供了這一特性:SimpleFormController 和 AbstractWizardFormController。然而,這些仍舊是一種一般化的硬編碼的工作流概念。
到這里就要引入 Spring 的 Web Flow 了。它允許你用清晰簡單的方式展現 Web 應用的頁面流程。就像我們要看到的一樣,他有許多有點:
現在 Web Flow 有足夠的能力表示由一系列 State 組成的一個 Web 流程。State 是事件發生的流程點:舉例來說就是顯示一個視圖或者執行一個 Action。每個 State 有一個或多個 transitions ,他們習慣于從一個 State 轉到另一個 State 。一個 transitions 被一個 Event 所觸發。 為了讓你對 Web 流程有一個大概的印象,下面這段 XML 定義了一個 Web 流程,大致等效于實現一個 SimpleFormController 的工作流 。對于這個 Web 流程的原理將在本文的稍后詳細說明。
熟悉業務過程管理(BPM) 的讀者將認識到 Web 流程是普通工作流的一個特例,所以他們在理論上可以使用像 JBMP(請查看資源) 來實現一般化的 BMP 系統。既然簡單是 Spring Web Flow 的重要設計目的,所以它不會去使用這種一般化的工作流引擎。在我們 Web 應用中,我們會用一個簡單的 Web 流程來描述一個頁面的流程。
本文的剩余部分會用一個實例來說明這方面內容,可以使用這個連接來下載源代碼:PhoneBook.war.zip 。現在下載并解壓縮這個文件可能是個好注意,它能夠在你閱讀文章的時候幫助你學習。
實例是一個使用 Spring Web Flow 的電話簿應用程序,我們將使用圖解的方式來說明他的功能意圖。這是一個典型的公司內網的應用程序,你會發現大部分功能可能你已經熟悉他的概念了。他主要允許你使用一些標準來查找公司的某位職員。一旦當你發現了某個適當地人,你就可以更進一步的查看他的信息,像電話號碼、辦公桌位置、他的經理是誰、他的同事有那些等等。圖1的草圖描繪了這個電話簿應用程序的基本需求和頁面流程。
圖 1. 實例概覽
就像草圖描述的那樣,應用程序實際有兩個模塊組成: Search 模塊允許我們查找一個我們要的人,而 Detail 模塊則顯示查找到這個人的詳細信息。Search 模塊將會使用 Detail 模塊來顯示查詢結果中某人的詳細信息。草圖同樣顯示了我們可以在明細頁直接訪問被查人同事的明細。這意味著 Detail 模塊可以遞歸使用 Detail 模塊來顯示同事的明細。
文章稍后,將看到我們可以在一個單獨的 Web 流程中定義各個模塊。這意味著我們會有兩個流程:一個 Search 流程和一個 Detail 流程。
因為本文的焦點是實現應用程序的 Web 接口,所以我們將會提供包含了硬編碼啞數據的基本業務層。領域對象被包含在com.ervacon.springframework.samples.phonebook.domain 包中。我們有 4 個業務類:
確定好業務功能性后,我們準備使用 Spring Web Flow 來為電話簿應用程序開發 Web 接口。
在我們開始使用 Web Flow 之前,我們需要配置一個基本的 Spring Web 應用程序。要做的第一件事是我們必須確定在 /WEB-INF/lib 目錄下有我們所要的 jar 文件。一個 Spring Web Flow 的應用程序需要4個jar在類路進下: 包含 Spring 框架自身的 Spring.jar;包含 Web Flow 控制器實現的 webflow.jar; 記錄日志所需的 commons-logging.jar 和用來讀取和分析 Web Flow XML 文件的 jdom.jar;
由于這將是一個標準的 J2EE Web 應用程序,所以需要在 /WEB-INF 目錄下有一個 web.xml 部署文件。下面是此部署描述文件的代碼,它描述了如下事物:
在 Spring MVC 應用程序中,我們需要一個 Spring 應用程序上下文。它是你在應用程序上下文中定義業務對象最好的地方。這樣你就能夠干凈的區分你的業務對象和任何 Web 應用工件(artifacts)。讓我們跟隨這個練習創建一個 /WEB-INF/applicationContext.xml 文件來定義我們的業務門面:phoneBook Bean。
我們需要在 web.xml 中適當的定義 Dispatcher Servlet。 這個 Servlet 將會以默認得方式讀取 /WEB-INF/ServletName-servlet.xml 配置文件。在我們的例子中將會是 /WEB-INF/phoneBook.xml。我們唯一需要配置的事是一個 View Resolver。這個 View Resolver 負責將視圖名(如:"criteria")解析成真實的視圖路進(如:/WEB-INF/JSP/criteria.jsp)。下面這段使用的是 InternalResourceViewResolver。 所以在我們的實例中,所有頁面的位置將會在 /WEB-INF/jsp 目錄中。
我們假設所有其他的 Dispatcher Servlet 配置為默認值。這意味著我們將使用一個簡單的 BeanNameUrlHandlerMapping 來定位將要處理請求的控制器。對于如何配置 Dispatcher Servlet 的詳細信息請參考 Spring 的參考文檔(查看資源)。
待續……
一進銀行,就看到辦理業務的人很多,隨即找了一條比較人少的隊伍排著。
雖然我這隊在我之前才6個人,沒想到還是排了將近50分鐘。
在排隊的過程中,始終有人埋怨銀行工作人員業務不熟悉,等等之類的話。
可我始終想,排歸排,等歸等,畢竟我們中國人多,很多客戶對銀行的業務也不知道,
還有甚者盡然連密碼設沒設都不知道,這些都是造成業務處理慢的原因。
……
總算輪到我了,告知銀行工作人員說我要辦理轉賬授權后,她向我指指左前方到個人理財中心去辦理。
我的天,我頓時傻掉了,我排了近50分鐘,難道就為了這一句指路話?
無奈,隨又到個人理財中心等了近30分鐘辦理了轉賬授權業務。其間聽到前面的人也都是這么過來的……
辦理完業務隨后打量了一番銀行,看見裝修豪華的業務大廳除了若干監視器外竟然沒有一個導向牌。
還有,工作人員的灰色面孔(好像欠他100萬似的)。
這些都是導致客戶體驗非常糟糕的直接原因。
我之前都是通過自動取款,存款,轉帳機來辦理自己的需求的。
即使有些業務(如:購買基金),都是在其他銀行辦理的。
至少其他銀行在客戶進門后,讓客戶自動提取一張自己業務需求的號碼紙,
隨即播報號碼到那個柜臺去辦理業務。
類似這種方式就能解決這方面的客戶體驗問題。
當然還有其他的一些問題亟待解決。
我不希望在若干年的將來外資銀行把中國銀行打的一敗涂地……
環境: EMMA v2.0,build4127
OS Windows 2003 server
JDK v1.4.2
EMMA提供兩種使用模式,一個是指令模式(command mode)另外一個是使用Ant。
將下載下來的JAR(emma.jar&emma_ant.jar)復制到你classpath所在的JRE目錄
ex.E:\Program\J2SDK\jre\lib\ext
然后在命令行下輸入Java emmarun,會看到它的使用方法和如何配參數。如果沒看到,那
說明沒有把剛才兩個Jar包放在classpath中。
隨后寫一個Hello world程序
編譯HelloWorld.java
javac -d classes -g HelloWorld.java
運行HelloWorld
java -cp classes HelloWorld
現在加入EMMA
java emmarun -cp classes HelloWorld
可看到類似如下輸出:
Constructor
Hello World!
EMMA: writing [txt] report to [F:\我的文檔\EMMA\coverage.txt] ...
你可以看一下執行后在你目錄中的coverage。txt文件
內容類似如下:
[EMMA v2.0.4217 report, generated Thu Oct 28 09:09:45 CST 2004]
-------------------------------------------------------------------------------
OVERALL COVERAGE SUMMARY:
[class, %] [method, %] [block, %] [line, %] [name]
100% (1/1) 100% (2/2) 100% (14/14) 100% (6/6) all classes
OVERALL STATS SUMMARY:
total packages: 1
total classes: 1
total methods: 2
total executable files: 1
total executable lines: 6
COVERAGE BREAKDOWN BY PACKAGE:
[class, %] [method, %] [block, %] [line, %] [name]
100% (1/1) 100% (2/2) 100% (14/14) 100% (6/6) default package
-------------------------------------------------------------------------------
這些數據蠻難看懂的,不過EMMA提供三種輸出格式 txt,html,xml
接下來看看可以加入原代碼的一份html報表。
這樣來執行:
java emmarun -r html -sp . -cp classes HelloWorld
//-sp 代表源文件的所在地,我的源文件在當前目錄,故用 "."
執行后你就可以看到EMMA生成了一個叫coverage的目錄。在里面的許多html就是帶源文件的一份報表。如下所示:
這份東西還是蠻詳細的,可以看到那些東西或者說那些狀況沒有考慮到的。
至于ant的實現以后要用時在說吧!畢竟這東西好玩歸好玩,暫時還用不上。^_^
用了一下,發現滿好用的。
Download: http://www.dreamprojections.com/SyntaxHighlighter/
Examples: http://www.dreamprojections.com/SyntaxHighlighter/Examples.aspx
遺憾的是這個引擎沒有 Java 的高亮。
所以自己添加了一個解析 Java 的類。
隨后在使用的過程中又發現,代碼段只能打開,而不能收起。
故又修改了他的核心代碼。
現把這兩個 JS 文件放上來^_^
shCore.js : http://m.tkk7.com/Files/dorian/shCore.zip
shBrushJava.js : http://m.tkk7.com/Files/dorian/shBrushJava.zip