前置条件——JAVA环境

需要将JDK和JRE添加至环境变量,并配置CLASSPATH

以我的电脑为例:

# java
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home
export JRE_HOME=$JAVA_HOME
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME

配置Tomcat

到官网下载Tomcat:http://tomcat.apache.org/

解压到方便的地方,我的位置为/Users/zhinushannan/environment/apache-tomcat-9.0.65

添加环境变量:

# tomcat
export CATALINA_HOME=/Users/zhinushannan/environment/apache-tomcat-9.0.65
export PATH=$PATH:$CATALINA_HOME/bin

使用source命令刷新一下配置文件,就可以启动Tomcat了,执行startup.sh(Windows执行startup.bat)。

启动后可以在浏览器输入http://localhost:8080查看Tomcat页面。

tomcat页面

HelloWorld

创建工程

在IDEA中创建maven项目

创建工程

待加载完毕后,修改maven.compiler.sourcemaven.compiler.target属性为1.8或自己电脑上的JDK版本。

导入依赖,其中版本应当和tomcat官网的版本对应

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>

我的tomcat版本为9.0.65,属于9.0.x,因此我的javax.servlet版本需要为4.0.x

版本对应关系

编写代码

在源码根目录下创建代码,不要包含包。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
/**
 * Hello world!
 */
public class HelloWorld extends HttpServlet {
​
    private String message;
​
    @Override
    public void init() throws ServletException {
        message = "Hello world!";
    }
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<h1>" + message + "</h1>");
    }
​
    @Override
    public void destroy() {
        super.destroy();
    }
}

在终端执行javac HelloWorld.java进行编译,不出意外的话,此时一定会报错:

HelloWorld.java:1: 错误: 程序包javax.servlet不存在
import javax.servlet.ServletException;
                    ^
HelloWorld.java:2: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServlet;
                         ^
HelloWorld.java:3: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletRequest;
                         ^
HelloWorld.java:4: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletResponse;
                         ^
HelloWorld.java:10: 错误: 找不到符号
public class HelloWorld extends HttpServlet {
                                ^
  符号: 类 HttpServlet
HelloWorld.java:15: 错误: 找不到符号
    public void init() throws ServletException {
                              ^
  符号:   类 ServletException
  位置: 类 HelloWorld
HelloWorld.java:20: 错误: 找不到符号
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                         ^
  符号:   类 HttpServletRequest
  位置: 类 HelloWorld
HelloWorld.java:20: 错误: 找不到符号
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                 ^
  符号:   类 HttpServletResponse
  位置: 类 HelloWorld
HelloWorld.java:20: 错误: 找不到符号
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                                                  ^
  符号:   类 ServletException
  位置: 类 HelloWorld
HelloWorld.java:14: 错误: 方法不会覆盖或实现超类型的方法
    @Override
    ^
HelloWorld.java:19: 错误: 方法不会覆盖或实现超类型的方法
    @Override
    ^
HelloWorld.java:25: 错误: 方法不会覆盖或实现超类型的方法
    @Override
    ^
HelloWorld.java:27: 错误: 找不到符号
        super.destroy();
        ^
  符号:   变量 super
  位置: 类 HelloWorld
13 个错误

这是因为javax.servlet包不是Java自带包,在使用javac命令编译时,会找不到该包,从而导致报错。

解决方法:在CLASSPATH中添加该包

export CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib/servlet-api.jar

CLASSPATH是javac编译器的一个环境变量,用来告诉Java编译工具,在编译时可能会用到那些类。

添加完该jar包后使用source命令刷新一下配置文件刷新一下环境变量,再次编译便不会报错。

将编译后的class文件移动到$CATALINA_HOME/webapps/ROOT/WEB-INF/classes下,编辑$CATALINA_HOME/webapps/ROOT/WEB-INF/web.xml文件,在web-app标签中添加:

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>
​
  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>

重启tomcat:

shutdown.sh
startup.sh

在浏览器中输入http://localhost:8080/HelloWorld

Hello World