web-dev-qa-db-fra.com

Est-il possible avec Spring Boot de servir des JSP avec un package JAR?

Je connais bien l'application exemple Spring Boot JSP

Cependant, cet exemple utilise l'emballage WAR. Est-il possible de faire la même chose avec <packaging>JAR</packaging>?

Mon objectif est de placer JSPs sous src/main/resources/jsp afin de simplifier la structure de mon application.

13
checketts

Comme @Andy Wilkinson a déclaré, il existe des limitations liées à JSP. Veuillez emballer votre application sous la forme war et l'exécuter sous la forme jar. Ceci est documenté sur le site de printemps.

Avec Tomcat, cela devrait fonctionner si vous utilisez un emballage de guerre, c’est-à-dire qu’une guerre exécutable fonctionnera (...). Un fichier jar exécutable ne fonctionnera pas à cause d'un modèle de fichier codé en dur dans Tomcat.


Obsolète, ancienne réponse

Oui, cela est possible avec Spring Boot.

Regardez cet exemple: https://github.com/mariuszs/spring-boot-web-jsp-example .

Pour ce faire, utilisez spring-boot-maven-plugin ou équivalent.

Avec ce plugin, jar est exécutable et peut servir des fichiers JSP.

$ mvn package
$ Java -jar target/mymodule-0.0.1-SNAPSHOT.jar 

ou juste

$ mvn spring-boot:run
20
MariuszS

Avec Tomcat, il est également possible de mettre le contenu de votre WEB-INF/jsp à /src/main/resources/META-INF/resources (en utilisant Maven comme exemple). META-INF/resources est essentiellement traité comme votre dossier webapps traditionnel.

Pour plus de détails, voir: http://hillert.blogspot.com/2016/03/spring-boot-with-jsp-in-executable-jar.html

Exemple de code: https://github.com/ghillert/spring-boot-jsp-demo

7
Gunnar Hillert

Si votre springboot est en train de construire votre projet et de l'exécuter correctement sur un serveur local, alorsYES. Ce que vous devez faire est de générer le projet à l'aide de mvn -U clean package. Ensuite, dans le dossier target , vous avez votre fichier exécutable xxxx.jar. Maintenant, ce que vous devez faire est de placer votre fichier xxxx.jar dans le serveur ou à l'endroit souhaité avec le src/main/webapp/WEB-INF/jsp/ * .jsp fichiers dans la même hiérarchie . puis essayez Java -jar xxxx.jar Votre projet sera exécuté sans problème.

`
.
├── src
│   └── main
│       └── webapp
│           └── WEB-INF
│               ├── jsp
│               │   ├── default.jsp
│               │   ├── help.jsp
│               │   ├── index.jsp
│               │   ├── insert.jsp
│               │   ├── login.jsp
│               │   ├── modify.jsp
│               │   ├── search.jsp
│               │   └── show.jsp
│               └── web.xml
├── xxx.jar
└── xxx.jar.original`

Java -jar xxx.jar

<pre>    
$Java -jar xxx.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.4.RELEASE)

