昨天,在看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. centos7 samba匿名访问设置

    [global] workgroup = WORKGROUP server string = Samba Server %v netbios name = centos security = user ...

  2. @PathParam 和 @QueryParam

    今天调试一个上传功能,客户端手持机发送数据,在URL中附加一个参数,后台用@PathParam接收,但是报错,无法获取这个参数. url:http://192.168.1.3/web1_service ...

  3. 1.Spring揭秘--Ioc容器

    1.Ioc即控制反转,假设一个类需要依赖另外一个类,在最初始的做法就是创建那个依赖类的对象,然后使用这个类提供的功能,如果创建这个依赖类的职责交给Ioc Service Provider去做,那么这就 ...

  4. macbook 安装任意来源

    sudo spctl --master-disable Comand+r Csrutil disable Reboot

  5. BestCoder Round #41 记。

    大概整个过程都是很绝望的吧. 发现自己在七点之前是肯定搞不定网了..有冲动跑到机房去打 但是又不喜欢那样的气氛 这可是shi的场呢...好难过啊... 后来..好像是在和lyd讨论怎么把网络复原的过程 ...

  6. struts入门

    1.概念

  7. git命令大全【转】

    转自:http://www.jqhtml.com/8235.html 初始化本地git仓库(创建新仓库) git init 配置用户名 git config --global user.name &q ...

  8. makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解【转】

    转自:http://www.cnblogs.com/lifexy/p/7065175.html 在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 ...

  9. 在新版linux上编译老版本的kernel出现kernel/timeconst.h] Error 255

    在使用ubuntu16.4编译Linux-2.6.31内核时出现这样的错误 可以修改timeconst.pl的内容后正常编译. 以下是编译错误提示的内容: Can't use 'defined(@ar ...

  10. 121.Best Time to Buy and Sell Stock---dp

    题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/ 题目大意:给出一串数组,找到差值最大的差 ...