[JAVA] Mit Tomcat können Sie Platzhalter ($ {...}) in web.xml verwenden.

Ich benutze Tomcat seit vielen Jahren und (zum ersten Mal) habe ich gelernt, dass Platzhalter ($ {...}) in web.xml verwendet werden können. (Ich wusste, dass es mit Tomcat-spezifischen Konfigurationsdateien (server.xml und context.xml) verwendet werden kann ...)

Important:

** Nur für den Fall ... Platzhalter sind keine Spezifikation der Servlet-API, verstehen Sie mich also nicht falsch! !! ** **.

Versuchen Sie vorerst Platzhalter zu verwenden

Geben Sie hier das Sitzungszeitlimit als Platzhalter ein und versuchen Sie, den tatsächlichen Wert aus den Systemeigenschaften abzurufen.

web.xml


<session-config>
    <session-timeout>${session.timeout}</session-timeout>
    <!-- ... -->
</session-config>

Wenn Sie beim Starten von Tomcat " -Dsession.timeout = 1 "als VM-Argument angeben, beträgt das Sitzungszeitlimit 1 Minute.

Aber ... Sie können den Standardwert nicht angeben

In der von Tomcat bereitgestellten Standardimplementierung kann der Standardwert (der Wert, der angewendet werden soll, wenn die Eigenschaft nicht definiert ist, nicht im Platzhalter angegeben werden.) Beispiel: In der von Spring Framework bereitgestellten Platzhalterfunktion "$ {Eigenschaftsname ". : Standardwert}" kann ausgedrückt werden) Definieren Sie daher bei Verwendung der von Tomcat bereitgestellten Platzhalterfunktion nicht die entsprechende Eigenschaft in "$ CATALINA_BASE / conf / catalogina.properties" oder "Systemeigenschaft (-D Eigenschaftsname = Eigenschaftswert"). Es funktioniert nicht wie erwartet.

In einem solchen Fall ... Passen Sie die Standardimplementierung von Tomcat an?

Wenn Sie beim Starten von Tomcat als VM-Argument "` -Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE = org.apache.tomcat.util.IntrospectionUtils.PropertySource-Schnittstellenimplementierungsklasse "angeben, ist die angegebene Klasse die Standardeinstellung von Tomcat. Es wird der Implementierung vorgezogen.

Testversion ... Erstellen Sie eine Klasse, die den Ausdruck "$ {Eigenschaftsname: Standardwert}" aktiviert, der von der vom Spring Framework bereitgestellten Platzhalterfunktion unterstützt wird, und wenden Sie ihn auf Tomcat an. Ich werde. (** Die Implementierung ist ziemlich grob, also kopiere sie nicht w **)

pom.xml


<!--Organisation für Entwicklungsprojekte.apache.tomcat.util.IntrospectionUtils.Artefakt mit PropertySource hinzugefügt-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>8.5.20</version>
    <scope>provided</scope>
</dependency>

IntrospectionUtils.PropertySource-Implementierungsklasse


package com.example.tomcat.propertysource;

import org.apache.tomcat.util.IntrospectionUtils;

public class CustomTomcatPropertySource implements IntrospectionUtils.PropertySource {
    @Override
    public String getProperty(String key) {
        String[] keyElements = key.split(":");
        if (keyElements.length == 2) {
            return System.getProperty(keyElements[0].trim(), keyElements[1].trim());
        }
        return null; //Wenn null zurückgegeben wird, wird die Standardimplementierung von Tomcat verwendet
    }

}

Speichern Sie die JAR-Datei mit der Implementierungsklasse der Schnittstelle org.apache.tomcat.util.IntrospectionUtils.PropertySource im Verzeichnis" $ CATALINA_BASE / lib"und setzen Sie das VM-Argument beim Starten von Tomcat auf"-Dorg.apache". Geben Sie "tomcat.util.digester.PROPERTY_SOURCE = com.example.tomcat.propertysource.CustomTomcatPropertySource`" an.

web.xml


<session-config>
    <session-timeout>${session.timeout:1}</session-timeout>
    <!-- ... -->
</session-config>

Auf diese Weise können Sie Standardwerte für Platzhalter in Tomcat angeben.

Es ist eine Schemaverletzung für web.xml w

Ich habe es bisher eingeführt, aber ... <session-timeout> ist ein Integer-Typ auf der XSD von web.xml, sodass in der IDE ein Schemaverletzungsfehler auftritt, der ziemlich subtil ist. Richtig.

Zusammenfassung

(Immerhin w) Grundsätzlich scheint es gut, Platzhalter (umgebungsabhängige Werte) in web.xml nicht zu behandeln. Selbst wenn es (vorübergehend) verwendet wird, ist es nicht gut, es so zu verwenden, dass es gegen das Schema verstößt. Ich denke, es ist besser, es nur mit den Parameterwerten des init-param-Systems zu verwenden.

Referenzseite

Recommended Posts

Mit Tomcat können Sie Platzhalter ($ {...}) in web.xml verwenden.
In Redmine können Sie das Projekt mit Project.find (<Kennung>) abrufen.
Verwenden Sie den Konstruktor mit Argumenten in cucumber-picocontainer
Verwenden Sie Stream in Java?
Bis Sie die H2-Datenbank im Servermodus mit Dropwizard mithilfe von Eclipse verwenden und eine Verbindung mit DB Viewer herstellen können.
Seien Sie beim Upgrade vorsichtig, wenn Sie | usw. in der Tomcat-URL verwenden
Verwenden Sie JDBC Manager mit den Einstellungen in jdbc.dicon.
[Gute Nachrichten] Sie können immer noch mit Java 8 gehen !!
Sie verwenden den Kontext, um MDC mit Spring WebFlux zu verwenden
[Swift] Verwenden Sie nonzeroBitCount, wenn Sie in Swift popcnt möchten
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
Sie können @Param mit Kotlin 1.1 und MyBatis 3.4.1+ eliminieren! !!
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
So wechseln Sie Tomcat context.xml mit Eclipse WTP
Verwendung der Z3-Bibliothek in Scala mit Eclipse
Sie können es mit Kopie tun! Aspektorientierte Programmierung (Android)
Spielen Sie mit Java-Funktionsknoten, die Java mit Node-RED verwenden können
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 1 beginnen
Verwendung der JDD-Bibliothek in Scala mit Eclipse
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 2 beginnen