2017-09-05 19:31:05.009  INFO 10325 --- [           main] com.myapp.app.DemoApplication         : Starting DemoApplication v0.0.1-SNAPSHOT on dipu-HP with PID 10325 (/home/dipu/Documents/workspace-sts/jspjartest/xxx.jar started by dipu in /home/dipu/Documents/workspace-sts/jspjartest)
2017-09-05 19:31:05.014  INFO 10325 --- [           main] com.myapp.app.DemoApplication         : No active profile set, falling back to default profiles: default
2017-09-05 19:31:05.138  INFO 10325 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e5e91e4: startup date [Tue Sep 05 19:31:05 IST 2017]; root of context hierarchy
2017-09-05 19:31:07.258  INFO 10325 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8090 (http)
2017-09-05 19:31:07.276  INFO 10325 --- [           main] o.Apache.catalina.core.StandardService   : Starting service [Tomcat]
2017-09-05 19:31:07.278  INFO 10325 --- [           main] org.Apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.15
2017-09-05 19:31:08.094  INFO 10325 --- [ost-startStop-1] org.Apache.jasper.servlet.TldScanner     : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2017-09-05 19:31:08.396  INFO 10325 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-09-05 19:31:08.401  INFO 10325 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3267 ms
2017-09-05 19:31:08.615  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-09-05 19:31:08.617  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'loginServlet' to [/loginServlet/]
2017-09-05 19:31:08.618  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'uploadController' to [/uploadController/]
2017-09-05 19:31:08.622  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-09-05 19:31:08.622  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-09-05 19:31:08.623  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-09-05 19:31:08.623  INFO 10325 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-09-05 19:31:09.137  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e5e91e4: startup date [Tue Sep 05 19:31:05 IST 2017]; root of context hierarchy
2017-09-05 19:31:09.286  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user-management]}" onto Java.lang.String com.myapp.app.DemoController.user()
2017-09-05 19:31:09.288  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto Java.lang.String com.myapp.app.DemoController.reload()
2017-09-05 19:31:09.290  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/show]}" onto Java.lang.String com.myapp.app.DemoController.show()
2017-09-05 19:31:09.292  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/modify]}" onto Java.lang.String com.myapp.app.DemoController.modify()
2017-09-05 19:31:09.293  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin]}" onto Java.lang.String com.myapp.app.DemoController.admin()
2017-09-05 19:31:09.294  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/login]}" onto Java.lang.String com.myapp.app.DemoController.login()
2017-09-05 19:31:09.294  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/faq-management]}" onto Java.lang.String com.myapp.app.DemoController.faq()
2017-09-05 19:31:09.294  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/subject-area]}" onto Java.lang.String com.myapp.app.DemoController.subject()
2017-09-05 19:31:09.295  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/Chat]}" onto Java.lang.String com.myapp.app.DemoController.index()
2017-09-05 19:31:09.295  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/delete]}" onto Java.lang.String com.myapp.app.DemoController.delete()
2017-09-05 19:31:09.296  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/result]}" onto Java.lang.String com.myapp.app.DemoController.result()
2017-09-05 19:31:09.296  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/insert]}" onto Java.lang.String com.myapp.app.DemoController.insert()
2017-09-05 19:31:09.300  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/fileUpload]}" onto Java.lang.String com.myapp.app.DemoController.file()
2017-09-05 19:31:09.301  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/search]}" onto Java.lang.String com.myapp.app.DemoController.search()
2017-09-05 19:31:09.301  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/help]}" onto Java.lang.String com.myapp.app.DemoController.help()
2017-09-05 19:31:09.312  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/LoginServlet]}" onto public void com.myapp.app.LoginServlet.LoginServlet.doPost(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException,Java.io.IOException
2017-09-05 19:31:09.313  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/image],methods=[GET],produces=[text/html;charset=UTF-8]}" onto public Java.lang.String com.myapp.app.controller.ImageController.image()
2017-09-05 19:31:09.316  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/authenticate],methods=[POST]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.authenticate(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.317  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/searchCompany],methods=[GET]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.getCompany(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.318  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/executeQuery],methods=[GET]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.executeQuery(Java.lang.String,Java.lang.String,Java.lang.String,Java.lang.String,Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.318  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/insertData],methods=[POST]}" onto public int com.myapp.app.controller.AjaxController.insertResources(Java.lang.String,Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.319  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/showData],methods=[GET]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.showResources(Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.319  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/searchData],methods=[POST]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.getSearchData(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.319  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/deleteData],methods=[POST]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.deleteData(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.320  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/modifyData],methods=[POST]}" onto public int com.myapp.app.controller.AjaxController.modifyData(Java.lang.String,Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.322  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/suggestWords],methods=[POST]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.suggestWords(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.322  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/authenticateUser],methods=[POST]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.authenticateUser(Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.323  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/insertJson],methods=[POST]}" onto public int com.myapp.app.controller.AjaxController.insertJsonResources(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.323  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getvalue],methods=[GET]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.getResource(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.324  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/searchQuery],methods=[GET]}" onto public Java.lang.String com.myapp.app.controller.AjaxController.getResources(Java.lang.String,Java.lang.String) throws Java.io.IOException
2017-09-05 19:31:09.330  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/upload],methods=[POST]}" onto public void com.myapp.app.controller.UploadController.doPost(org.springframework.web.multipart.MultipartFile,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException,Java.io.IOException
2017-09-05 19:31:09.333  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-09-05 19:31:09.334  INFO 10325 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<Java.util.Map<Java.lang.String, Java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-09-05 19:31:09.388  INFO 10325 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-05 19:31:09.388  INFO 10325 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-05 19:31:09.461  INFO 10325 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-05 19:31:09.752  INFO 10325 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-09-05 19:31:09.861  INFO 10325 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8090 (http)
2017-09-05 19:31:09.867  INFO 10325 --- [           main] com.myapp.DemoApplication         : Started DemoApplication in 5.349 seconds (JVM running for 5.866)

