Wie Sie wissen, ist Jetty9 ein leichter und hochfunktioneller Webserver-Servlet-Container.
Hier ist ein Beispielcode, der häufig verwendete Einstellungstipps und Servlets enthält, wenn Sie Jetty9 als integrierte Java-Anwendung verwenden.
Ein funktionierender Satz von Quellcode (Maven-Projekt) finden Sie unter https://github.com/riversun/jetty9-quick-start.
Artikel zu HTTPS (SSL / TLS) mit Jetty9 sind unter https://qiita.com/riversun/items/2909019123b28471ea79 zusammengefasst.
Fügen Sie ein Servlet mit dem Namen ExampleServlet.java hinzu, das den Pfad "/ api" akzeptiert.
//ServletContextHandler behandelt Servlet
ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
//Fügen Sie ein Servlet hinzu
servletHandler.addServlet(new ServletHolder(new ExampleServlet()), "/api");
Wenn Sie versuchen, große Datenmengen hochzuladen, wird möglicherweise ** java.lang.IllegalStateException: Form zu groß ** angezeigt. Geben Sie in diesem Fall die erforderliche Größe mit ** setMaxFormContentSize ** an.
//Geben Sie die Größe des Formular-Uploads an
servletHandler.setMaxFormContentSize(1024 * 1024 * 1024);
Geben Sie die Ressourcenbasis mit ** setResourceBase ** an.
//ResourceHandler verarbeitet statische Inhalte (grob gesagt)
final ResourceHandler resourceHandler = new ResourceHandler();
//Geben Sie den Speicherort des statischen Inhalts an
resourceHandler.setResourceBase(System.getProperty("user.dir") + "/htdocs");
Es ist eine traditionelle ~~ neugierige ~~ Funktion von Webservern wie Apache. Wenn Sie die Dateiliste (Auflistung) nicht anzeigen möchten, tun Sie dies
//Liste der statischen Inhaltsdateien nicht anzeigen (Auflistung)
resourceHandler.setDirectoriesListed(false);
Kann mit ** setWelcomeFiles ** geändert werden
//Geben Sie die Datei an, die ursprünglich angezeigt werden soll
resourceHandler.setWelcomeFiles(new String[] { "index.html" });
Eine Möglichkeit, das Caching von statischen Inhalten zu deaktivieren, die HTML- und JavaScript-Entwickler plagen. ** setCacheControl ** befreit Sie von F5 wiederholten Wasserschlägen auf verbrannten Steinen.
//Nicht zwischenspeichern
resourceHandler.setCacheControl("no-store,no-cache,must-revalidate");
Es wird verwendet, wenn Sie keine Informationen wie die Versionsnummer des Stegs im HTTP-Header oder den Standardfehlerbildschirm anzeigen möchten. Es kann mit ** HttpConfig # setSendServerVersion ** eingestellt werden.
Ich werde Ihnen zwei Methoden zeigen (Was ich tun möchte, ist einfach, aber der Code ist etwas länger. Dies ist komplizierter als jetty8 mit jetty9 refactoring)
[Methode 1] Erstellen Sie Ihren eigenen http-Connector und legen Sie httpConfig fest
//Initialisieren Sie den Server mit dem Standardkonstruktor
final Server jettyServer = new Server();
jettyServer.setHandler(handlerList);
final int PORT = 8080;
//http-Konfigurationsklasse
final HttpConfiguration httpConfig = new HttpConfiguration();
//Fügen Sie keine Serverversionsinformationen in den Header ein
httpConfig.setSendServerVersion(false);
final HttpConnectionFactory httpConnFactory = new HttpConnectionFactory(httpConfig);
final ServerConnector httpConnector = new ServerConnector(jettyServer, httpConnFactory);
httpConnector.setPort(PORT);
jettyServer.setConnectors(new Connector[] { httpConnector });
[Methode 2] Ziehen Sie den (vorhandenen) http-Connector heraus und setzen Sie httpConfig
final int PORT = 8080;
final Server jettyServer = new Server(PORT );
for (Connector conn : jettyServer.getConnectors()) {
for (ConnectionFactory connFactory : conn.getConnectionFactories()) {
if (connFactory instanceof HttpConnectionFactory) {
((HttpConnectionFactory) connFactory).getHttpConfiguration().setSendServerVersion(false);
}
}
}
Ein CORS (domänenübergreifendes) Web-API-ähnliches Servlet-Beispiel, das einen JSON zurückgibt, das den oben beschriebenen Code enthält. Legen Sie die Abhängigkeit von Maven fest, kopieren und ausführen Sie sie und greifen Sie auf http: // localhost: 8080 / api? Message = hello zu.
package com.example.jetty;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Jetty9 Quick Start Example
*/
public class ServletApp
{
public static void main(String[] args) {
//ServletContextHandler behandelt Servlet
ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
//Geben Sie die Größe des Formular-Uploads an
servletHandler.setMaxFormContentSize(1024 * 1024 * 1024);
//Fügen Sie ein Servlet hinzu
servletHandler.addServlet(new ServletHolder(new ExampleServlet()), "/api");
//ResourceHandler verarbeitet statische Inhalte (grob gesagt)
final ResourceHandler resourceHandler = new ResourceHandler();
//Geben Sie den Speicherort des statischen Inhalts an
resourceHandler.setResourceBase(System.getProperty("user.dir") + "/htdocs");
//Liste der statischen Inhaltsdateien nicht anzeigen (Auflistung)
resourceHandler.setDirectoriesListed(false);
//Geben Sie die Datei an, die ursprünglich angezeigt werden soll
resourceHandler.setWelcomeFiles(new String[] { "index.html" });
//Nicht zwischenspeichern
resourceHandler.setCacheControl("no-store,no-cache,must-revalidate");
HandlerList handlerList = new HandlerList();
//Geben Sie resourceHandler als erstes an (umgekehrt wird statischer Inhalt nicht für immer aufgerufen.)
handlerList.addHandler(resourceHandler);
handlerList.addHandler(servletHandler);
//Initialisieren Sie den Server mit dem Standardkonstruktor
final Server jettyServer = new Server();
jettyServer.setHandler(handlerList);
final int PORT = 8080;
//http-Konfigurationsklasse
final HttpConfiguration httpConfig = new HttpConfiguration();
//Fügen Sie keine Serverversionsinformationen in den Header ein
httpConfig.setSendServerVersion(false);
final HttpConnectionFactory httpConnFactory = new HttpConnectionFactory(httpConfig);
final ServerConnector httpConnector = new ServerConnector(jettyServer, httpConnFactory);
httpConnector.setPort(PORT);
jettyServer.setConnectors(new Connector[] { httpConnector });
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("serial")
public static class ExampleServlet extends HttpServlet {
final ObjectMapper mObjectMapper = new ObjectMapper();
final class Result {
public boolean success;
public String message;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Abfrageparameter abrufen
final String paramMessage = req.getParameter("message");
//POJO für die Antwortspeicherung(Später in JSON konvertieren)
final Result result = new Result();
result.success = true;
result.message = "You say '" + paramMessage + "'";
// CORS(Cross-Origin Resource Sharing)Aktivieren
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
//Inhalt, der JSON zurückgibt-Setzen Sie Type auf JSON
final String CONTENT_TYPE = "application/json; charset=UTF-8";
resp.setContentType(CONTENT_TYPE);
final PrintWriter out = resp.getWriter();
//Konvertieren Sie POJO in JSON in Jackson
final String json = mObjectMapper.writeValueAsString(result);
//Generieren Sie eine Antwort
out.println(json);
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Sorry, POST is not supported");
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Sorry, PUT is not supported");
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Sorry, DELETE is not supported");
}
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// For PreFlight Access
// CORS(Cross-Origin Resource Sharing)Aktivieren
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
}
}
}
Maven
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.12.v20180830</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.4.12.v20180830</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8.1</version>
</dependency>
Der Quellcode ist hier https://github.com/riversun/jetty9-quick-start
Verwenden Sie für die detaillierte Bedienung von ** Jetty ** das Motiv "HTTPS-Server mit 20 Zeilen erstellen!" [dieser Artikel](https: / /qiita.com/riversun/items/2909019123b28471ea79).
Recommended Posts