복붙노트

[SPRING] Spring 부트로 JAR 패키징으로 JSP를 제공 할 수 있습니까?

SPRING

Spring 부트로 JAR 패키징으로 JSP를 제공 할 수 있습니까?

Spring Boot JSP 샘플 애플리케이션에 익숙합니다.

그러나이 예제는 WAR 패키지를 사용합니다. JAR 을 사용하여 동일한 작업을 수행 할 수 있습니까?

내 목표는 src / main / resources / jsp 아래에 JSP를 두어 앱 구조를 단순화하는 것입니다.

해결법

  1. ==============================

    1.@Andy Wilkinson이 말했듯이, JSP와 관련된 제한 사항이 있습니다. 애플리케이션을 전쟁으로 포장하고 jar로 실행하십시오. 이것은 스프링 사이트에 기록되어 있습니다.

    @Andy Wilkinson이 말했듯이, JSP와 관련된 제한 사항이 있습니다. 애플리케이션을 전쟁으로 포장하고 jar로 실행하십시오. 이것은 스프링 사이트에 기록되어 있습니다.

    더 이상 사용되지 않는 오래된 대답

    예, 이것은 Spring Boot에서 가능합니다.

    다음 예제를 살펴보십시오. https://github.com/mariuszs/spring-boot-web-jsp-example.

    이렇게하려면 spring-boot-maven-plugin 또는 gradle 동등한 것을 사용하십시오.

    이 플러그인 jar는 실행 가능하며 JSP 파일을 제공 할 수 있습니다.

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

    또는 단지

    $ mvn spring-boot:run
    
  2. ==============================

    2.Tomcat을 사용하면 WEB-INF / jsp의 내용을 / src / main / resources / META-INF / resources (예 : Maven 사용)에 넣을 수도 있습니다. META-INF / resources는 기본적으로 전통적인 webapps 폴더처럼 취급됩니다.

    Tomcat을 사용하면 WEB-INF / jsp의 내용을 / src / main / resources / META-INF / resources (예 : Maven 사용)에 넣을 수도 있습니다. META-INF / resources는 기본적으로 전통적인 webapps 폴더처럼 취급됩니다.

    자세한 내용은 http://hillert.blogspot.com/2016/03/spring-boot-with-jsp-in-executable-jar.html을 참조하십시오.

    샘플 코드 : https://github.com/ghillert/spring-boot-jsp-demo

  3. ==============================

    3.가장 좋은 방법은 포장 유형을 전쟁으로 변경하는 것이며 더 이상 변경하지 않고 작동해야합니다.

    가장 좋은 방법은 포장 유형을 전쟁으로 변경하는 것이며 더 이상 변경하지 않고 작동해야합니다.

    위의 설명에서 언급했듯이 몇 가지 제한 사항이 있습니다.

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

  4. ==============================

    4.springboot가 프로젝트를 빌드하고 로컬 서버에서 올바르게 실행중인 경우 예. 필요한 작업은 다음을 사용하여 프로젝트를 빌드하는 것입니다.     mvn -U 깨끗한 패키지. 그런 다음 대상 폴더에 실행 가능한 xxxx.jar가 있습니다. 이제 xxxx.jar 파일을 서버에 넣거나 src / main / webapp / WEB-INF / jsp / * .jsp 파일과 함께 원하는 계층에 배치하십시오.     그런 다음 java -jar xxxx.jar을 시도하십시오. 프로젝트가 아무 문제없이 실행됩니다.

    springboot가 프로젝트를 빌드하고 로컬 서버에서 올바르게 실행중인 경우 예. 필요한 작업은 다음을 사용하여 프로젝트를 빌드하는 것입니다.     mvn -U 깨끗한 패키지. 그런 다음 대상 폴더에 실행 가능한 xxxx.jar가 있습니다. 이제 xxxx.jar 파일을 서버에 넣거나 src / main / webapp / WEB-INF / jsp / * .jsp 파일과 함께 원하는 계층에 배치하십시오.     그런 다음 java -jar xxxx.jar을 시도하십시오. 프로젝트가 아무 문제없이 실행됩니다.

    `
    .
    ├── 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>
    

    여기서 서버가 실행 중입니다.

    $ curl 127.0.0.1:8090/login         로그인 페이지에 오신 것을 환영합니다.

    우리는 PO.HML

    <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>
        
    </code>

    내 application.properties

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

    내 프로젝트 구조

    <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>
    

    고맙습니다.

  5. ==============================

    5.27.3.5 JSP 제한 사항

    27.3.5 JSP 제한 사항

    임베디드 서블릿 컨테이너를 사용하는 (그리고 실행 가능한 아카이브로 패키지 된) Spring Boot 애플리케이션을 실행할 때, JSP 지원에는 몇 가지 제한이있다.

    Tomcat을 사용하면 war 패키징을 사용하면 작동합니다. 즉, 실행 가능한 전쟁이 작동하며 표준 컨테이너 (Tomcat을 포함하되 이에 국한되지 않음)에도 배포 할 수 있습니다.

    실행 가능한 jar는 Tomcat의 하드 코딩 된 파일 패턴 때문에 작동하지 않습니다.

    Jetty를 사용하면 전쟁 패키지를 사용하면 작동합니다. 즉 실행 가능한 전쟁이 작동하며 모든 표준 컨테이너에도 배포 할 수 있습니다.

    Undertow는 JSP를 지원하지 않습니다.

    사용자 정의 error.jsp 페이지를 작성하면 오류 처리를위한 기본보기가 대체되지 않고 대신 사용자 정의 오류 페이지를 사용해야합니다.

  6. ==============================

    6.jar 패키지와 함께 Spring Boot Application에서 JSP를 성공적으로 사용하고 있습니다. src / main / webapp / WEB-INF / JSP 디렉토리에 JSP 파일을 넣고 내 응용 프로그램을 벨로우즈로 구성합니다.

    jar 패키지와 함께 Spring Boot Application에서 JSP를 성공적으로 사용하고 있습니다. src / main / webapp / WEB-INF / JSP 디렉토리에 JSP 파일을 넣고 내 응용 프로그램을 벨로우즈로 구성합니다.

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

    내 컨트롤러 :

    @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;
        }
        . . . 
    

    그리고 내 hello.jsp는

    <%@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>
    

    내 pom.xml 파일은

    <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>
    

    이 사람이 도움이되기를 바랍니다!

  7. ==============================

    7.Spring Boot는 JSP에서 사용하기에 꽤 좋으며 아래 설정이 필요합니다.

    Spring Boot는 JSP에서 사용하기에 꽤 좋으며 아래 설정이 필요합니다.

    1 - tomcat-embed-jasper 의존성

    <dependency>
          <groupId>org.apache.tomcat.embed</groupId>
          <artifactId>tomcat-embed-jasper</artifactId>
          <scope>provided</scope>
    </dependency>
    

    2 - 아래의 구성을 application.properties에 추가하십시오.

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

    그것은 아직도 약간의 의심을 품고 그 다음 그것을 링크의 아래에서 조사한다

    스프링 부트 및 JSP 통합

  8. ==============================

    8.어떤 이유로 든 전쟁 포장을 다룰 수 없다면 해킹이 있습니다. 스프링 부트의 구버전을 위해이 작업을 해준이 남자에 대한 완전한 신용.

    어떤 이유로 든 전쟁 포장을 다룰 수 없다면 해킹이 있습니다. 스프링 부트의 구버전을 위해이 작업을 해준이 남자에 대한 완전한 신용.

    이를 수행하는 한 가지 방법은 tomcat을 개인화하고 BOOT-INF / classes를 tomcat의 ResourceSet에 추가하는 것입니다. tomcat에서 스캔 된 모든 리소스는 ResourceSet이라고 불리는 것으로 옮겨집니다. 예를 들어 서블릿 3.0 사양의 응용 프로그램 jar 패키지의 META-INF / resources가 스캔되어 ResourceSet에 저장됩니다.

    이제 fat jar의 BOOT-INF / classes 디렉토리를 ResourceSet에 추가하는 방법을 찾아야합니다. tomcat LifecycleListener 인터페이스를 통해 Lifecycle.CONFIGURE_START_EVENT 이벤트에서 BOOT-INF / classes URL을 가져온 다음이 URL을 WebResourceSet에 추가 할 수 있습니다. 완전한 예가 여기에 있지만 이렇게 할 수 있습니다 :

    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));
                                }
                            });
                    }
                }
            };
        }
    }
    

    그리고 LifecycleListener를 다음과 같이 사용하십시오 :

    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");
    
            }
        }
    }
    
  9. ==============================

    9.안녕하세요 jar 파일에서 jar 파일을 포함 된 tomcat 폴더로 복사하는 방법을 알아 냈습니다.

    안녕하세요 jar 파일에서 jar 파일을 포함 된 tomcat 폴더로 복사하는 방법을 알아 냈습니다.

    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();
        }
    }
    }
    
  10. from https://stackoverflow.com/questions/21243690/is-it-possible-with-spring-boot-to-serve-up-jsps-with-a-jar-packaging by cc-by-sa and MIT license