Ich habe Spring Boot + Jsp, und von this post Ich weiß, wenn JSP-Dateien in src/main/resources/META-INF/resources/
auch als ausführbares Glas verpackt.Über Modify Spring Boot 1.5.3 zur Unterstützung erkennen JSP-Dateien
Leider, wenn ich Frühling Boot Version von 1.4.2
zu 1.5.3
ändern, kann es 404 nicht unterstützen und zurückgeben. Nach Stunden, die ihre Quellcodes verfolgen und vergleichen, weiß ich, warum 1.5.3
es nicht unterstützen kann.
Spring boot 1.4.2
//org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.StoreMergedWebXmlListener#onStart
private void onStart(Context context) {
ServletContext servletContext = context.getServletContext();
if(servletContext.getAttribute("org.apache.tomcat.util.scan.MergedWebXml") == null) {
servletContext.setAttribute("org.apache.tomcat.util.scan.MergedWebXml", this.getEmptyWebXml());
}
// only 1.4.2 has this line and with this code could recognise jsp files in /META-INF/resources/
TomcatResources.get(context).addClasspathResources();
}
Frühling Boot 1.5.3
private void onStart(Context context) {
ServletContext servletContext = context.getServletContext();
if (servletContext.getAttribute(MERGED_WEB_XML) == null) {
servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml());
}
}
Deshalb möchte ich wissen, warum nach 1.4.2 diesen Code zu entfernen haben?
TomcatResources.get(context).addClasspathResources();
Und weil ich immer noch 1.5.3 verwenden möchten, so habe ich manuell von unten Art und Weise Code
1.Kopieren Quelle TomcatEmbeddedServletContainerFactory
zu aktuellen Classpath
2 diesen Code hinzuzufügen. Do unten ändern
private void onStart(Context context) {
ServletContext servletContext = context.getServletContext();
if (servletContext.getAttribute(MERGED_WEB_XML) == null) {
servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml());
}
// Add below code
ClassLoader loader = getClass().getClassLoader();
URL[] urLs = ((URLClassLoader) loader).getURLs();
List<URL> list = new ArrayList<>();
//String file = "file:/Users/zhugw/workspace/boot-jar-serving-jsp/boot-jar-serving-jsp-1.0-SNAPSHOT.jar!/";
String file = urLs[0].getFile().replaceFirst("BOOT-INF/classes!/", "");
URL jar = new URL("jar", "", file);
list.add(0,jar);
TomcatResources.get(context).addResourceJars(list);
}
und es funktioniert. Und ich möchte wissen, ob das so geht?
aber ich denke, Sie könnten diese Problemumgehung für Legacy-Projekt, aber wenn es ein neues Projekt ist, schlage ich vor, Sie verwenden erweiterte Template-Engine, z. B. "Thymeleaf" und ich fühle das Kostenlernen ist nicht sehr hoch. – zhuguowei