maven项目怎么写一个简单servlet,运行在tomca

主要内容

记录下第一次使用tomcat的踩坑过程,要达到的效果为能够在tomcat上运行一个war包,这个包里包含一个servlet

前置

知道tomcat是一个容器,然后采用多线程运行servlet

maven配置

由于servlet不是在jdk标准包里,所以首先要在pom.xml里面添加servlet的包依赖,版本自己选:

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
复制代码

一定要注意的是,scope填privided, 表示在最后打包的时候不将这个依赖放进去,因为在运行的时候都是使用tomcat的自带包。
然后将打包名称改成hello,这样最后会生成hello.war:

    <build>
        <finalName>hello</finalName>
    </build>
复制代码

maven打包默认是jar文件,将其修改成war:

    <groupId>groupid</groupId>
    <artifactId>projectname</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
复制代码

前三项都是自己设定的项目信息,只要在最后添加packaging一项就行,然后修改项目的结构,需要在src文件夹建立webapp这个包,其他两项java,resources都是已经存在的。最重要的是web.xml这个文件,这个之后再讲。

├─java
│  └─test
│          HelloWorld.java
│
├─resources
└─webapp
    └─WEB-INF
            web.xml

复制代码

编写servlet

package test;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {
    private String message; //unsafe
    @Override
    public void init() throws ServletException {
        message = "Hello World";
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");

        PrintWriter out = resp.getWriter();
        out.println(message);
    }

    @Override
    public void destroy() {
        super.destroy();
    }
}
复制代码

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>test.HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/Hello</url-pattern>
    </servlet-mapping>
</web-app>
复制代码

前面两项的意思我也不太懂,不过我们一般只需要关注web-app这个标签下的内容,servlet-name可以自己随便指定,指定之后下面的配置都用这个名称来指代目标servlet,上面这个配置是用Hello指代test.HelloWorld这个实现了Servlet接口的类,注意包名带上。下面有一项url-pattern,表示你想让用户使用什么样的地址可以访问到这个servlet。

运行

上面都写好了之后,maven命令clean,compile, package三连,生成了一个hello.war,将这个文件放在tomcat的webapps目录下,然后进入到tomcat的bin文件夹里面,cmd输入

startup
复制代码

然后浏览器输入localhost:8080/hello/Hello就可以看到servlet返回的信息了,其中hello是war文件的名称,后面的/Hello就是url-pattern的值,当然也可以设置成通配符,让其他url也能够连接到这个servlet

可能出现的问题

乱码

tomcat的输出按照目标系统语言,所以有可能乱码,解决方法,将tomcat下conf/logging.properties中java.util.logging.ConsoleHandler.encoding = UTF-8改成= GBK

端口被占用

这时候要修改tomcat的端口,将conf/server.xml里的Connector port="8080"修改成想要的端口即可。

总结

踩了一天坑