--Erstellen Sie eine einfache Hello World-Display-Webanwendung mit der Java 8-Standardumgebung von Google App Engine + Spring Boot-Konfiguration
├── build.gradle
├── settings.gradle
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── helloworld
│ │ ├── HelloworldApplication.java
│ │ ├── HelloworldController.java
│ │ ├── HelloworldErrorController.java
│ │ └── HelloworldServletInitializer.java
│ ├── resources
│ │ ├── application.yml
│ │ ├── static
│ │ │ └── assets
│ │ │ └── helloworld.png
│ │ └── templates
│ │ ├── error.html
│ │ └── helloworld.html
│ └── webapp
│ └── WEB-INF
│ └── appengine-web.xml
└── test
└── java
└── com
└── example
└── helloworld
└── HelloworldApplicationTests.java
build.gradle
Eine Datei, die den Prozess zum Erstellen in Gradle beschreibt. Das Gradle-Plugin von Google App Engine verwendet die Serie 2.
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
//Verwenden Sie das Spring Boot Gradle Plugin
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.2.0.RELEASE'
//Verwenden Sie das Google App Engine Gradle-Plugin
classpath 'com.google.cloud.tools:appengine-gradle-plugin:2.2.0'
}
}
plugins {
//Einführung des Java-Plug-Ins
id 'java'
//Einführung des War Plug-Ins
id 'war'
// https://plugins.gradle.org/plugin/org.springframework.boot
id 'org.springframework.boot' version '2.2.0.RELEASE'
// https://plugins.gradle.org/plugin/io.spring.dependency-management
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}
//App Engine Plug-In eingeführt
apply plugin: 'com.google.cloud.tools.appengine'
repositories {
mavenCentral()
}
dependencies {
//Neueste Version der App Engine API
implementation 'com.google.appengine:appengine-api-1.0-sdk:+'
// Thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
// Spring Web
implementation 'org.springframework.boot:spring-boot-starter-web'
//Der integrierte Tomcat wird bei der Bereitstellung nicht verwendet
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
// Test
testImplementation('org.springframework.boot:spring-boot-starter-test') {
//Schließen Sie die Unterstützung für JUnit 4 aus
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
//Aktivieren Sie die Unterstützung für JUnit 5
useJUnitPlatform()
testLogging {
//Anzeige der Standardausgabe und der Standardfehlerausgabe während des Tests
showStandardStreams true
//Ausgabeereignis(TestLogEvent)
events 'started', 'skipped', 'passed', 'failed'
}
}
//ID und Version der Webanwendungsgruppe
group = "com.example.helloworld"
version = "0.0.1"
//Verwenden Sie Java 8
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
//Aufgabeneinstellungen für Google App Engine
appengine {
//Bereitstellungseinstellungen
// GCLOUD_Wenn Sie CONFIG angeben
//Die in der gcloud-Konfiguration festgelegten Projektinformationen werden festgelegt
deploy {
//Stellen Sie die Ziel-Google Cloud-Projekt-ID bereit
projectId = "GCLOUD_CONFIG"
//Web-App-Version, die sich in der Bereitstellung widerspiegelt
//Wenn nicht angegeben, wird eine neue generiert
version = "GCLOUD_CONFIG"
}
}
//Führen Sie vor der Bereitstellung Tests aus
appengineDeploy.dependsOn test
appengineStage.dependsOn test
Referenz:
settings.gradle
Wenn Sie settings.gradle nicht festlegen, wechseln Sie in das übergeordnete Verzeichnis, um settings.gradle zu finden. Fügen Sie es also auch in ein einzelnes Projekt ein.
settings.gradle
rootProject.name = 'helloworld'
HelloworldApplication.java
Anwendungsklasse. Ich schreibe nur die Routineverarbeitung für die Verwendung von Spring Boot.
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
}
HelloworldController.java
Controller-Klasse.
package com.example.helloworld;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloworldController {
/**
* application.Nachricht von yml erhalten.
*/
@Value("${application.message}")
private String applicationYamlMessage;
/**
*Gibt die Antwort der oberen Seite zurück.
*
* @Informationen zur Seitenanzeige zurückgeben
*/
@GetMapping("/")
public ModelAndView index() {
System.out.println("HelloworldController#index");
//Wird aus Systemeigenschaften erhalten
String systemPropertyMessage = System.getProperty("com.example.helloworld.message");
//Stellen Sie die anzuzeigenden Daten ein
ModelAndView mav = new ModelAndView();
mav.addObject("systemPropertyMessage", systemPropertyMessage);
mav.addObject("applicationYamlMessage", applicationYamlMessage);
mav.setViewName("helloworld"); //Name anzeigen. Geben Sie die Thymeleaf-Vorlagendatei an
return mav;
}
/**
*Eine Testmethode, die eine Fehlerseite anzeigt.
*/
@GetMapping("/exception/")
public void exception() {
System.out.println("HelloworldController#exception");
throw new RuntimeException("This is a sample exception.");
}
}
HelloworldErrorController.java
Fehlercontroller-Klasse für die gesamte Webanwendung. Es verarbeitet Nicht gefunden usw., die von einer allgemeinen Controller-Klasse nicht erfasst werden können. Hier wird nur die Mindestverarbeitung beschrieben, die Sie jedoch nach Bedarf anpassen können.
package com.example.helloworld;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
*Fehlercontroller für die gesamte Webanwendung.
*Eine Implementierungsklasse für die ErrorController-Schnittstelle.
*/
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}") //Zuordnung zur Fehlerseite
public class HelloworldErrorController implements ErrorController {
/**
*Fehlerseitenpfad.
*/
@Value("${server.error.path:${error.path:/error}}")
private String errorPath;
/**
*Gibt den Pfad der Fehlerseite zurück.
*
* @Rückgabe des Fehlerseitenpfads
*/
@Override
public String getErrorPath() {
return errorPath;
}
/**
*Gibt ein ModelAndView-Objekt für die Antwort zurück.
*
* @param req Anforderungsinformationen
* @param mav Antwortinformationen
* @ModelAndView-Objekt für die Rückgabe einer HTML-Antwort
*/
@RequestMapping
public ModelAndView error(HttpServletRequest req, ModelAndView mav) {
System.out.println("HelloWorldErrorController#error");
//404 Für keinen Fehler gefunden
//Der Statorcode und der Ausgabeinhalt können nach Bedarf angepasst werden.
HttpStatus status = HttpStatus.NOT_FOUND;
mav.setStatus(status);
mav.setViewName("error"); // error.html
return mav;
}
}
HelloworldServletInitializer.java
WebApplicationInitializer-Implementierungsklasse, die für die Umgebung erforderlich ist, in der die WAR-Datei bereitgestellt und betrieben wird. Für Google App Engine muss diese Klasse WAR-Dateien bereitstellen und ausführen.
package com.example.helloworld;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class HelloworldServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
System.out.println("HelloworldServletInitializer#configure");
return application.sources(HelloworldApplication.class);
}
}
Referenz: [SpringBootServletInitializer \ (Spring Boot Docs 2 \ .2 \ .0 \ .RELEASE API )](https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/api/org/ springframework / boot / web / servlet / support / SpringBootServletInitializer.html)
application.yml
Eine Datei, die Informationen zu Webanwendungseinstellungen beschreibt. Es können auch application.properties sein. Dieses Mal werden nur die für die Anwendung eindeutigen Informationen festgelegt.
application:
message: Hello, application yaml.
helloworld.png
Ein als Beispiel platziertes Bild, das den statischen Dateispeicher zeigt. Wenn Sie die statische Datei in src / main / resources / static ablegen, wird sie http: // hostname / zugeordnet. Wenn Sie diesmal auf http: //hostname/assets/helloworld.png zugreifen, wird die Datei src / main / resources / static / assets / helloworld.png bereitgestellt.
error.html
HTML Thymeleaf-Vorlagendatei, die angezeigt wird, wenn ein Fehler auftritt. Diesmal ist der dynamische Wert nicht eingebettet, es ist jedoch möglich, den Wert in der Fehlercontrollerklasse nach Bedarf festzulegen und so anzupassen, dass er auf der Vorlagenseite angezeigt wird.
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
</body>
</html>
helloworld.html
Eine HTML-Thymeleaf-Vorlagendatei zum Anzeigen der von der Controller-Klasse festgelegten Werte.
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello, world.</title>
</head>
<body>
<h1>Hello, world.</h1>
<div th:text="'System Property: ' + ${systemPropertyMessage}"></div>
<div th:text="'application.yml: ' + ${applicationYamlMessage}"></div>
<div><img src="./assets/helloworld.png "></div>
</body>
</html>
appengine-web.xml
Konfigurationsdatei für Google App Engine. Beschreiben der Informationen der Webanwendung.
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<!-- Java VM -->
<runtime>java8</runtime>
<!--Gewindesichere Einstellung-->
<threadsafe>true</threadsafe>
<!--Autoscale-Einstellung für die Anzahl der Instanzen-->
<automatic-scaling>
<!--Starten Sie eine neue Instanz, wenn der hier angegebene CPU-Auslastungsfaktor überschritten wird-->
<target-cpu-utilization>0.95</target-cpu-utilization>
<!--Mindestanzahl von Instanzen. Wenn auf 0 gesetzt, ist die Anzahl der Instanzen 0, wenn sie nicht verwendet werden.-->
<min-instances>0</min-instances>
<!--Maximale Anzahl von Instanzen-->
<max-instances>1</max-instances>
<!--Zulässige Anzahl gleichzeitiger Anfragen-->
<max-concurrent-requests>80</max-concurrent-requests>
</automatic-scaling>
<!--Statische Datei-->
<static-files>
<include path="/assets/**.*"/>
</static-files>
<!--Systemeigenschaften aktiviert, wenn sie in Google App Engine oder mit gradle appengineRun ausgeführt werden-->
<system-properties>
<property name="com.example.helloworld.message" value="Hello, system property."/>
</system-properties>
</appengine-web-app>
Referenz: appengine-web.XML-Referenz|Java 8 App Engine-Standardumgebung| Google Cloud
HelloworldApplicationTests.java
Minimale Testklasse. Es werden nur formale Dinge beschrieben. Testet eigentlich nichts.
package com.example.helloworld;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class HelloworldApplicationTests {
@Test
void contextLoads() {
}
}
Sie können den Test mit der Gradle-Testaufgabe ausführen.
$ gradle test
Sie können den lokalen Server http: // localhost: 8080 / mit gradle appengineRun starten.
$ gradle appengineRun
Kann mit gradle appengineDeploy in Google App Engine bereitgestellt werden.
$ gradle appengineDeploy
In einigen Fällen verwendet der Fehlercontroller keine eigene Fehlerbehandlung.
Deskriptor bereitstellen: web.xml |Java 8 App Engine-Standardumgebung| Google Cloud
Hinweis: Derzeit können benutzerdefinierte Fehlerbehandlungsroutinen für einige Fehlerbedingungen nicht konfiguriert werden. Insbesondere können Sie die HTTP 404-Antwortseite nicht anpassen, wenn für eine bestimmte URL keine Servlet-Zuordnung definiert ist. Sie können auch die Seite "403 Allocation Error" oder die Seite "500 Server Error", die aufgrund eines internen App Engine-Fehlers angezeigt wird, nicht anpassen.
Als ich es tatsächlich versuchte, 404 Nicht gefunden war nicht meine eigene Anpassung auf dem Server, den ich lokal mit gradle appengineRun eingerichtet habe. Die mit gradle appengineDeploy für Google App Engine bereitgestellte Version zeigte ihre eigene angepasste 404 Not Found an.
Recommended Posts