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

简介:

问题重现:

今天一刚开始学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的情况下,默认就不加。

相关文章
|
Java 应用服务中间件 Apache
Tomcat 发布jsp报错
Tomcat 发布jsp报错
|
SQL Java 关系型数据库
[笔记]【IDEA2020.2 Ultra】JSP+Servelt+JDBC+Tomcat Helloworld+增删改查(二)
[笔记]【IDEA2020.2 Ultra】JSP+Servelt+JDBC+Tomcat Helloworld+增删改查(二)
|
8月前
|
Java 数据库 数据安全/隐私保护
基于SSM框架实现管科类考研自我管理系统(分前后台spring+springmvc+mybatis+maven+jsp+jquery)
基于SSM框架实现管科类考研自我管理系统(分前后台spring+springmvc+mybatis+maven+jsp+jquery)
|
3月前
|
Java 应用服务中间件 Maven
idea+maven+tomcat+spring 创建一个jsp项目
这篇文章介绍了如何在IntelliJ IDEA中使用Maven和Tomcat创建一个JSP项目,包括配置Maven依赖、设置Tomcat服务器、编写JSP页面、创建控制器和配置文件,以及项目的运行结果。
276 0
idea+maven+tomcat+spring 创建一个jsp项目
|
8月前
|
自然语言处理 Java 应用服务中间件
从零手写实现 tomcat-09-servlet 处理类
该文是一个关于手写实现 Apache Tomcat 简化版的系列教程摘要。作者希望通过亲自实现一个简单的 Tomcat,来深入理解其工作原理。系列教程包括了从入门介绍到解析处理 WAR 包、与 SpringBoot 集成等多个步骤。文章介绍了 Servlet 的概念,将其比作餐厅服务员,负责处理网络请求和响应。文中还详细阐述了 Servlet 的处理流程,并通过实例解释了如何实现一个基础的 Servlet。最后,提到了如何根据请求 URL 进行调度和处理,并给出了迷你版 Tomcat(Mini-Cat)的开源地址。
|
5月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
6月前
|
算法 Java 应用服务中间件
开发与运维机制问题之在Tomcat的类加载机制中,如果BootstrapClassLoader没有加载成功类,Tomca如何解决
开发与运维机制问题之在Tomcat的类加载机制中,如果BootstrapClassLoader没有加载成功类,Tomca如何解决
42 0
|
8月前
|
Java 应用服务中间件
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
1718 1
|
Java 关系型数据库 MySQL
[笔记]【IDEA2020.2 Ultra】JSP+Servelt+JDBC+Tomcat Helloworld+增删改查(一)
[笔记]【IDEA2020.2 Ultra】JSP+Servelt+JDBC+Tomcat Helloworld+增删改查
107 0
|
XML Java 应用服务中间件
Jsp之二 tomcat安装配置使用
Jsp之二 tomcat安装配置使用
63 0