初拾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类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...
随机推荐
- centos7 samba匿名访问设置
[global] workgroup = WORKGROUP server string = Samba Server %v netbios name = centos security = user ...
- @PathParam 和 @QueryParam
今天调试一个上传功能,客户端手持机发送数据,在URL中附加一个参数,后台用@PathParam接收,但是报错,无法获取这个参数. url:http://192.168.1.3/web1_service ...
- 1.Spring揭秘--Ioc容器
1.Ioc即控制反转,假设一个类需要依赖另外一个类,在最初始的做法就是创建那个依赖类的对象,然后使用这个类提供的功能,如果创建这个依赖类的职责交给Ioc Service Provider去做,那么这就 ...
- macbook 安装任意来源
sudo spctl --master-disable Comand+r Csrutil disable Reboot
- BestCoder Round #41 记。
大概整个过程都是很绝望的吧. 发现自己在七点之前是肯定搞不定网了..有冲动跑到机房去打 但是又不喜欢那样的气氛 这可是shi的场呢...好难过啊... 后来..好像是在和lyd讨论怎么把网络复原的过程 ...
- struts入门
1.概念
- git命令大全【转】
转自:http://www.jqhtml.com/8235.html 初始化本地git仓库(创建新仓库) git init 配置用户名 git config --global user.name &q ...
- makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解【转】
转自:http://www.cnblogs.com/lifexy/p/7065175.html 在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 ...
- 在新版linux上编译老版本的kernel出现kernel/timeconst.h] Error 255
在使用ubuntu16.4编译Linux-2.6.31内核时出现这样的错误 可以修改timeconst.pl的内容后正常编译. 以下是编译错误提示的内容: Can't use 'defined(@ar ...
- 121.Best Time to Buy and Sell Stock---dp
题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/ 题目大意:给出一串数组,找到差值最大的差 ...