写在前面
Java Servlet 是 J2EE 规范中一项关于 Web 应用的规范。Tomcat 则是实现 Java Servlet 规范的一个开源项目。本文将一步步创建一个最简单的 Servlet 项目,并且部署到 Tomcat 上。
项目地址
git clone https://gitee.com/kendoziyu/code-servlet-parent
该目录下的 javac-servlet 表示的是本文的项目。
基于web.xml开发步骤
- 下载、安装 Tomcat。
- 编写一个继承 HTTPServlet 的 Java 类MyServlet。
- 将 Java 类文件编译成 Class 文件。
- 建立 Web 应用的目录结构,并配置 web.xml。
- 部署 Web 应用。
- 启动 Tomcat。
- 浏览器访问验证结果。
- 查看 Tomcat 日志。
1 下载、安装Tomcat
去Tomcat官网(Download Tomcat 9) 下载最新的Tomcat(需下载对应系统版本,请根据实际情况选择,本文以Windows系统为例)。
下载完成之后解压即可。
Windows 解压 zip 包得到 tomcat 目录效果图,展开查看
2 编写DemoServlet类
Servlet 并不是 JDK 中自带的,属于拓展包,因此需要额外下载 jar 包,这里是官方下载地址 Servlet3.1
编写一个DemoServlet类,其继承HttpServlet类,并复写其doGet()和doPost()方法。
package coderead.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Java Servlet 示例1
*
* @author kendoziyu
* @since 2020/10/21
*/
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DemoServlet 在处理 get 请求...");
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
out.println("<strong>doGet Demo Servlet!</strong><br>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DemoServlet 在处理 post 请求...");
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
out.println("<strong>doPost Demo Servlet!</strong><br>");
}
}
我们可以查看一下 HttpServlet 的继承结构,因为选择 HttpServlet 实现类就不需要我们来实现 Servlet 接口了,毕竟那不是本文的重点。
3 编译DemoServlet
下图展示的是我的项目目录
3.1 命令行编译
接着要要在当前项目目录进行编译
展开查看 逐步解决javac编译中出现的错误
3.1.1 首先,尝试直接使用命令 javac 目标java文件路径:
javac src\\coderead\\servlet\\DemoServlet.java
出现了编码错误:
我们需要求助于javac -help 查看更多参数细节。
-encoding <编码> 指定源文件使用的字符编码
3.1.2 接着,我们指定一下源文件的字符编码,重新编译
javac -encoding utf-8 src\\coderead\\servlet\\DemoServlet.java
编译失败,查找不到 javax.servlet 下的文件,异常如下:
src\\coderead\\servlet\\DemoServlet.java:3: 错误: 程序包javax.servlet不存在
import javax.servlet.ServletException;
^
src\\coderead\\servlet\\DemoServlet.java:4: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServlet;
^
src\\coderead\\servlet\\DemoServlet.java:5: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletRequest;
^
src\\coderead\\servlet\\DemoServlet.java:6: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletResponse;
^
src\\coderead\\servlet\\DemoServlet.java:16: 错误: 找不到符号
public class DemoServlet extends HttpServlet {
^
符号: 类 HttpServlet
src\\coderead\\servlet\\DemoServlet.java:19: 错误: 找不到符号
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符号: 类 HttpServletRequest
位置: 类 DemoServlet
src\\coderead\\servlet\\DemoServlet.java:19: 错误: 找不到符号
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符号: 类 HttpServletResponse
位置: 类 DemoServlet
src\\coderead\\servlet\\DemoServlet.java:19: 错误: 找不到符号
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符号: 类 ServletException
位置: 类 DemoServlet
src\\coderead\\servlet\\DemoServlet.java:27: 错误: 找不到符号
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符号: 类 HttpServletRequest
位置: 类 DemoServlet
src\\coderead\\servlet\\DemoServlet.java:27: 错误: 找不到符号
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符号: 类 HttpServletResponse
位置: 类 DemoServlet
src\\coderead\\servlet\\DemoServlet.java:27: 错误: 找不到符号
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符号: 类 ServletException
位置: 类 DemoServlet
src\\coderead\\servlet\\DemoServlet.java:18: 错误: 方法不会覆盖或实现超类型的方法
@Override
^
src\\coderead\\servlet\\DemoServlet.java:26: 错误: 方法不会覆盖或实现超类型的方法
@Override
^
13 个错误
我们再次求助 help:
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
3.1.3 带上 classpath 再次执行命令:
javac -encoding utf-8 -cp lib\\javax.servlet-api-3.1.0.jar src\\coderead\\servlet\\DemoServlet.java
但是输出文件 DemoServlet.class 和源文件 DemoServlet.java 在同一文件夹下又有些不妥,于是我们希望指定输出目录
-d <目录> 指定放置生成的类文件的位置
3.1.4 指定输出目录为 build 后,再次执行命令
javac -encoding utf-8 -cp lib\\javax.servlet-api-3.1.0.jar -d build src\\coderead\\servlet\\DemoServlet.java
但是还是一点小问题:
我们自己在项目根目录下 创建一下 build 目录 就好了
然后,我们执行以下命令,即可对 DemoServlet 进行编译:
javac -encoding utf-8 -cp lib\\javax.servlet-api-3.1.0.jar -d build src\\coderead\\servlet\\DemoServlet.java
3.2 使用 IDEA 编译
首先需要引入 lib 包,步骤如下:
- File -> Project Structure 打开窗口
- 在窗口左侧菜单中,找到 Libraries,并选中
- 点击
+
,弹出 New Project Library,选中 Java,弹出文件夹选择框 - 选择 javac-servlet\\lib 所在的完整路径,点击 Ok
这种情况下,只要点击
Build -> Build Project 就能自动编译生成 .class 文件了,输出文件默认在根目录 out 文件夹的子文件夹下面可以找到。
4 建立 Web 应用目录
我们选择再项目根目录下创建 DemoWebapp 目录,按照惯例,目录结构如下:
web.xml 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<description> Servlet Example. </description>
<display-name> DemoServlet Example </display-name>
<request-character-encoding>UTF-8</request-character-encoding>
<servlet>
<servlet-name>demoServlet</servlet-name>
<servlet-class>coderead.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
5 部署 DemoWebapp
拷贝上一步完成的 DemoWebapp 目录到 Tomcat\\webapps\\ 目录下:
6 启动 Tomcat
找到 Tomcat 安装目录下的 bin 目录,如果是 Windows 系统,执行 startup.bat;如果是 Linux 系统,则执行 startup.sh
7 浏览器访问
在浏览器里访问这个 URL: http://localhost:8080/DemoWebapp/demo
- DemoWebapp 表示 tomcat\\webapps</span> 下的文件夹名称
- demo 表示 web.xml 文件配置的映射地址:
<servlet-mapping><url-pattern>
对应的路径
同样,post方式调用也会得到相类似的结果!
8 查看 Tomcat 日志
在 Linux 系统下,我们可以看下 tomcat/logs/catalina.out 文件,使用以下命令查看相应的日志。
在 Windows 系统下,刚才 startup.bat 会调起一个工作台窗口,这个工作台输出一些日志: