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

老紫竹 2008-01-07 09:46:25
加精
原文地址 http://www.java2000.net/viewthread.jsp?tid=223
这里帖子不能编辑,如有建议或修正,我会在那面更改。
-----------------------------------------------------------------

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

比如你要做一个论坛,像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 没有判断每个方法的返回值,造成程序隐患
...全文
1130 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxilun 2012-04-04
  • 打赏
  • 举报
回复
嗯,学习方法很重要,一定要会学习。
yueniao1234 2008-06-21
  • 打赏
  • 举报
回复
不错的,最后的说的真的很受用啊
hq050607127 2008-05-31
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 servaywong 的回复:]
very well.我在学习的过程中碰到楼主提到的很多问题
[/Quote]
今天还为此郁闷了好久了!!
servaywong 2008-05-31
  • 打赏
  • 举报
回复
very well.我在学习的过程中碰到楼主提到的很多问题
cooldry 2008-05-31
  • 打赏
  • 举报
回复
顶完再具体看是什么内容...
cooldry 2008-05-31
  • 打赏
  • 举报
回复
好文章,有空请吃饭,开始报名了!
地下室小红叔 2008-05-30
  • 打赏
  • 举报
回复
占位回头看
alps1624 2008-05-30
  • 打赏
  • 举报
回复
学习中,呵呵……
steven_sk 2008-05-30
  • 打赏
  • 举报
回复
收藏了,慢慢研究.
ilstar 2008-05-30
  • 打赏
  • 举报
回复
恩 确实是一些经常碰到的问题 很实用
pcboy1982 2008-05-30
  • 打赏
  • 举报
回复
mark.
慢慢看
HELIANGLEIBLUEICE 2008-05-30
  • 打赏
  • 举报
回复
还是可以的,这些东西我们开发中也遇到过
kofeeee 2008-05-29
  • 打赏
  • 举报
回复
up
db_30 2008-05-29
  • 打赏
  • 举报
回复
老哥真是个好人啊!希望多指教和关心我的请教!
oogamiyiqilou 2008-05-29
  • 打赏
  • 举报
回复
确实首先应该培养自己的查找问题的能力
caibaoying 2008-05-29
  • 打赏
  • 举报
回复
.....这些问题一般自己做个项目后```过后一般不会再犯了````就是犯了`也会搞
limon758 2008-05-29
  • 打赏
  • 举报
回复
mark
lovewds2002 2008-05-29
  • 打赏
  • 举报
回复

你顶我也顶.
大家顶,才是真的顶!
egxsun 2008-05-28
  • 打赏
  • 举报
回复
up
songfuqiang 2008-05-28
  • 打赏
  • 举报
回复
顶下
加载更多回复(20)
abstract (关键字) 抽象 ['æbstrækt] access vt.访问,存取 ['ækses]'(n.入口,使用权) algorithm n.算法 ['ælgәriðm] Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æpli'keiʃәn]' (application crash 程序崩溃) arbitrary a.任意的 ['ɑ:bitrәri] argument n.参数;争论,论据 ['ɑ:gjumәnt]'(缩写 args) assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后成为关键字) associate n.关联(同伴,伙伴) [ә'sәuʃieit] attribute n.属性(品质,特征) [ә'tribju:t] boolean (关键字) 逻辑的, 布尔型 call n.v.调用; 呼叫; [kɒ:l] circumstance n.事件(环境,状况) ['sә:kәmstәns] crash n.崩溃,破碎 [kræʃ] cohesion 内聚,黏聚,结合 [kәu'hi:ʒәn] (a class is designed with a single, well-focoused purpose. 应该不止这点) command n. 命令,指令 [kә'mɑ:nd](指挥, 控制) (command-line 命令行) Comments [java] 文本注释 ['kɒments] compile [java] v.编译 [kәm'pail]' Compilation n.编辑[,kɒmpi'leiʃәn] const (保留字) constant n. 常量, 常数, 恒量 ['kɒnstәnt] continue (关键字) coupling 耦合,联结 ['kʌpliŋ] making sure that classes know about other classes only through their APIs. declare [java] 声明 [di'klєә] default (关键字) 默认值; 缺省值 [di'fɒ:lt] delimiter 定义符; 定界符 Encapsulation[java] 封装 (hiding implementation details) Exception [java] 例外; 异常 [ik'sepʃәn] entry n.登录项, 输入项, 条目['entri] enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, 陈列 [ig'zibit] exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,框架 ['freimwә:k] Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements (关键字) 实现 ['implim

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