初拾Java(问题二:缺类异常,无法编译)
昨天,在看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页面中的pageEncoding和contentType两种属性的区别:
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(问题二:缺类异常,无法编译)的更多相关文章
- java 基础二 Graphics类
一.处理图形 1.画直线 void drawLine (int startx , int starty , int endx , int endy) 参数列表:直线开始的横坐标.纵坐标,直线结束的横坐 ...
- 从零开始学java(二)类与对象
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为. 类是对象的抽象,对象是类的具体实例. 1.构造一个类,让其拥有属性和方法 ...
- 初窥Java之二
一.java中存在三大注释: 第一大注释: 单行注释 一般用于信息量比较少的地方 第二大注释: 多行注释 一般用于信息比较多的地方 多行注释注意事项:1.多行注释的开始行与结尾行不能写注释 ...
- 初拾Java(问题三:乱码问题)
年后的工作不是那么的忙,最近也开始思考自己以后的路该怎么走,在迷茫的时候,还是坚持学习点儿东西吧. 接着之前的JSP,这次是要尝试着用request.getParameter(ParameterNam ...
- 初拾Java(问题一:404错误,页面找不到)
做测试尤其是想走自动化测试之路的人,怎么可以不会码代码?!怒了... 再次开始拾起Java,坚持坚持!!! 刚写了一个JSP页面,想在Myeclipse里面跑来试试,结果搞了半天出现以下错误: 试着去 ...
- java基础二、类与继承
员工类 Employee, 经理类:Manager public class Employee { private String name; private double salary; privat ...
- java容器(二) Map类框架图解
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- java中的常用类(二)
java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...
随机推荐
- JS函数大全 莫名其妙找到的
1 .document.write(""); 输出语句 2 .JS中的注释为// 3 .传统的HTML文档顺序是:document->html->(head,body) ...
- 预处理 Gym - 101128H
题目链接:http://codeforces.com/gym/101128 题目大意:给你一个区间[x,y],找出这个区间有多少个seldom的数字. seldom的数字定义如下:该数值的二进制数字符 ...
- Findbugs插件安装与使用
FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具.FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析.FindBug ...
- 【洛谷 P2604】 [ZJOI2010]网络扩容(最大流,费用流)
题目链接 第一问就是简单的最大流. 第二问,保留第一问求完最大流的残量网络. 然后新建一个源点,向原源点连一条流量为k,费用为0的边. 然后所有边重新连一起(原来的边保留),费用为题目所给,最小费用即 ...
- 从urllib和urllib2基础到一个简单抓取网页图片的小爬虫
urllib最常用的两大功能(个人理解urllib用于辅助urllib2) 1.urllib.urlopen() 2. urllib.urlencode() #适当的编码,可用于后面的post提交 ...
- jQuery()方法的第二个参数详解
关于jQuery()方法的第二个参数,有下面这几种用法: 1.jQuery(selector, [context]) 这种用法,相当于 $(context).find(selector) 或者 con ...
- keypress 、keydown、keyup后触发回车
1.keypress .keydown.keyup的区别 keypress表示键盘按下的全过程,只有按下任意字母数字键(后退.删除等系统功能键无效)时才触发,捕获到的keyCode区分大小写 keyd ...
- Coursera在线学习---第四节.过拟合问题
一.解决过拟合问题方法 1)减少特征数量 --人为筛选 --靠模型筛选 2)正则化(Regularization) 原理:可以降低参数Θ的数量级,使一些Θ值变得非常之小.这样的目的既能保证足够的特征变 ...
- adb_usb.ini在adb找不到设备时
不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...
- 谁说运维用ELK没用?我就说很有用,只是你之前不会用【转】
1.安装JDK 1)登陆ORACLE官网 (http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html ...