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