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! !! ** **.
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.
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.
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.
web.xml
wIch 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.
(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.
Recommended Posts