新手提升JSP技術能力的一點建議
一 如何快速提升自己的技術能力
做項目。 自己假設的也算。
比如你要做一個論壇,像CSDN 這樣的。 在製作過程中,你會遇到非常多的困難。
你的代碼結構也會變動很多次,我說的是結構,代碼就變動更多了。
遇到問題,首先到搜尋引擎上去搜尋,我只去google,可以確定一點,
你絕對不是第一個遇到這個問題的人,也不是最後一個。
只有自己通過努力思考,搜尋,最終掌握的東西才真正是自己的。
自己實在想不通,也找不到(因為不會找,而不是沒有),再到論壇,QQ什麼的,找其它人幫忙
問題也會局限在某個技術點上,畢竟你已經自己思考過了,別人稍微一點撥,你就會豁然開朗的。
那些直接問,這個功能怎麼做啊的,基本都不是自己認真思考過的,否則他只會問,誰知道XXX的地方,怎麼弄才能達到YYY的效果?
另外,英文是不不可少的,看到那麼多人帶著異常來求救,真是....
二 關於JSP的調試
授之以魚不如授之以漁,掌握有效調試方法才是正道。
NullPointerException
ClassNotFoundException
這2個出現的頻率太高了,如果他能仔細看的話,異常資訊連那一行都給你指出來了,自己直接去看原始碼不就行了
以tomcat為例。 jsp檔案會先被tomcat的 jspc 翻譯成 .java檔案,一個servlet, 然後再javac 編譯成.class檔案
找到錯誤
你的錯誤資訊一般有2種大類
1 原始碼錯誤
複製內容到剪貼簿
代碼:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 24 in the jsp file: /viewthread.jsp
Syntax error, insert ";" to complete Statement
21: }
22: if(post.getIdParent()>0){
23: %>
24: <script type="text/javascript">self.location="viewthread.jsp?tid=<%post.getIdParent()%>";</script>
25: <%
26: return;
27: }
Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:85)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.
可以看到在第24行,出現了無法編譯的問題,經檢查,那個<%post.getIdParent()%>少了等號 <%=post.getIdParent()%>
這類錯誤因為錯誤資訊和原始碼逐行對應,所以比較好找。
2 運行錯誤
複製內容到剪貼簿
代碼:
HTTP Status 500 -
--------------------------------------------------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:395)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NullPointerException
java.math.BigDecimal.compareTo(BigDecimal.java:2406)
com.goodtp.sales.html.Order.getOrderItem(Order.java:146)
com.goodtp.sales.html.HtmlOrder.saveOrder(HtmlOrder.java:214)
org.apache.jsp.saler.saveOrder_jsp._jspService(saveOrder_jsp.java:180)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
這個錯誤最常見,請注意如下這一行
org.apache.jsp.saler.saveOrder_jsp._jspService(saveOrder_jsp.java:180)
錯誤在 saveOrder_jsp.java 的 180行, 怎麼找到這個檔案呢
這個檔案就在 tomcat/works/ 目錄下面,你可以在這個目錄下面搜尋檔案,就能找到saveOrder_jsp.java
開啟後,找到 180行,就可以看到到底是哪裡出了問題了。
對於eclipse整合Tomcat調試的, 這個檔案不在 tomcat目錄下面,而是在
eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work
實在找不到,就全盤搜尋,一般也就1-3分鐘的事情。
問題找到了,怎麼調試呢?
我們假設你沒有用過log工具,我們現在就用最簡單的 System.out.println() 來做
比如NullPointerException, 那證明那一行的調用方法的對象是null,
int id = order.getId(); //
你可以修改成
System.out.println("order="+order);
int id = order.getId();
運行,你就能在控制台看到
order=null 的輸出,從而確定 order並沒有被正確的賦值。
然後以這裡為起點,逐步往前面尋找,看看到底是哪裡給order賦值的。比如找到
Order order = orderService.find(orderId);
這也許是因為 orderId對應的order根本沒有啊,也許是orderId取錯了參數。
修改為
System.out.println("orderId="+order);
Order order = orderService.find(orderId);
運行,輸出為
orderId=35
查看資料庫,如果不存在35號資料,可以肯定參數錯誤,如果存在,可以肯定是 orderService.find() 方法裡面出現了問題。查進取
這就是最基本的jsp調試方法.
對於java應用,比如Swing, Eclipse提供了整合單步調試工具,就更方便了。
隨著經驗的積累,你會很快的找到問題的原因,而且同樣的錯誤,你也會降低極大的再次出現的幾率。
三 ClassNotFoundException 的解決方案
classpath問題,對於jsp,最大的可能是因為你的jar沒有放對地方,對於tomcat 有2個地方可放
a) tomcat\shared\lib 目錄 tomcat 5.5版本 或者 tomcat\lib目錄 tomcat6版本
b) 你的應用的 WEB-INF\lib 目錄 推薦放在這裡。
如果你不確認需要哪些jar,就把hibernate隨包帶的都複製過去就行了。 雖然不推薦,但對於初學者,也是一個臨時的解決方案
四 最常見的幾種問題和解決方案
1 字串的== 判斷,應該用 equals() 進行
2 ResultSet 使用前忘了 rs.next();
3 資料庫連接沒有放在 finally{} 裡面關閉
4 沒有判斷每個方法的傳回值,造成程式隱患
來源:http://www.java2000.net/viewthread.jsp?tid=223