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启动时就已经加载过了。
相关推荐
通常,JSP文件在Web服务器上被自动编译成Servlet(Java类),然后由Servlet容器执行。但是,手工编译JSP可以提前完成这个步骤,提高应用程序的启动速度和运行效率。 1. **JSP预编译原理** - JSP预编译过程实际上是...
手工开发Servlet涉及一系列步骤,以下将详细讲解这些步骤,并涵盖开发过程中需要注意的关键点。 **步骤一:创建Servlet类** 首先,我们需要创建一个继承自`javax.servlet.Servlet`或`javax.servlet....
编译源码时,会用到`ecj.jar`,这是Eclipse Java Compiler的jar包,用于编译JSP文件。 6. **其他依赖库**:Tomcat源码中还包括了其他一些必要的库,如`servlet-api.jar`、`jsp-api.jar`等,这些都是Java Web应用的...
将Servlet部署到Tomcat上需要手工部署:首先需要编译生成Servlet的字节码文件,然后将字节码文件复制到TOMCAT_HOME\webapps下的对应某个应用程序的目录(如test2)的子目录WEB-INF\classes目录或其子目录。...
- `WEB-INF/classes`:编译后的Java类文件会被放在这个目录下。 2. **Servlet**:Servlet是Java Web应用的核心,处理HTTP请求并生成响应。在`src`目录下,创建Servlet类,实现`javax.servlet.http.HttpServlet`...
然后,利用工具如JAXB(Java Architecture for XML Binding)或手工方式生成服务的WSDL文件。 2. **打包服务**:将服务类、依赖库和WSDL文件打包成一个WAR(Web Application Archive)文件。WAR文件是Java EE应用...
#### 五、编写并部署JSP文件 1. **基本语法**: JSP文件允许在HTML中嵌入Java代码,实现动态页面的效果。 2. **示例**: 创建一个简单的JSP文件: ```html <head><title>TheFirst</title></head> ("Hello World...
WSDL文件可以手工编写,也可以由工具自动生成。 2. **编译WSDL**:使用Java的JAX-WS(Java API for XML Web Services)或其他类似工具,如Apache CXF,可以将WSDL文件编译成Java类,这些类包含了服务的实现骨架。 3....
#### 四、编写和运行JSP文件 - **JSP基础**:JSP是一种Java技术,用于创建动态网页。JSP页面实质上是混合了HTML标记和Java代码的文本文件。当用户访问JSP页面时,服务器会将其中的Java代码编译成Servlet类,然后执行...
【四合物业管理系统(半成品)】是一款个人项目,由开发者纯手工编写,最初作为学习J2EE技术的实践代码。这个系统对于那些希望入门J2EE开发的初学者来说,是一个很好的学习资源。它没有采用任何特定的框架,使得初学者...
- **手工编写、编译并运行 Java 程序:** - 使用文本编辑器编写 Java 源代码。 - 使用命令行工具 `javac` 编译源代码。 - 使用命令行工具 `java` 运行编译后的程序。 - **使用 Eclipse/MyEclipse 编写、编译并...
2.2 手工编写,编译并运行Java程序 46 2.3 使用Eclipse/MyEclipse来编写,编译并运行Java程序 47 2.4小结 50 第三章 Eclipse 的基础概念,配置和使用 51 3.1界面布局 51 3.1.1菜单 51 3.1.2 工具栏 51 3.1.3 透视图...
- **classes**:存储编译后的`.class`文件。 - **lib**:存放项目依赖的`.jar`包。 - **web.xml**:项目的核心配置文件,定义了Servlet映射、过滤器、监听器等。 - **index.jsp**:项目入口页面,通常位于项目的...
2. 源代码编译为.class文件,并加载到内存中。 3. 对于后续的请求,如果JSP文件未修改,Tomcat会复用内存中的Servlet实例,通过`jspService()`方法处理客户端请求。 JSP的运行架构基于请求-响应模型,当客户端发送...
- **手工编写、编译并运行Java程序**:通过简单的例子演示Java程序的创建、编译和运行流程。 - **使用Eclipse/MyEclipse来编写、编译并运行Java程序**:展示如何利用IDE自动化这些步骤,提高开发效率。 - **小结**:...
- **4.1.3 Servlet 的编译和安装**:编译 Servlet 类并配置到 Web 应用中。 **4.2 处理表单数据** - **4.2.1 表单数据概述**:通过 `HttpServletRequest` 对象获取表单数据。 - **4.2.2 实例:读取表单变量**:演示...