</pre>

ici le serveur est en cours d'exécution

$ curl 127.0.0.1:8090/login Welcome to Login page

Mon POM.xml

<code>
    
        <project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        	xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
        	<modelVersion>4.0.0</modelVersion>
        <groupId>com.myapp</groupId>
        	<artifactId>app</artifactId>
        	<version>0.0.1-SNAPSHOT</version>
        	<packaging>jar</packaging> 
        	<name>Jsp Springboot</name>
        	<description>Jsp Springboot</description> 
        	<parent>
        		<groupId>org.springframework.boot</groupId>
        		<artifactId>spring-boot-starter-parent</artifactId>
        		<version>1.5.4.RELEASE</version>
        		<relativePath/> 
        	</parent> 
        	<properties>
        		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        		<Java.version>1.8</Java.version>
        	</properties> 
        	<dependencies>
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter</artifactId>
        		</dependency> 
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-test</artifactId>
        			<scope>test</scope>
        		</dependency>
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-web</artifactId>
        		</dependency> 
        		
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-Tomcat</artifactId>
        			<scope>provided</scope>
        		</dependency> 
        		
        		
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            </dependency> 
        		
        		<dependency>
        			<groupId>org.Apache.Tomcat.embed</groupId>
        			<artifactId>Tomcat-embed-jasper</artifactId>
        			<scope>provided</scope>
        		</dependency> 
        		<!-- Need this to compile JSP,
        			Tomcat-embed-jasper version is not working, no idea why -->
        		<dependency>
        			<groupId>org.Eclipse.jdt.core.compiler</groupId>
        			<artifactId>ecj</artifactId>
        			<version>4.6.1</version>
        			<scope>provided</scope>
        		</dependency>
        		 
        		
        		<dependency>
        			<groupId>org.webjars</groupId>
        			<artifactId>bootstrap</artifactId>
        			<version>3.3.7</version>
        		</dependency>
        		
        		
        <dependency>
            <groupId>org.Apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
        		
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>rest</artifactId>
            <version>5.5.1</version>
        </dependency>
        		
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>
            
            <dependency>
                <groupId>org.Apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.16</version>
            </dependency>
            
            <dependency>
                <groupId>org.Apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.16</version>
            </dependency>
            
            <dependency>
                <groupId>org.Apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>3.16</version>
            </dependency>
    
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency> 
        	</dependencies> 
        	<build>
        		<plugins>
        			<plugin>
        				<groupId>org.springframework.boot</groupId>
        				<artifactId>spring-boot-maven-plugin</artifactId>
        			</plugin>
        <plugin>
        				<groupId>org.Apache.maven.plugins</groupId>
        				<artifactId>maven-surefire-plugin</artifactId>
        				<configuration>
        					<useSystemClassLoader>false</useSystemClassLoader>
        				</configuration>
        			</plugin> 
        		
        		</plugins>
        	</build>
        </project>
    

mon application.properties

