1、新建Servlet文件
1)我们知道,要成为一个Servlet,则必须(一般)继承HttpServlet 类。
2)在D:\Javaspace\TestWeb\com\example\servlet\中,使用记事本新建如下MyServlet.java文件。
package com.example.servlet; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("This is my first Servlet"); out.close(); } }
2、使用javac命令编译MyServlet.java文件
1)运行cmd,进入命令行提示符界面,直接执行javac命令,但很不幸报错了,如下图所示。
很明显,报错的提示是找不到MyServlet.java文件。
原因:MyServlet.java文件放在D:\Javaspace\TestWeb\com\example\servlet\中,而不是在C:\Users\Linwei\目录中,所以找不到指定文件。
解决方法:先切换到D:\Javaspace\TestWeb\com\example\servlet\目录,在进行编译。
2)切换到D:\Javaspace\TestWeb\com\example\servlet\目录中并再次编译。不幸的是,又报错了,如下所示。
直观的看报错提示,出错的原因是:
a)找不到HttpServlet类。
b)找不到HttpServletRequest类。
c)找不到HttpServletResponse类。
d)找不到ServletException类。
e)找不到IOException类。
f)找不到PrintWriter类。
看来是需要导入这些类所在的包才行,查看这些类所在的包发现:HttpServlet、HttpServletRequest、HttpServletResponse、ServletException都在servlet-api.jar中,而IOException和PrintWriter类都在java.io包中,所以修改源文件,导入相应的包,如下所示。
package com.example.servlet; import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("This is my first Servlet"); out.close(); } }
3)修改完成后,重新执行编译,不幸的是还是报错,如下图所示。
直观的看报错提示,出错的原因是:
a)包javax.servlet 不存在。
b)包javax.servlet.http 不存在。
c)找不到HttpServletRequest类。
d)找不到HttpServletResponse类。
e)找不到ServletException类。
看出错提示好像和上一次的差不多,还是找不到相关的类什么的。由此我们引出以下问题:
a)我们已经导入了javax.servlet.* 和 javax.servlet.http.* 包,为什么还是提示找不到?
b)我们也导入了java.io.* 包,而且刚才找不到IOException类和找不到PrintWriter类的错误消失了,看来编译器能够正确的找到java.io包,但为什么又能找到java.io包呢?
要回答以上问题,得了解下JVM的类加载器。当JVM 启动的时候,Java 缺省使用如下三种类型类装入器:
a)启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责加载Java的核心类库,即负责将<Java_Home>/jre/下面的类库加载到内存中。
b)标准扩展(Extension)类加载器 :扩展类加载器是由Sun的ExtClassLoader实现的。它负责将
< Java_Home >/jre/lib/ext 或者由系统变量java.ext.dir指定位置中的类库加载到内存中。
c)系统(System)类加载器 :系统类加载器是由 Sun 的AppClassLoader实现的。它负责将在命令java中的-classpath或者java.class.path系统属性或者CLASSPATH坏境变量指定的路径中的类库加载到内存中。
由此可以推出,当我们使用javac命令时,它会自动在以下三个地方查找相关的软件包及类:
a)<Java_Home>/jre/下的类库中
b)< Java_Home >/jre/lib/ext 中(该位置专门存放第三方的类库)
b)系统类路径(CLASSPATH)中
由此,我们也应该知道为什么我们不需要在系统属性CLASSPATH中指定这些类库了吧,因为JVM在启动的时候就自动加载它们了。
好了,了解了类加载器相关知识点后,我们回到上述问题本身:
问题a):为什么找不到javax.servlet.* 和 javax.servlet.http.* 包,他们又存放在哪呢?
原因:经过查询,Servlet依赖于servlet-api.jar包,进一步打开jar包可以发现javax.servlet.* 包和 javax.servlet.http.* 包确实都存放在该jar包中。
解决方法:
a)将servlet-api.jar直接加到< Java_Home >/jre/lib/ext中。由于servlet-api.jar属于第三行类库,所以必须放在jre的扩展类目录下,而不能直接加到jre根目录下。
b)将servlet-api.jar所在的目录添加到环境变量(CLASSPATH)中。比如我的tomcat目录中(D:\apache-tomcat-7.0.42\lib)有servlet-api.jar文件,则直接将该路径添加到系统环境变量中即可。
c)如果不想修改系统环境变量,则也可以在命令行编译时加上classpath,如:
javac -classpath D:\apache-tomcat-7.0.42\lib\servlet-api.jar MyServlet.java。
问题b): 为什么能找到java.io.*包?
原因:经查询,java.io.*包存放在< Java_Home >/jre/lib/下的rt.jar包中,而由上述类加载器部分可知rt.jar包在JVM启动时已经被加载过了,所以可以直接使用,无需再添加到系统环境变量中。
3、简单总结
1)Servlet类依赖于servlet-api.jar包,因此要编译和使用servlet,则必须确保程序能正确找到servlet-api.jar包。方法有两种:一是将servlet-api.jar添加到< Java_Home >/jre/lib/ext中。 二是将servlet-api.jar所在的目录添加到环境变量中。如果只是在命令行中编译servlet文件,则可以直接指定classpath,再编译即可。
2)Java内置类库中的类路径不需要配置到系统环境变量中,因为JVM启动时就已经加载过了。
相关推荐
cmd命令行 手动编译Servlet.zip
NULL 博文链接:https://andrewstz.iteye.com/blog/1668372
设计编写调试一个具体的词法分析程序,识别出各个具有独立意义的单词。
linux makefile 编写 规则 编译多个文件,是学习makefile 很好的资料,有例子,讲解详细
如何手动编译servlet、部署servlet,以及书写web.xml
编译原理 手工编写简易词法分析程序 手工编写简易词法分析程序
真正的驱动入门demo 用DriverStudio+VC编写编译生成驱动文件.sys.zip
用C#编写的编译原理上机源代码,共三个源代码,词法分析、语法分析、语义分析,并内含测试用例,用VS打开可直接运行,无需修改。代码写的不是很好,请见谅。。。
Mac下的jad, 可以用来反编译class文件 完整版 MAC下Java 反编译利器 JD-GUI/Jad/JadClipse MAC下Java 反编译利器 JD-GUI/Jad/JadClipse mac java反编译 Mac 使用Jad 反编译class文件
servlet编写、部署、运行全过程。该资料就能解决这个问题。
主要是一些servlet基本源码,可以debug调试一下,疏通整个执行流程
java反编译工具反编译.class文件 java反编译工具反编译.class文件java反编译工具反编译.class文件java反编译工具反编译.class文件java反编译工具反编译.class文件
反编译 unity3d文件 点击'new project'选择要反编译的文件。 先点‘New project’选择unity3d文件,再点'Unpack Web Archrive in a directory'选择导出的文件夹。
apk反编译xml文件工具,apk反编译xml文件工具,apk反编译xml文件工具
在参考apk开发应用程序时,经常遇到.so文件,工具中readelf.exe,经测试可有效反编译.so文件。
在目录src/main 下新建了aidl 文件夹之后,在aidl文件夹中也创建了相同的包路径, ...如果编译的时候提示AIDL文件引用的包找不到的话 要在build文件中声明以下内容: android { ... sourceSets
java编写的编译词法分析程序 ,以txt文件的形式读入源代码,处理后写到一个新的txt文件里
java反编译工具(.class文件反编译成.java文件) 解压后点击exe文件打开工具,点击open菜单选择.class文件执行后即生成.java文件 一直在使用的,方便,系统维护必不可少
2.【可运行程序】使用Qt封装程序将基于Qt编写的c++代码文件转化成可以运行的exe,通过运行exe直接进行使用。 3.【代码】Qt的C++代码项目的源代码部分,通过代码进一步理解程序的运行。 内容完整,图文表并茂,可...
用shell写的脚本,用于java web开发时,自动编译运行servlet,速度极快,免除了eclipse慢且不过更新代码和资源的问题。脚本中的路径请自行替换为自己的