Spring Boot 웹 애플리케이션에서 JSP 파일이 렌더링되지 않음
임베디드 Tomcat (기본값)을 사용하여 Spring Boot 웹 애플리케이션을 실행하고 있습니다. 컨트롤러에서 지정한 뷰 렌더링의 일부로 JSP 파일을 제공 할 때 JSP는 그대로 렌더링되지 않고 대신 내용을 인쇄합니다. 예를 들면 :
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>Test</body>
</html>
뷰가 브라우저에서 렌더링 될 때 예상되는 내용 대신 위의 내용이 표시됩니다.
Test
pom.xml
다음과 같이 Tomcat JSP 종속성을 지정 했는지 확인하십시오 .
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
임베디드 Tomcat은 JSP 렌더링을 선택 사항으로 취급하는 것 같습니다.
아래에서 언급했듯이이 JAR도 때때로 필요합니다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>provided</scope>
</dependency>
(이 JAR은 서블릿 컨테이너에 포함되어야하므로 제공을 추가했습니다.
pom.xml
이것이 작동하려면 하나가 아니라 두 개의 종속성 (jasper 및 jstl) 이 필요합니다.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
나를 위해 Dan이 언급 한 것처럼 똑같이 일했습니다. 제공된 범위를 제거합니다 .
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
고마워요!
나를 위해 일했지만, 나는 제거해야했습니다.
<scope>provided</scope>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Gradle을 사용할 수 있습니다 (Maven을 따라 잡고 있음). build.gradle 파일에서이 종속성을 사용하십시오.
// JSP에 필요한 종속성
providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
JSP를 통합하기 쉽기 때문에 일부 구성을 놓친 것 같습니다.
1-tomcat-embad-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
그것은 여전히 의심의 여지가 있습니다. 링크 아래에서 확인하십시오.
이전에 설명한 것 외에도 문제를 해결했습니다.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
added ViewResolver:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@ComponentScan
@EnableWebMvc
public class SpringServletConfig {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
}
보낸 사람 : 왜 Spring MVC가 404로 응답하고 "DispatcherServlet에서 URI [...]가있는 HTTP 요청에 대한 매핑을 찾을 수 없음"을보고합니까?
종속성을 변경하십시오.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
...에
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Spring-MVC 및 임베디드 Tomcat 서버를 사용하는 Spring-Boot에 대한 전체 gradle 설정 :
build.gradle
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
//WEB-MVC
compile 'org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE'
compile 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.1'
compile 'javax.servlet:jstl:1.2'
App.class
@SpringBootApplication
public final class App {
public static void main(final String[] args) {
new SpringApplicationBuilder(App.class)
.build(args)
.run();
}
@Bean
public ViewResolver viewResolver() {
final InternalResourceViewResolver r = new InternalResourceViewResolver();
r.setPrefix("/WEB-INF/jsp/");
r.setSuffix(".jsp");
return r;
}
}
때로는 tomcat-embed-jasper를 사용할 수 없으므로 tomcat-embed-jasper의 maven 종속성에서 제공된 항목을 제거해야합니다.
예.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--scope>provided</scope-->
</dependency>
1.5.8.RELEASE 또는 이와 유사한 것을 사용하려면 실행 가능한 예제와 설명이 여기에 있습니다 https://www.surasint.com/spring-boot-jsp/
pom.xml에서 필요합니다.
http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 org.springframework.boot spring-boot-starter-parent 1.5.8.RELEASE
<groupId>com.surasint.example</groupId>
<artifactId>spring-boot-02</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JSP -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- jstl for jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
그리고 이것은 application.properties에서
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
그런 다음 jsp를 / WEB-INF / jsp / 폴더에 보관합니다.
이것이 컨트롤러입니다.
package com.surasint.example.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Date;
import java.util.Map;
@Controller
public class TestController {
@GetMapping("/testjsp")
public String list(Map<String, Object> model) {
model.put("this_time",new Date().toString());
return "testjsp-view";
}
}
그 이유는 @Controller 대신 @RestController 주석을 사용하고 있기 때문입니다.
RestController로 클래스에 주석을 달 때 @RequestMapping으로 주석이 달린 모든 메서드는 기본적으로 @ResponseBody 의미론을 가정합니다. 즉, #index 메소드는 해당 값을 뷰에 매핑하는 대신 JSON으로 String /webapp/WEB-INF/index.jsp를 직렬화합니다.
답변 중 하나에서 언급했듯이
@Controller 공용 클래스 YourController {...}
내용 대신 브라우저에 jsp 파일 이름을 인쇄하는 것과 같은 문제에 직면했습니다.
pom.xml에서 jsp 페이지 렌더링을 위해 아래 스 니펫을 추가하면 제대로 렌더링됩니다.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
I took the * off so it was just from web.xml
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
이 문제가 있었고 마침내 해결했습니다!
내 문제는 내 /WEB-INF/index.jsp
페이지 에 JSP 코드를 넣었다는 것 입니다. 그러나이 페이지는 서블릿이나 컨트롤러에 의해 처리되지 않고 직접 제공됩니다. 따라서 컴파일 될 기회가 없었습니다.
내 솔루션 :
index.jsp
라는 하위 폴더로 이동합니다views
.web.xml
루트 디렉토리의 제어를 디스패처 서블릿에 전달하도록 편집하십시오 .<!-- WEB-INF/web.xml --> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>18-655_lab_1</display-name> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
편집
dispatcher-servlet.xml
가에서 찾고 있음을 보장하기 위해views
끝나는 파일 디렉토리.jsp
.<!-- WEB-INF/dispatcher-servlet.xml --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <mvc:annotation-driven /> <context:component-scan base-package="com.app.controller" /> <mvc:default-servlet-handler /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>
에
base-package
지정된 것과 동일한 경로를 사용하여dispatcher-servlet.xml
ModelAndView를 반환 할 컨트롤러를 만듭니다.package com.app.controller; @Controller @RequestMapping(value = "/") public class RootController { @RequestMapping(method = RequestMethod.GET) public ModelAndView homeGet() { return new ModelAndView("index", "message", "IT WORKS!!!"); } }
- 구문
new ModelAndView("index", "message", "IT WORKS!!!")
은 다음을 의미합니다.dispatcher-servlet
라는 파일을 찾습니다"/WEB-INF/views/" + "index" + ".jsp"
.- jsp 파일을 컴파일하여의 모든 인스턴스
${message}
를IT WORKS!!!
.
따라서 마지막으로 할 일은 파일의 ${message}
어딘가에 넣는 것 index.jsp
입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>${message}</h1>
</body>
</html>
Spring Boot 버전 1.5.10.RELEASE를 사용하는 경우 아래에 maven 종속성을 추가하는 작업을 수행했습니다.
참고 : 이 두 가지를 제공하지 않는 경우에만 작동했습니다 <scope>
.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!--<scope>provided</scope>-->
</dependency>
그리고 application.properties 파일에 아래 구성 제공
spring.mvc.view.prefix: /WEB-INF/jsp/ spring.mvc.view.suffix: .jsp
몇 가지 JSP 제한 사항이 있습니다. 당신은 설정할 수 없습니다 packaging
당신의의 pom
에 jar
. 이 JSP 제한 사항 읽기
참조 URL : https://stackoverflow.com/questions/20602010/jsp-file-not-rendering-in-spring-boot-web-application
'program story' 카테고리의 다른 글
모든 활동으로 애플리케이션을 종료하는 방법은 무엇입니까? (0) | 2021.01.05 |
---|---|
여러 세트 요소를 단일 세트로 병합 (0) | 2021.01.05 |
PHP에서 숫자를 달러 금액으로 포맷하는 방법 (0) | 2021.01.05 |
PHPMYADMIN에서 group_concat을 사용하면 결과가 [BLOB-3B]로 표시됩니다. (0) | 2021.01.05 |
배열이 null인지 비어 있는지 확인하는 방법은 무엇입니까? (0) | 2021.01.05 |