<code>
    spring.mvc.view.prefix: /WEB-INF/jsp/
    spring.mvc.view.suffix: .jsp
    server.port=8090
</code>

Ma structure de projet

<code>
.
├── src
│   └── main
│       ├── Java
│       │   └── com
│       │       └── myapp
│       │           └── app
│       │               ├── mynewapp
│       │               ├── controller
│       ├── resources
│       │   └── static
│       │       ├── assets
│       │       │   ├── css
│       │       │   │   ├── fonts
│       │       │   │   └── lib
│       │       │   ├── img
│       │       │   └── js
│       │       │       └── lib
│       │       ├── css
│       │       │   └── img
│       │       ├── fonts
│       │       ├── images
│       │       └── js
│       │           └── img
│       └── webapp
│           └── WEB-INF
│               ├── jsp
│               └── lib
</code>

Je vous remercie.

4
bhawnesh dipu

Votre meilleur pari est de changer le type d’emballage en guerre et cela devrait fonctionner sans autre changement. 

Comme mentionné dans l'un des commentaires ci-dessus, il existe certaines limitations:

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations

4
aliwister

27.3.5 Limitations JSP

Lorsque vous exécutez une application Spring Boot qui utilise un conteneur de servlet intégré (et est packagée en tant qu'archive exécutable), la prise en charge JSP présente certaines limitations.

Avec Tomcat, cela devrait fonctionner si vous utilisiez un emballage de guerre, c’est-à-dire qu’une guerre exécutable fonctionnait et pouvait également être déployée dans un conteneur standard (sans limitation, mais incluant Tomcat). 

Un fichier jar exécutable ne fonctionnera pas à cause d'un modèle de fichier codé en dur dans Tomcat.

Avec Jetty, cela devrait fonctionner si vous utilisiez un emballage de guerre, c’est-à-dire qu’une guerre exécutable fonctionnait et pouvait également être déployée dans n’importe quel conteneur standard.

Undertow ne prend pas en charge les JSP.

La création d’une page personnalisée error.jsp ne remplacera pas la vue par défaut pour la gestion des erreurs, mais des pages d’erreur personnalisées seront utilisées.

3
RBuser2769569

Spring Boot est assez bon avec JSP et c'est peu facile aussi vous avez juste besoin de la configuration ci-dessous 

1 - Dépendance Tomcat-embad-jasper

<dependency>
      <groupId>org.Apache.Tomcat.embed</groupId>
      <artifactId>Tomcat-embed-jasper</artifactId>
      <scope>provided</scope>
</dependency>

2 - La configuration ci-dessous est application.properties 

spring.mvc.view.prefix: /
spring.mvc.view.suffix: .jsp

C'est encore avoir un doute alors vérifiez-le ci-dessous lien

Intégration Spring Boot et JSP

2
jeet singh parmar

Si, pour une raison quelconque, vous ne pouvez pas traiter avec un emballage de guerre, il y a un bidouillage. Tout le mérite de this guy de le faire pour une version plus ancienne de spring-boot.

Une façon de procéder consiste à personnaliser Tomcat et à ajouter BOOT-INF/classes au ResourceSet de Tomcat. Dans Tomcat, toutes les ressources analysées sont placées dans un ensemble appelé ResourceSet. Par exemple, les ressources META-INF/du package JAR de l'application dans la spécification Servlet 3.0 sont analysées et placées dans le ResourceSet. 

Nous devons maintenant trouver un moyen d’ajouter le répertoire BOOT-INF/classes du fichier Fat jar au ResourceSet. Nous pouvons le faire via l'interface Tomcat LifecycleListener, dans l'événement Lifecycle.CONFIGURE_START_EVENT, obtenez l'URL BOOT-INF/classes, puis ajoutez cette URL au WebResourceSet. Un exemple complet est ici , mais vous pouvez le faire comme suit:

import org.Apache.catalina.Context;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.embedded.Tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnProperty(name = "Tomcat.staticResourceCustomizer.enabled", matchIfMissing = true)
public class TomcatConfiguration {
    @Bean
    public WebServerFactoryCustomizer<WebServerFactory> staticResourceCustomizer() {
        return new WebServerFactoryCustomizer<WebServerFactory>() {

        @Override
        public void customize(WebServerFactory factory) {
            if (factory instanceof TomcatServletWebServerFactory) {
                ((TomcatServletWebServerFactory) factory)
                        .addContextCustomizers(new org.springframework.boot.web.embedded.Tomcat.TomcatContextCustomizer() {
                            @Override
                            public void customize(Context context) {
                                context.addLifecycleListener(new StaticResourceConfigurer(context));
                            }
                        });
                }
            }
        };
    }
}

Et utilisez ensuite le LifecycleListener comme ceci:

import Java.io.File;
import Java.net.MalformedURLException;
import Java.net.URL;

import org.Apache.catalina.Context;
import org.Apache.catalina.Lifecycle;
import org.Apache.catalina.LifecycleEvent;
import org.Apache.catalina.LifecycleListener;
import org.Apache.catalina.WebResourceRoot.ResourceSetType;
import org.springframework.util.ResourceUtils;

public class StaticResourceConfigurer implements LifecycleListener {

    private final Context context;

    StaticResourceConfigurer(Context context) {
        this.context = context;
    }

    @Override
    public void lifecycleEvent(LifecycleEvent event) {
        if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {
            URL location = this.getClass().getProtectionDomain().getCodeSource().getLocation();

            if (ResourceUtils.isFileURL(location)) {
                // when run as exploded directory
                String rootFile = location.getFile();
                if (rootFile.endsWith("/BOOT-INF/classes/")) {
                    rootFile = rootFile.substring(0, rootFile.length() - "/BOOT-INF/classes/".length() + 1);
                }
                if (!new File(rootFile, "META-INF" + File.separator + "resources").isDirectory()) {
                    return;
                }

                try {
                    location = new File(rootFile).toURI().toURL();
                } catch (MalformedURLException e) {
                    throw new IllegalStateException("Can not add Tomcat resources", e);
                }
            }

            String locationStr = location.toString();
            if (locationStr.endsWith("/BOOT-INF/classes!/")) {
                // when run as fat jar
                locationStr = locationStr.substring(0, locationStr.length() - "/BOOT-INF/classes!/".length() + 1);
                try {
                    location = new URL(locationStr);
                } catch (MalformedURLException e) {
                    throw new IllegalStateException("Can not add Tomcat resources", e);
                }
            }
            this.context.getResources().createWebResourceSet(ResourceSetType.RESOURCE_JAR, "/", location,
                    "/META-INF/resources");

        }
    }
}
1
code4kix

J'utiliseJSP avec succès sur Spring Boot Application avec jar packaging , je place mes fichiers JSP dans le répertoire src/main/webapp/WEB-INF/JSP et je configure mon application. comme ci-dessous 

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/JSP/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

Mon contrôleur est:

@Controller
public class HelloController {

    @RequestMapping(value = { "/", "/hello**" }, method = RequestMethod.GET)
    public ModelAndView welcomePage() {
        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Example");
        model.addObject("message", "This is Hello World!");
        model.setViewName("hello");
        System.out.println("° ° ° ° welcomePage running. model = " + model);
        return model;
    }
    . . . 

Et mon hello.jsp est

<%@taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core"%>
<%@page session="true"%>
<html>
<body>
    <h1>Title : ${title}</h1>   
    <h1>${message}</h1>
    <h2>Options: 
        <a href="<c:url value="/hello" />" >Home</a> | 
        <a href="<c:url value="/admin" />" >Administration</a> | 
        <a href="<c:url value="/super" />" >Super user</a>
        <c:if test="${pageContext.request.userPrincipal.name != null}"> |
            <a href="<c:url value="/logout" />" >Logout</a> 
        </c:if>
    </h2>   
</body>
</html>

Mon fichier pom.xml est

<groupId>br.com.joao-parana</groupId>
<artifactId>my-spring-boot-app</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>my-spring-boot-app Maven Webapp</name>
<url>http://maven.Apache.org</url>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.4.RELEASE</version>
</parent>
<properties>
    <Java.version>1.8</Java.version>
</properties>
<dependencies>
    . . . 
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.Tomcat.embed</groupId>
        <artifactId>Tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
<build>
    <finalName>my-spring-boot-app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

J'espère que cela aidera quelqu'un! 

1
João Paraná

Bonjour, je découvre comment copier les fichiers JSP d'un fichier jar vers un dossier Tomcat intégré 

package com.demosoft.stlb.loadbalancer;


import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.context.ServletContextAware;

import javax.annotation.PostConstruct;
import javax.servlet.ServletContext;
import Java.io.*;
import Java.net.MalformedURLException;
import Java.util.Enumeration;
import Java.util.jar.JarEntry;
import Java.util.jar.JarFile;

@Component
public class JarFileResourcesExtractor implements ServletContextAware {

private String resourcePathPattern = "WEB-INF/**";
private String resourcePathPrefix = "WEB-INF/";
private String destination = "/WEB-INF/";
private ServletContext servletContext;
private AntPathMatcher pathMatcher = new AntPathMatcher();



/**
 * Extracts the resource files found in the specified jar file into the destination path
 *
 * @throws IOException           If an IO error occurs when reading the jar file
 * @throws FileNotFoundException If the jar file cannot be found
 */
@PostConstruct
public void extractFiles() throws IOException {
    try {
        JarFile jarFile = (JarFile) getClass().getProtectionDomain().getCodeSource().getLocation().getContent();
        Enumeration<JarEntry> entries = jarFile.entries();
        System.out.println("Tomcat destination : " + servletContext.getRealPath(destination));
        while (entries.hasMoreElements()) {
            processJarEntry(jarFile, entries);
        }

    } catch (MalformedURLException e) {
        throw new FileNotFoundException("Cannot find jar file in libs: ");
    } catch (IOException e) {
        throw new IOException("IOException while moving resources.", e);
    }
}

private void processJarEntry(JarFile jarFile, Enumeration<JarEntry> entries) throws IOException {
    JarEntry entry = entries.nextElement();
    if (pathMatcher.match(resourcePathPattern, entry.getName())) {
        String fileName = getFileName(entry);
        if (checkFileName(fileName)) return;
        String sourcePath = getSourcePath(entry, fileName);
        if (checkSourcePath(sourcePath)) return;
        copyAndClose(jarFile.getInputStream(entry), getOutputStream(fileName, sourcePath));

    }
}

private FileOutputStream getOutputStream(String fileName, String sourcePath) throws IOException {
    File destinationFolder = new File(servletContext.getRealPath(destination)+sourcePath);
    destinationFolder.mkdirs();
    File materializedFile = new File(destinationFolder, fileName);
    materializedFile.createNewFile();
    return new FileOutputStream(materializedFile);
}

private boolean checkSourcePath(String sourcePath) {
    return sourcePath.startsWith(".idea");
}

private String getSourcePath(JarEntry entry, String fileName) {
    String sourcePath = entry.getName().replaceFirst(fileName, "");
    sourcePath = sourcePath.replaceFirst(resourcePathPrefix, "").trim();
    return sourcePath;
}

private boolean checkFileName(String fileName) {
    return fileName.trim().equals("");
}

private String getFileName(JarEntry entry) {
    return entry.getName().replaceFirst(".*\\/", "");
}

@Override
public void setServletContext(ServletContext servletContext) {
    this.servletContext = servletContext;
}

public static int IO_BUFFER_SIZE = 8192;

private static void copyAndClose(InputStream in, OutputStream out) throws IOException {
    try {
        byte[] b = new byte[IO_BUFFER_SIZE];
        int read;
        while ((read = in.read(b)) != -1) {
            out.write(b, 0, read);
        }
    } finally {
        in.close();
        out.close();
    }
}
}
0
Andrey Korkoshko