标签:官方 parent sys 处理程序 catalina 完整路径 post 覆盖 细节
git clone https://gitee.com/kendoziyu/code-servlet-parent
该目录下的 javac-servlet 表示的是本文的项目。
去Tomcat官网(Download Tomcat 9) 下载最新的Tomcat(需下载对应系统版本,请根据实际情况选择,本文以Windows系统为例)。
下载完成之后解压即可。
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.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
首先需要引入 lib 包,步骤如下:
+
,弹出 New Project Library,选中 Java,弹出文件夹选择框这种情况下,只要点击
Build -> Build Project 就能自动编译生成 .class 文件了,输出文件默认在根目录 out 文件夹的子文件夹下面可以找到。
我们选择再项目根目录下创建 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>
拷贝上一步完成的 DemoWebapp 目录到 Tomcat\webapps\ 目录下:
找到 Tomcat 安装目录下的 bin 目录,如果是 Windows 系统,执行 startup.bat;如果是 Linux 系统,则执行 startup.sh
在浏览器里访问这个 URL: http://localhost:8080/DemoWebapp/demo
<servlet-mapping><url-pattern>
对应的路径同样,post方式调用也会得到相类似的结果!
在 Linux 系统下,我们可以看下 tomcat/logs/catalina.out 文件,使用以下命令查看相应的日志。
在 Windows 系统下,刚才 startup.bat 会调起一个工作台窗口,这个工作台输出一些日志:
标签:官方 parent sys 处理程序 catalina 完整路径 post 覆盖 细节
原文地址:https://www.cnblogs.com/kendoziyu/p/deploy-first-servlet-app-into-tomcat.html