新手提升JSP技术能力的一点建议(转老紫竹)

来源:互联网 发布:js button value值 编辑:程序博客网 时间:2024/06/04 18:51

新手提升JSP技术能力的一点建议

一 如何快速提升自己的技术能力
做项目。 自己假设的也算。

比如你要做一个论坛,像CSDN 这样的。 在制作过程中,你会遇到非常多的困难。 
你的代码结构也会变动很多次,我说的是结构,代码就变动更多了。 
遇到问题,首先到搜索引擎上去搜索,我只去google,可以确定一点,

你绝对不是第一个遇到这个问题的人,也不是最后一个。 

只有自己通过努力思考,搜索,最终掌握的东西才真正是自己的。  
自己实在想不通,也找不到(因为不会找,而不是没有),再到论坛,QQ什么的,找其它人帮忙 
问题也会局限在某个技术点上,毕竟你已经自己思考过了,别人稍微一点拨,你就会豁然开朗的。 
那些直接问,这个功能怎么做啊的,基本都不是自己认真思考过的,否则他只会问,谁知道XXX的地方,怎么弄才能达到YYY的效果? 

另外,英文是不不可少的,看到那么多人带着异常来求救,真是.... 


二 关于JSP的调试

授之以鱼不如授之以渔,掌握有效的调试方法才是正道。

NullPointerException 
ClassNotFoundException 
这2个出现的频率太高了,如果他能仔细看的话,异常信息连那一行都给你指出来了,自己直接去看源代码不就行了 
以tomcat为例。 jsp文件会先被tomcat的 jspc 翻译成 .java文件,一个servlet, 然后再javac 编译成.class文件

  找到错误

  你的错误信息一般有2种大类
  1 源代码错误
查看复制到剪切板打印
  1. org.apache.jasper.JasperException: Unable to compile class for JSP:    
  2.   
  3. An error occurred at line: 24 in the jsp file: /viewthread.jsp   
  4. Syntax error, insert ";" to complete Statement   
  5. 21:   }   
  6. 22:   if(post.getIdParent()>0){   
  7. 23:     %>   
  8. 24: <script type="text/javascript">self.location="viewthread.jsp?tid=<%post.getIdParent()%>";</script>   
  9. 25: <%   
  10. 26:   return;   
  11. 27:   }   
  12.   
  13.   
  14. Stacktrace:   
  15.         at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:85)   
  16.         at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)   
  17.         at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.  
可以看到在第24行,出现了无法编译的问题,经检查,那个<%post.getIdParent()%>少了等于号 <%=post.getIdParent()%>
  
这类错误因为错误信息和源代码逐行对应,所以比较好找。

  2 运行错误
查看复制到剪切板打印
  1. HTTP Status 500 -    
  2.   
  3. --------------------------------------------------------------------------------   
  4.   
  5. type Exception report   
  6.   
  7. message    
  8.   
  9. description The server encountered an internal error () that prevented it from fulfilling this request.   
  10.   
  11. exception    
  12.   
  13. org.apache.jasper.JasperException   
  14.         org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)   
  15.         org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:395)   
  16.         org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)   
  17.         org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)   
  18.         javax.servlet.http.HttpServlet.service(HttpServlet.java:802)   
  19.   
  20.   
  21. root cause    
  22.   
  23. java.lang.NullPointerException   
  24.         java.math.BigDecimal.compareTo(BigDecimal.java:2406)   
  25.         com.goodtp.sales.html.Order.getOrderItem(Order.java:146)   
  26.         com.goodtp.sales.html.HtmlOrder.saveOrder(HtmlOrder.java:214)   
  27.         org.apache.jsp.saler.saveOrder_jsp._jspService(saveOrder_jsp.java:180)   
  28.         org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)   
  29.         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 没有判断每个方法的返回值,造成程序隐患
原创粉丝点击