Java Serverlet mit Tomcat und Maven in VSCode

In diesem Artikel ist beschrieben, wie man Apache Tomcat direkt in VSCode nutzen kann.

Voraussetzung ist, dass du auf deinem Gerät bereits eine Java JRE und Apache Maven installiert hast. Weiter brauchen wir in VSCode das Extension Pack for Java, du kannst dire in VSCode installieren, wenn du  CTRL + SHIFT + X und dann vscode:extension/vscjava.vscode-java-pack eingibst.

Maven Projekt anlegen

Als erster Schritt legen wir ein neues Maven Projekt an:

  • Aus VSCode mit Strg+Shift+P, dann
  • Wählen Sie Maven: Create Maven-Procekt
  • Wählen Sie maven-archetype-quickstart
  • Wählen Sie die aktuelle Vision wie 1.4
  • Geben Sie Ihre Gruppen-ID wie com.testservlet ein
  • Geben Sie Ihre Artefakt-ID wie servlet ein
  • Suchen Sie Ihren Zielordner, den Sie zuvor erstellt haben, und generieren Sie dort das Projekt.

Task File anlegen

Wir müssen nun ein tasks file konfigurieren das besagt wie das Maven Projekt zu kompilieren ist.

  • Aus VSCode mit Strg+Shift+P, dann
  • Tasks: Configure task
  • Create tasks.json from template
  • maven: executes common maven command

Anschliessen wir ein leeres default tasks.json file generiert. Das passen wir nun so an:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "compile",
            "type": "shell",
            "command": "mvn -B compile",
            "group": "build"
        },
        {
            "label": "test",
            "type": "shell",
            "command": "mvn -B test",
            "group": "test"
        }
    ]
}

Nun kompilieren wir unser maven Projekt, dazu in VSCode in der top bar auf Terminal, Run Build Task und dann compile.

Dependencies hinzufügen

Bevor wir loslegen können, müssen wir für unser Servlet noch wesentliche Dependencies deklarieren, ansonsten kann das Servlet nicht erstellt werden. Dazu fügen wir im pom.xmlFile folgenden Inhalt hinzu:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.2</version>
</dependency>
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>8.0</version>
    <scope>provided</scope>
</dependency>

Servlet erstellen

Wir löschen die default Klasse App.java und erstellen folgende neue NewServlet.java Klasse unter diesem Pfad: src\main\java\com\myservlet\NewServlet.java

package com.myservlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * NewServlet
 */
@WebServlet(urlPatterns = "/mambo.do")
public class NewServlet extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try ( PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet NewServlet</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet NewServlet at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

web.xml File anlegen

  • Erstelle unter dem Pfad "src/main/" den Ordner webapp (wenn nicht bereits vorhanden).
  • Erstelle unter dem Pfad "src/main/webapp" den Ordner "WEB-INF" und die Datei web.xml mit dem folgenden Inhalt:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>To do List</display-name>
    <welcome-file-list>
        <welcome-file>mambo.do</welcome-file>
    </welcome-file-list>
</web-app>

war File erstellen

Bevor wir die war Datei erstellen können, müssen wir sicherstellen, dass in der pom.xml Datei nicht ein jar erstellt wird, sondern ein war:

 <groupId>com.myservlet</groupId>
 <artifactId>servlet</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>war</packaging>

Nun können wir die war Datei kompilieren, dazu im Menu von VSCode auf Terminal -> Run Build Task -> compile klicken. Nachdem die war Datei kompiliert wurde, muss auf der Konsole, im Projektverzeichnis noch   

# mvn clean package

ausgeführt werden. Sofern die war Datei nun erfolgreich erstellt wurde, können wir diese nun auf den Tomcat deployen.

War File auf lokalen Tomcat deployen

In diesem Artikel steht, wie du ein Tomcat direkt in VSCode verwenden kannst.

Starte den Tomcat Server, und mache ein Rechtsklick auf den Server und wähle "Add Deployment", wähle "File". Anschliessend lade das zuvor erstellte war File hoch. Das war File wird in der Regel im Projektordner unter "target" abgelegt. Bei der Frage "Do you want to edit optional deployment parameters", wähle "no". Nun musst du noch mit einem Rechtsklick auf den Server "Publish Server (Full)" auswählen, damit die war Datei aktiv wird.

Endlich kannst du in deinem Browser unter dieser URL dein servlet aufrufen: http://localhost:8080/servlet-1.0-SNAPSHOT/

Alternativ kannst du mit Rechtsklick auf den Server "Server Actions", "Show in Browser" auswählen.