国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java調試教程--服務器端調試

2019-11-18 14:24:50
字體:
來源:轉載
供稿:網友

  摘要

  服務器端調試(對于 Servlet,jsp 文件和 EJB 組件)非常困難。多個用戶可能會同時執行代碼,這會導致線程并行錯誤。缺省情況下,大多數服務器輸出一個事件和錯誤日志。大多數服務器會緩存這些日志以提高性能,所以在調試時需要暫時停止緩存。


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

  java調試教程(五)--服務器端調試

  SUN Laura Bennett

  回顧基礎知識

  服務器端調試(對于 Servlet,JSP 文件和 EJB 組件)非常困難。多個用戶可能會同時執行代碼,這會導致線程并行錯誤。缺省情況下,大多數服務器輸出一個事件和錯誤日志。大多數服務器會緩存這些日志以提高性能,所以在調試時需要暫時停止緩存。另外,某些 Servlet 引擎在啟動 JVM 時不顯示控制臺窗口。因此,也許在窗口中看不到輸出。某些情況下,也許可以配置引擎的設置來顯示控制臺。

  假如服務器日志中沒有錯誤清除指令,那么有兩種比較原始的方法來調試服務器代碼:log() 方法。Servlet API 在 GenericServlet 類中定義了一個方法,讓您可以將文本信息輸出到 Web 服務器使用的主日志文件中。將 log() 放到異常的catch 子句中以捕捉關于所發生錯誤的信息。

  out.PRintln() 方法。可以將調試參數 (debug=true) 添加到請求 JSP 文件或 Servlet 的 URL 結尾處。然后,當發生錯誤時,檢查代碼中的參數。當設置為真時,會打印出調試信息調試 Servlet 當引入 Servlet 時,許多調試器并不知道如何處理它們,因為它們不能在 Web 服務器外部運行。要將整個服務器裝入調試器環境并不可行。但 Servlet 技術的調試器支持已經改變了。要調試 Servlet,應該運行sun.servlet.http.HTTPServer(),然后在HTTPServer() 執行 Servlet 來響應用戶請求時進行監控。

  請注重,當調試 Servlet 時,會生成 Servlet 的一個實例;但是,對于每個對Servlet 的請求,都會創建一個新的線程。這就是線程錯誤的發源地。

  可以使用這些工具來調試 Servlet:

  Servletrunner 是 Sun 公司的 JSDK 附帶的免費調試工具。

  JDB 是另一個 JDK 附帶的免費命令行調試器。

  Alan R. Williamson 在他的著作 Java Servlets By Example中介紹了一個替代方法(請參閱參考資料)。這種技術要求只使用靜態方法來創建您自己的 Debug()類。僅當需要調試時才調用代碼中的這些方法。他認為使用 Debug() 類進程:

  可以讓您在需要時打印堆棧跟蹤。

  使用自我測量來轉儲特定 Bean 的變量。Bean 的上下文支持 toString() 方法,所以可以打印出 Bean 的內容,以獲取 Bean 實例的事務性狀態。

  使用閾值級別,以便使用不同的調試級別并顯示調試信息來自哪個類或方法。

  使用 System.out.println(),按照對進度的影響程度,它的干擾是最小的。IDE 會大大降低調試過程的速度,以便仔細調試并行錯誤。

  如上所述,Servlet 只被實例化一次,然后對于每個執行請求都創建一個單獨的線程。這個過程將導致多線程問題,并使調試過程變得更復雜。有關調試 Servlet 的具體信息,請參考第 6 章“多線程調試”。

  調試 JavaServer Pages (JSP) 文件

  調試 JSP 文件稍微復雜一些,因為 JSP 編譯階段正好發生在運行時之前。因此,您將錯失通常在傳統 Java 編程中發生的強類型檢查和語法檢查。另外,您所處理的是多層次編碼(JSP 轉換成 Servlet,Servlet 編譯成 .class 文件,然后生成 javascript或 Html 代碼),所以“代碼類型”混合使調試過程變得更為復雜。每一層轉換都可能出現不同類型的錯誤:

  第一層將 JSP 文件轉換成 Servlet。

  這個階段中發生的錯誤通常是由于 HTML 文件中原始 JSP 代碼的語法錯誤引起的。大多數情況下,通過目測 JSP 代碼就可以找到這些錯誤。檢查錯別字或遺漏的要害字符,如匹配的引號。JSP 引擎會報告這個階段中的錯誤。

  下一層將 Servlet 編譯成 .class 文件。

  Java 編譯器會報告這個階段中的任何錯誤。錯誤消息 Error: 500 表示語法錯誤。此處顯示的樣本表示省略了返回語句:


