昨天,在看JSP页面包含的元素(JSP指令,生命,表达式,动作等)时,拷贝了一个别人的例子来在Myeclipse里运行,结果出现了如下的缺类错误:

多调试两次也会出现如下无法编译的错误:

具体代码如下:

 <%@ page language="java" import="java.util.Calendar" pageEncoding="UTF-8"%>
<%!
String getHello(String name)
{
return "Hello" +name + "!";
}
%> <% Calendar now = new Calendar.getInstance(); %> <html>
<head> <title>hello TwoTwo</title> </head>
<body>
<h1>
<%=getHello("Bonnie") %>
<h1>
<%
if(now.get(Calendar.AM_PM == Calendar.AM))
{
早上好!
}else{
下午好!
} %> </body>
</html>

分析了上面两个错误原因发现,他的意思是我没有引入java.util.Calendar这个类,才导致了后面使用时找不到,所以报出编译不通过缺类错误,可一看代码我的确是引用了呀,再去百度一下其他可能相关的原因,有说可能是编码不一致,所以就去右击该JSP文件,找到属性然后去修改他的编码和d代码中的一致,再去试着运行,还是不行,同样的问题。然后再看看代码中的不同之处,我是后面自己创建了一个JSP页面,所以开头是:

<%@ page language="java" import="java.util.Calendar" pageEncoding="UTF-8"%>

而原文中的开头是:

<%@page contentType="text/html;charset=GBK" language="java" import="java.util.Calendar"%>

对比不同之处就是一个使用了属性:pageEncoding,另一个使用了属性:contentType,所以又去百度了这两者的区别:

关于JSP页面中的pageEncodingcontentType两种属性的区别:

pageEncoding是jsp文件本身的编码,contentType的charset是指服务器发送给客户端时的内容编码。JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页,用的是contentType。

第一阶段是jsp编译成java

它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

第二阶段是由JAVAC的JAVA源码至java byteCode的编译

不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。

第三阶段是Tomcat(或其的application container)载入和执行阶段二来的

JAVA二进制码输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效contentType,pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。

jsp文件不像.java,.java 在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是BIG5或者MS950。而一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。

为了解决无法编译的情况,还是将两者设置的一样吧,所以就都使用了可以编译成功的contentType=“text/html;charset=GBK”,再去编译运行,还是报同样的错误,晕死!!!

排除了这个原因,再往其他方向考虑。

换个思路后想着,是因为在编译的时候缺类导致的错误,那么,JSP编译后会变成什么呢?再次去网上寻找答案,有人说JSP背后的技术是servlet,当一个请求访问JSP文件时,web服务器把JSP翻译成servlet的java文件,再由编译器把servlet的java文件编译成class文件,最后由解释器解释执行。这样说来,JSP要经过两次编译,编译后会有.java文件和.class文件生成,那么,生成后的这两类文件存放在哪里呢?因为我用的是Myeclipse+Tomcat,所以就可以在Tomcat的安装目录下找到编译后的文件(URL:D:\apache-tomcat-7.0.70\work\Catalina\localhost\J2eeTest\org\apache\jsp)。

随后,我又去对比了一下所生成的文件,运行通过的有.java + .class文件,不能运行的只有.java文件,对比一下发现,原来首次编译就是把JSP语言转换成java语言,而一对比我就被自己给蠢cry了。之所以会缺类是因为我按照习惯看到类Calendar就来个new一个实例(Calendar now =new Calendar.getInstance(); )。

最后,虽然问题很low,但感谢遇到的问题,让我自己在慢慢查找问题的过程中成长!

参考:http://blog.sina.com.cn/s/blog_6a61ea1c0101e26k.html

初拾Java(问题二:缺类异常,无法编译)的更多相关文章

  1. java 基础二 Graphics类

    一.处理图形 1.画直线 void drawLine (int startx , int starty , int endx , int endy) 参数列表:直线开始的横坐标.纵坐标,直线结束的横坐 ...

  2. 从零开始学java(二)类与对象

    面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为. 类是对象的抽象,对象是类的具体实例. 1.构造一个类,让其拥有属性和方法 ...

  3. 初窥Java之二

    一.java中存在三大注释: 第一大注释:  单行注释   一般用于信息量比较少的地方 第二大注释:  多行注释   一般用于信息比较多的地方 多行注释注意事项:1.多行注释的开始行与结尾行不能写注释 ...

  4. 初拾Java(问题三:乱码问题)

    年后的工作不是那么的忙,最近也开始思考自己以后的路该怎么走,在迷茫的时候,还是坚持学习点儿东西吧. 接着之前的JSP,这次是要尝试着用request.getParameter(ParameterNam ...

  5. 初拾Java(问题一:404错误,页面找不到)

    做测试尤其是想走自动化测试之路的人,怎么可以不会码代码?!怒了... 再次开始拾起Java,坚持坚持!!! 刚写了一个JSP页面,想在Myeclipse里面跑来试试,结果搞了半天出现以下错误: 试着去 ...

  6. java基础二、类与继承

    员工类 Employee, 经理类:Manager public class Employee { private String name; private double salary; privat ...

  7. java容器(二) Map类框架图解

  8. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  9. java中的常用类(二)

    java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...

随机推荐

  1. Spring 源码学习(2) —— FactoryBean 的使用

    一般情况下, Spring是通过反射机制利用bean的class属性指定实现类来完成实例化bean的.在某些特定的情况下, 想做一些定制,Spring为此提供了一个org.springframewor ...

  2. [Ctsc2014]企鹅QQ

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description P ...

  3. CF851 C 暴力

    给出n个5维下的点,求点a不与其它任意的b,c重合,向量ab,ac的夹角都为钝角,这样的点个数,并打印它们. 转换二维下的求角度的函数为五维的,而且由于要求角度大于90度,在二维情况下最多有4个点,也 ...

  4. CF760 C. Pavel and barbecue 简单DFS

    LINK 题意:给出n个数,\(a_i\)代表下一步会移动到第\(a_i\)个位置,并继续进行操作,\(b_i\)1代表进行一次翻面操作,要求不管以哪个位置上开始,最后都能满足 1.到达过所有位置 2 ...

  5. 分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》

    var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( ...

  6. iOS 程序启动流程

    iOS程序启动原理   技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong   iOS应用程序运行 ...

  7. 【leetcode 简单】 第八题 删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  8. C语言与汇编语言对照分析

    游戏通常会包含各种各样的功能,如战斗系统.UI渲染.经济系统.生产系统等,每个系统又包含各式各样子功能,如伤害判定.施法.使用道具.角色移动.玩家之间交易等等.这些游戏功能在代码实现中往往少不了条件判 ...

  9. NYOJ 257 郁闷的C小加(一) (字符串处理)

    题目链接 描述 我们熟悉的表达式如a+b.a+b(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符 ...

  10. docker 升级后,配置 idea 连接 docker

    [root@A01-R02-I188-87 ~]# docker version Client: Version: 18.06.1-ce API version: 1.24 Go version: g ...