一尘不染

Tomcat是否自动编译Java Servlet?

tomcat

我正在Tomcat 7.0和Eclipse中使用。Tomcat服务器与Eclipse同步。创建完第一个类之后,我将.java文件放在src
/(默认程序包)/HelloWorld.java下(我不知道这是一种好习惯,仅用于测试)

内容如下,相当简单:

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/HelloWorld")

public class HelloWorld extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println ("Hello World");
    }
}

很多教程声称我必须使用它们javac来编译代码。但是我什么也没做,它运行没有问题。同样,每次我更改代码时,它都会像魔术一样立即更新。某些东西必须在工作,但我不知道它是什么。

是的,这显然是一个新手问题,因此欢迎您提供任何帮助。如果您有任何系统的且易于遵循的教程链接,也更好。我正在搜索他们几天,但得到了许多不一致的答案。


阅读 466

收藏
2020-06-16

共1个答案

一尘不染

对我来说,您混合了两种主要技术-
tomcat作为Web容器,eclipse作为您的IDE。它们的集成使您感到困惑。现在让我们离开JSP并只谈论servlet,因为它会使您更加困惑

Tomcat无法使用源文件(* .java)。例如,您 必须 使用javac编译应用程序,并创建一个名为WAR的文件-网络归档-
一个zip文件,其中将包含您的已编译类并遵守tomcat可以理解的一些EE标准(也可以使用文件夹而不是zip,但请放下它此外,它与该说明无关)。

除其他外,这种战争(一旦正确编译)将包含您已编译的Servlet类HelloWorld.class。

一旦tomcat启动并在部署文件夹中识别出您的war文件,它将打开它并在运行时加载。没有编译,只有运行时加载。

现在人们在这里谈论JSP。实际上,JSP在技术上等同于servlet,但类似于HTML。您将文件扩展名为.jsp并构建您的WAR。Java编译器无法读取JSP文件,因此您应以某种方式将它们放入war文件中(通常是通过构建工具/
IDE为您完成)。最重要的是,您拥有在战争中创建的JSP文件。现在,您将战争付诸于Tomcat,它可以像以前一样识别并加载。此时,它仍然对您的JSP无效。

因此,部署了您的战争,启动了tomcat并从您的浏览器转到“ http:// localhost:8080 /
myfirstjsp.jsp
”。这时(第一次调用JSP)发生了很多事情:

  1. Tomcat获取浏览器的HTTP请求
  2. Tomcat意识到应该处理JSP文件
  3. Tomcat解析您的JSP文件
  4. Tomcat在内部将其编译为您不知道的某些类文件(其内部存储在Tomcat中),
  5. Tomcat在运行时加载此文件,并将其视为已编译的Java类。

下次调用JSP时,它将已经编译。

这里的最后一个问题是Eclipse如何与所有这些故事联系起来:)实际上,Eclipse与tomcat集成在一起,因此所有创建和部署战争的工作都是透明的。这就是为什么您在Eclipse上按下“播放”键,然后它编译您的项目,创建战争,确保Tomcat意识到这场战争(配置与部署相关的内容),启动Tomcat和瞧!-您的应用程序正在运行。

了解在什么级别发生什么很重要

希望这对
马克有帮助

2020-06-16