前置条件——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页面。
HelloWorld
创建工程
在IDEA中创建maven项目
待加载完毕后,修改maven.compiler.source
和maven.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