上善若水
          In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra
          posts - 146,comments - 147,trackbacks - 0

          問題重現(xiàn):

          今天一剛開始學(xué)Java的同學(xué)在接觸Jsp的時(shí)候遇到了一個(gè)比較詭異的問題,他在JSP中始終無法使用自己寫的類。簡(jiǎn)單的演示問題代碼:

           

          //沒有定義包名

          public class MyDefaultClass {

          }

           

          //index.jsp文件

          <%@ page language="java" contentType="text/html; charset=ISO-8859-1"

              pageEncoding="ISO-8859-1"%>

          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

          <html>

          <head>

          <title>Insert title here</title>

          </head>

          <body>

          <%

              MyDefaultClass cls = new MyDefaultClass();

          %>

          Load successful

          </body>

          </html>

           

          出現(xiàn)的錯(cuò)誤提示:

          type Exception report

          message

          description The server encountered an internal error () that prevented it from fulfilling this request.

          exception

          org.apache.jasper.JasperException: Unable to compile class for JSP:

           

          An error occurred at line: 12 in the jsp file: /index.jsp

          MyDefaultClass cannot be resolved to a type

          9: <body>

          10:

          11: <%

          12:     MyDefaultClass cls = new MyDefaultClass();

          13: %>

          14:

          15: Load successful

           

           

          An error occurred at line: 12 in the jsp file: /index.jsp

          MyDefaultClass cannot be resolved to a type

          9: <body>

          10:

          11: <%

          12:     MyDefaultClass cls = new MyDefaultClass();

          13: %>

          14:

          15: Load successful

           

           

          Stacktrace:

                  org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)

                  org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)

                  org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)

                  org.apache.jasper.compiler.Compiler.compile(Compiler.java:349)

                  org.apache.jasper.compiler.Compiler.compile(Compiler.java:327)

                  org.apache.jasper.compiler.Compiler.compile(Compiler.java:314)

                  org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)

                  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)

                  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)

                  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)

                  javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

           

          解決方案:

          為什么要特別提示他是剛開始接觸Java呢?因?yàn)槲沂窍霃?qiáng)調(diào)一下他沒有定義包名的習(xí)慣,所以才會(huì)出現(xiàn)這個(gè)問題,而在Java中不定義包名是一個(gè)非常不好的編程習(xí)慣。這個(gè)問題本身是可以通過定義自己的包名,然后在JSP文件中導(dǎo)入自己的包解決。

           

          問題原因:

          由于JSP文件在請(qǐng)求時(shí)動(dòng)態(tài)的生成Servlet類,然后動(dòng)態(tài)的編譯新生成的Servlet類,并加載新編譯出的Servletclass文件,運(yùn)行相應(yīng)的service方法,返回結(jié)果給客戶端。根據(jù)棧信息可以知道問題出在了動(dòng)態(tài)編譯Servlet類的時(shí)候,而且是說MyDefaultClass無法被解析。

          所以我猜測(cè),可能是Tomcat在解析JSP文件的時(shí)候,沒有發(fā)現(xiàn)有用戶導(dǎo)入的類型(沒有使用命名空間,因而無法導(dǎo)入包,也不需要加包名的前綴,導(dǎo)致Tomcat在解析JSP文件的時(shí)候無法自動(dòng)感知到當(dāng)前是引用了用戶自定義的類的;也導(dǎo)致在編譯的時(shí)候卻能通過),所以在動(dòng)態(tài)編譯的時(shí)候沒有設(shè)置ClassPath的值,然后導(dǎo)致了這個(gè)問題。然而對(duì)于這個(gè)“Bug”,Tomcat本身應(yīng)該不會(huì)想不到,何況從邏輯上,默認(rèn)的把/classes/lib的目錄加入到ClassPath中去編譯動(dòng)態(tài)生成的Servlet類也是合理的,那么Tomcat為什么要這樣做呢?我的猜測(cè)可能會(huì)有兩點(diǎn)吧:1. Tomcat也認(rèn)為不定義包名是非常不好的習(xí)慣,因而故意留下這個(gè)缺陷,以驚醒編程人員。2. 也有可能是出于性能的考慮,如果不加ClassPath應(yīng)該是可以提升編譯動(dòng)態(tài)生成的Servlet類的速度的,因而只要不需要ClassPath的情況下,默認(rèn)就不加。

          2010-09-22

          posted on 2011-07-20 23:08 DLevin 閱讀(892) 評(píng)論(0)  編輯  收藏 所屬分類: Core Java
          主站蜘蛛池模板: 宜昌市| 香港| 峡江县| 五寨县| 原平市| 浪卡子县| 祁阳县| 宁城县| 临桂县| 手游| 松溪县| 文登市| 宣威市| 耒阳市| 平远县| 富阳市| 浑源县| 大化| 黑龙江省| 繁昌县| 东光县| 嵩明县| 广东省| 莱阳市| 天水市| 阿克陶县| 普格县| 普兰店市| 宾川县| 海宁市| 资兴市| 满洲里市| 桃江县| 岐山县| 辽宁省| 平果县| 保山市| 普兰县| 孟村| 阜康市| 嵩明县|