[SPRING] Spring 부트로 JAR 패키징으로 JSP를 제공 할 수 있습니까?
SPRINGSpring 부트로 JAR 패키징으로 JSP를 제공 할 수 있습니까?
Spring Boot JSP 샘플 애플리케이션에 익숙합니다.
그러나이 예제는 WAR 패키지를 사용합니다.
내 목표는 src / main / resources / jsp 아래에 JSP를 두어 앱 구조를 단순화하는 것입니다.
해결법
-
==============================
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.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.가장 좋은 방법은 포장 유형을 전쟁으로 변경하는 것이며 더 이상 변경하지 않고 작동해야합니다.
가장 좋은 방법은 포장 유형을 전쟁으로 변경하는 것이며 더 이상 변경하지 않고 작동해야합니다.
위의 설명에서 언급했듯이 몇 가지 제한 사항이 있습니다.
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations
-
==============================
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>
내 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.27.3.5 JSP 제한 사항
27.3.5 JSP 제한 사항
임베디드 서블릿 컨테이너를 사용하는 (그리고 실행 가능한 아카이브로 패키지 된) Spring Boot 애플리케이션을 실행할 때, JSP 지원에는 몇 가지 제한이있다.
Tomcat을 사용하면 war 패키징을 사용하면 작동합니다. 즉, 실행 가능한 전쟁이 작동하며 표준 컨테이너 (Tomcat을 포함하되 이에 국한되지 않음)에도 배포 할 수 있습니다.
실행 가능한 jar는 Tomcat의 하드 코딩 된 파일 패턴 때문에 작동하지 않습니다.
Jetty를 사용하면 전쟁 패키지를 사용하면 작동합니다. 즉 실행 가능한 전쟁이 작동하며 모든 표준 컨테이너에도 배포 할 수 있습니다.
Undertow는 JSP를 지원하지 않습니다.
사용자 정의 error.jsp 페이지를 작성하면 오류 처리를위한 기본보기가 대체되지 않고 대신 사용자 정의 오류 페이지를 사용해야합니다.
-
==============================
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.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.어떤 이유로 든 전쟁 포장을 다룰 수 없다면 해킹이 있습니다. 스프링 부트의 구버전을 위해이 작업을 해준이 남자에 대한 완전한 신용.
어떤 이유로 든 전쟁 포장을 다룰 수 없다면 해킹이 있습니다. 스프링 부트의 구버전을 위해이 작업을 해준이 남자에 대한 완전한 신용.
이를 수행하는 한 가지 방법은 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.안녕하세요 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(); } } }
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
'SPRING' 카테고리의 다른 글
[SPRING] JPA 2.0에서 엔티티 자동 검색 방법 (0) | 2019.01.20 |
---|---|
[SPRING] spring jpa 문서 관리자 응용 프로그램에서 저장하지 않는 문서 (0) | 2019.01.20 |
[SPRING] Spring MVC를 이용한 인코딩 문제 (0) | 2019.01.20 |
[SPRING] Hibernate는 객체를 영속화하는 동안 잘못 인코딩합니다 [UTF-8] (0) | 2019.01.20 |
[SPRING] 누락 된 이슈 javax.transaction : jta : jar : 1.0.1B (해상도가 다를 수 있으므로 문제가 다름) (0) | 2019.01.20 |