`
DLevin
  • 浏览: 37169 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Tomcat中Jsp使用没有命名空间类的问题

    博客分类:
  • Tips
阅读更多

问题重现:

今天一刚开始学Java的同学在接触Jsp的时候遇到了一个比较诡异的问题,他在JSP中始终无法使用自己写的类。简单的演示问题代码:

 

//没有定义包名

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>

 

出现的错误提示:

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呢?因为我是想强调一下他没有定义包名的习惯,所以才会出现这个问题,而在Java中不定义包名是一个非常不好的编程习惯。这个问题本身是可以通过定义自己的包名,然后在JSP文件中导入自己的包解决。

 

问题原因:

由于JSP文件在请求时动态的生成Servlet类,然后动态的编译新生成的Servlet类,并加载新编译出的Servletclass文件,运行相应的service方法,返回结果给客户端。根据栈信息可以知道问题出在了动态编译Servlet类的时候,而且是说MyDefaultClass无法被解析。

所以我猜测,可能是Tomcat在解析JSP文件的时候,没有发现有用户导入的类型(没有使用命名空间,因而无法导入包,也不需要加包名的前缀,导致Tomcat在解析JSP文件的时候无法自动感知到当前是引用了用户自定义的类的;也导致在编译的时候却能通过),所以在动态编译的时候没有设置ClassPath的值,然后导致了这个问题。然而对于这个“Bug”,Tomcat本身应该不会想不到,何况从逻辑上,默认的把/classes/lib的目录加入到ClassPath中去编译动态生成的Servlet类也是合理的,那么Tomcat为什么要这样做呢?我的猜测可能会有两点吧:1. Tomcat也认为不定义包名是非常不好的习惯,因而故意留下这个缺陷,以惊醒编程人员。2. 也有可能是出于性能的考虑,如果不加ClassPath应该是可以提升编译动态生成的Servlet类的速度的,因而只要不需要ClassPath的情况下,默认就不加。

分享到:
评论

相关推荐

    apache-tomcat5 jsp web服务器

    Apache Tomcat5是一款广泛使用的Java JSP(JavaServer Pages)和Servlet容器,它是一个开源的Web服务器,专门用于运行基于Java技术的应用程序。Tomcat5是Apache软件基金会Jakarta项目的一部分,提供了对Java EE...

    MyEclipse中配置tomcat

    在MyEclipse的工作空间中,打开`Servers`视图。在这里,右键点击空白处,选择“新建”并创建一个新的文本文档,命名为`tomcat.txt`。打开此文本文件,输入一行文本`path=tomcat`,这指示MyEclipse该去哪里查找Tomcat...

    Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门_Java_杨秀璋的专栏-CSDN博客1

    ### Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 #### 一、配置Tomcat 本文档将详细介绍如何配置Tomcat服务器,以便于开发和部署基于Java的Web应用程序。Tomcat作为一款开源的Servlet容器,主要用于运行...

    tomcat7.053

    这通过`Executor`命名空间在`server.xml`中配置。 10. **性能优化**:Tomcat 7.0.53提供了多种性能优化选项,如调整最大连接数、开启压缩、缓存静态资源等,以适应不同规模的Web应用需求。 11. **错误处理和日志...

    tomcat10 迁移工具

    在IT行业中,Tomcat是一个广泛使用的开源应用服务器,主要用于部署Java Servlet和JavaServer Pages(JSP)应用程序。随着技术的不断发展,Tomcat的版本也在不断更新。从Tomcat 9到Tomcat 10,虽然看似只是一次小版本...

    tomcat源码

    这部分源码涉及到如何管理和使用全局命名空间。 4. **Lifecycle**:在Tomcat中,每个组件都有一个生命周期,包括初始化、启动、停止和销毁等阶段。源码中关于生命周期的管理可以帮助我们理解组件如何正确地启动和...

    apache-tomcat9

    这可能意味着在尝试使用Tomcat 10部署Geoserver时遇到了问题,具体原因可能涉及到版本兼容性、配置错误或是其他未明的问题。在实际操作中,如果遇到类似情况,通常需要检查Geoserver的官方文档,确认其支持的Tomcat...

    apache-tomcat-10.0.20

    7. ** Jakarta EE 9兼容性**: Tomcat 10.0系列致力于与Jakarta EE 9规范兼容,这是Java EE向Jakarta EE过渡的一部分,涉及到命名空间和包名的更改。 8. **错误处理和日志记录**: Tomcat 10.0可能包含改进的错误报告...

    Eclipse中创建Web Maven Project并部署到Tomcat中

    可以选择“Use Tomcat installation”(让Eclipse管理Tomcat的部署目录)或“Use workspace metadata”(让Eclipse创建一个工作空间中的部署副本)。 3. 将项目拖放到Tomcat服务器上,或者在“Servers”视图的右键...

    tomcat-5.0.28绿化版

    【压缩包子文件的文件名称列表】:jakarta-tomcat-5.0.28这个文件名是Tomcat 5.0.28的主要打包文件,Jakarta是早期Tomcat的项目命名空间,这表明该文件包含了Tomcat服务器的所有必要组件,包括核心引擎、Catalina...

    apache-tomcat-7.0.50

    Apache Tomcat 7.0.50 是一个广泛使用的开源软件,主要用于运行Java Servlet和JavaServer Pages(JSP)的应用程序。它是Apache软件基金会的一部分,实现了Sun Microsystems(现为Oracle Corporation)制定的Java ...

    Linux apache-tomcat-5.5.33.tar.gz

    Apache Tomcat是一个开源的软件应用服务器,主要用于部署Java Servlet和JavaServer Pages(JSP)应用程序。在Linux环境中,Apache Tomcat扮演着一个轻量级Web服务器的角色,它能够解析HTTP请求并执行Java代码来生成...

    tomcat5.5.28支持EL 表达式的解决方法.

    这主要是因为Tomcat的版本与所支持的JSP版本之间可能存在不匹配,导致开发者在使用EL时遇到各种问题,如语法错误或功能受限。 ### 解决方案:配置Web应用的web.xml 为了使Tomcat 5.5.28支持EL表达式,首先需要修改...

    tomcat 6.0 64位

    6. **work目录**:JSP编译后的类文件和临时文件存放的地方。 7. **temp目录**:系统运行时生成的临时文件。 **关于Tomcat 6.0的关键知识点:** 1. **Servlet 2.5支持**:Tomcat 6.0基于Servlet 2.5和JSP 2.1规范,...

    apache-tomcat-6.0.32

    然而,由于Apache Tomcat 6.0.32已经过时,不再接收安全更新,因此在生产环境中使用可能会存在安全隐患。为了确保系统的安全性和稳定性,建议升级到更现代的Tomcat版本,比如8.x或9.x,它们提供了更好的性能和对新...

    MyEclipse8.5安装以及TomCat配置

    - 在 MyEclipse 中创建一个新的 Web 项目,例如命名为 `LxxFirstWeb`。 - 在项目的 `WebRoot` 文件夹下创建一个新的 JSP 文件,例如 `MyJsp.jsp`,并在文件中输入文本 “This is my first web page!”。 - 选择已...

    tomcat的session共享所需jar包

    2. **共享内存(Shared Memory)**:Tomcat可以配置使用共享内存来存储session数据,所有服务器实例都能访问同一内存空间。这种方式速度快,但受制于服务器内存大小,且在服务器重启时会丢失数据。 3. **数据库存储...

    jsp实现文件和图片上传

    需要注意的是,要确保服务器有足够的磁盘空间,并考虑安全性和文件命名冲突问题。 5. **反馈结果**:Servlet处理完文件上传后,可以将结果通过重定向或转发返回给JSP,显示上传状态。 ### 五、示例代码片段 ```...

    jsp手动环境IIS+TOMCAT+JDK整合.docx

    ### JSP手动环境IIS+TOMCAT+JDK整合详解 #### 一、系统约定与准备工作 在开始IIS+Tomcat+JDK的整合之前,首先要明确系统的约定及所需的准备工作。 **系统约定:** - 环境软件下载存放位置:`X:\Server_Tools` - ...

    最新virgo-tomcat-server

    4. **隔离性**:每个模块都在自己的命名空间内运行,互不干扰,提高了系统的稳定性和安全性。 5. **强大的管理工具**:Virgo提供了一套完整的管理工具,可以方便地监控和控制服务器的状态和应用的生命周期。 总的来...

Global site tag (gtag.js) - Google Analytics