Error: 500
Internal Servlet Error:
org.apache.jasper.JasperException:
Unable to compile class for
JSPwork8080%2Fjspbook/_0005cretrieveParam_0002ejspretrieveParam_jsp_1.
java:19:
Return required at end of java.lang.String myMethod(java.lang.String).
public String retrieveParam(String someParameter)



  假如注重到存儲 JSP 文件的目錄中存在 .java 文件,但沒有相應的 .class 文件,那么請檢查 .java 文件來查找錯誤。

  最后一層真正運行 Servlet。

  因為 JSP 引擎將 Servlet 代碼放在一個大的 try/catch 塊中,所以可能會得到一個異常錯誤。其缺點是在普通的 RuntimeException() 超類下捕捉了所有異常;因此不能確定所生成的特定異常。要避免這個問題,將 out.flush()插入代碼,以便將輸出發送到瀏覽器。其它運行時錯誤可能會產生意想不到的結果,其原因可能是不正確的輸入數據或不正確的格式。

  在成功運行了原始代碼之后對 JSP 代碼進行更改時,應刪除 JSP 引擎工作目錄中的.java 和 .class 文件,以確保在測試更改時運行的是最新的代碼。

  因為 JSP 文件被編譯成 Servlet,所以會碰到多線程問題。JSP 文件提供了一個使用synchronize() 要害字的替代方法:SingleThreadModel。只要在 page 偽指令中輸入:


%@pageisThreadSafe="false"%。



  調試 Enterprise JavaBeans (EJB) 組件

  EJB 組件是服務器空間中最新的項目。它們使服務器端調試變得更復雜。您可能認為,工具沒有跟上技術的發展,然而事實并非想像中那樣糟;它們正在迎頭趕上。 導致 EJB 組件很難調試的原因是它們在容器中運行,這迫使您還要將容器裝入調試器。問題是并非所有容器都是用 Java 代碼編寫的,這就使裝入容器變得不太可行。 您會碰到的一些問題是:

  根據 EJB 容器生成的類與 EJB 規范不是處于一個級別。假如沒有針對最新的類來編譯類,就會發生這種情況。運行編譯檢查器來解決這個問題。

  用戶錯誤。請確認您使用了正確的命令來訪問后端系統。

  EJB 容器必須符合 J2EE 源代碼,并且在交付之前經過了完整測試。這個問題并非總是發生。

  以下是一些提示: 某些 EJB 容器有調試環境,可以使用這些調試環境來實時單步調試代碼。 使用數據庫的日志文件以便幫助跟蹤問題。

  檢查生成的 Java 文件。某些容器工具可以讓您保留它們,即使已經將它們編譯成二進制類。

  假如以上操作都失敗,使用 System.out.println() 是對調試 EJB 并行問題干擾最小的方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沛县| 青田县| 南汇区| 崇左市| 昆明市| 柳河县| 巴林右旗| 抚州市| 元朗区| 吉木萨尔县| 高陵县| 台北市| 长宁县| 泽库县| 曲水县| 佛教| 恭城| 邳州市| 丰原市| 司法| 崇信县| 繁峙县| 桦川县| 通辽市| 庆阳市| 翁牛特旗| 汉阴县| 延寿县| 界首市| 遂溪县| 肥城市| 凤台县| 辉县市| 普兰店市| 九寨沟县| 长沙县| 绥德县| 辽宁省| 合阳县| 长海县| 嘉峪关市|