`

手工编写并编译servlet文件

阅读更多

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启动时就已经加载过了。

 

  • 大小: 33.5 KB
  • 大小: 87.9 KB
  • 大小: 82.6 KB
  • 大小: 25.1 KB
分享到:
评论

相关推荐

    手工编译jsp

    通常,JSP文件在Web服务器上被自动编译成Servlet(Java类),然后由Servlet容器执行。但是,手工编译JSP可以提前完成这个步骤,提高应用程序的启动速度和运行效率。 1. **JSP预编译原理** - JSP预编译过程实际上是...

    手工开发Servlet的步骤

    手工开发Servlet涉及一系列步骤,以下将详细讲解这些步骤,并涵盖开发过程中需要注意的关键点。 **步骤一:创建Servlet类** 首先,我们需要创建一个继承自`javax.servlet.Servlet`或`javax.servlet....

    编译tomcat源码所需jar包

    编译源码时,会用到`ecj.jar`,这是Eclipse Java Compiler的jar包,用于编译JSP文件。 6. **其他依赖库**:Tomcat源码中还包括了其他一些必要的库,如`servlet-api.jar`、`jsp-api.jar`等,这些都是Java Web应用的...

    《Java软项目BS架构开发》Servle与欢迎页面的实现PPT课件.ppt

    将Servlet部署到Tomcat上需要手工部署:首先需要编译生成Servlet的字节码文件,然后将字节码文件复制到TOMCAT_HOME\webapps下的对应某个应用程序的目录(如test2)的子目录WEB-INF\classes目录或其子目录。...

    手工完成java项目(二)——web项目

    - `WEB-INF/classes`:编译后的Java类文件会被放在这个目录下。 2. **Servlet**:Servlet是Java Web应用的核心,处理HTTP请求并生成响应。在`src`目录下,创建Servlet类,实现`javax.servlet.http.HttpServlet`...

    解决weblogic部署JAX-WS需要的配置文件

    然后,利用工具如JAXB(Java Architecture for XML Binding)或手工方式生成服务的WSDL文件。 2. **打包服务**:将服务类、依赖库和WSDL文件打包成一个WAR(Web Application Archive)文件。WAR文件是Java EE应用...

    Tomcat服务器配置

    #### 五、编写并部署JSP文件 1. **基本语法**: JSP文件允许在HTML中嵌入Java代码,实现动态页面的效果。 2. **示例**: 创建一个简单的JSP文件: ```html &lt;head&gt;&lt;title&gt;TheFirst&lt;/title&gt;&lt;/head&gt; ("Hello World...

    WSDL生成webservice

    WSDL文件可以手工编写,也可以由工具自动生成。 2. **编译WSDL**:使用Java的JAX-WS(Java API for XML Web Services)或其他类似工具,如Apache CXF,可以将WSDL文件编译成Java类,这些类包含了服务的实现骨架。 3....

    李兴华视频教程笔记 Java JSP 技术

    #### 四、编写和运行JSP文件 - **JSP基础**:JSP是一种Java技术,用于创建动态网页。JSP页面实质上是混合了HTML标记和Java代码的文本文件。当用户访问JSP页面时,服务器会将其中的Java代码编译成Servlet类,然后执行...

    四合物业管理系统(半成品)

    【四合物业管理系统(半成品)】是一款个人项目,由开发者纯手工编写,最初作为学习J2EE技术的实践代码。这个系统对于那些希望入门J2EE开发的初学者来说,是一个很好的学习资源。它没有采用任何特定的框架,使得初学者...

    MyEclipse 6 Java EE 开发中文手册.pdf

    - **手工编写、编译并运行 Java 程序:** - 使用文本编辑器编写 Java 源代码。 - 使用命令行工具 `javac` 编译源代码。 - 使用命令行工具 `java` 运行编译后的程序。 - **使用 Eclipse/MyEclipse 编写、编译并...

    《MyEclipse 6 Java 开发中文教程》前10章

    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 透视图...

    MyEclipse+6+Java+开发中文教程

    - **手工编写、编译与运行Java程序**:学习基本的命令行操作,如使用javac编译器和java解释器。 - **使用Eclipse/MyEclipse进行Java开发**:利用IDE的优势,如代码补全、调试、项目管理等,提高开发效率。 ### 3. ...

    使用Tomcat,无IDE工具手动部署Web程序

    - **classes**:存储编译后的`.class`文件。 - **lib**:存放项目依赖的`.jar`包。 - **web.xml**:项目的核心配置文件,定义了Servlet映射、过滤器、监听器等。 - **index.jsp**:项目入口页面,通常位于项目的...

    tomcat服务器的配置及其使用

    2. 源代码编译为.class文件,并加载到内存中。 3. 对于后续的请求,如果JSP文件未修改,Tomcat会复用内存中的Servlet实例,通过`jspService()`方法处理客户端请求。 JSP的运行架构基于请求-响应模型,当客户端发送...

    MyEclipse 6 Java EE 中文版

    - **手工编写、编译并运行Java程序**:通过简单的例子演示Java程序的创建、编译和运行流程。 - **使用Eclipse/MyEclipse来编写、编译并运行Java程序**:展示如何利用IDE自动化这些步骤,提高开发效率。 - **小结**:...

    J2EEWEB开发教材

    - **4.1.3 Servlet 的编译和安装**:编译 Servlet 类并配置到 Web 应用中。 **4.2 处理表单数据** - **4.2.1 表单数据概述**:通过 `HttpServletRequest` 对象获取表单数据。 - **4.2.2 实例:读取表单变量**:演示...

    MyEclipse 6 Java 开发中文教程

    如何手工和自动编译;如何直接粘贴Java源码为类文件;如何复制项目中的文件;如何使用断点和调试器;如何加入或删除jar包到BuildPath;如何查看当前类被哪些类引用;如何设置编辑器的字体、颜色和显示行号;如何Link...

Global site tag (gtag.js) - Google Analytics