【问题标题】:JSP file not rendering in Spring Boot web applicationJSP 文件未在 Spring Boot Web 应用程序中呈现
【发布时间】:2014-01-03 07:37:39
【问题描述】:

我有一个使用嵌入式 Tomcat(默认)启动并运行的 Spring Boot Web 应用程序。当它提供 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

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    确保您的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 应该包含在 servlet 容器中。

    【讨论】:

    • 你让我开心!这对我有帮助 - 尽管我的问题略有不同 - Spring 甚至没有在/src/main/resources/webapp/WEB-INF/pages找到我的 .jsp 文件。非常感谢!
    • 和 Adrei 有同样的问题,它一直在抱怨循环依赖,直到我添加了 jar。
    • 这只是行不通的。 Servlet 3.0 期望 jsp 包含在 META-INF 文件夹中。请参阅此示例应用程序github.com/kamoor/spring-boot-sample
    • @kamoor 我从未在 META-INF 中看到过 JSP,而且我很确定 Servlet 3.0 API 没有将其指定为 JSP 文件的位置;您可以参考规范中的哪个位置吗?我见过的每个 JSP 应用程序在 WEB-INF 中都有它的 JSP。由于您使用的是 3.0 和 Spring Boot,因此您应该考虑使用 Java Configuration 而不是 XML!
    • @Storm 发布问题时,这是一个复选框选项(例如与社区 wiki 风格分享您的知识)。我想你也许没有获得积分?不确定。无论如何,似乎很多其他人都遇到过同样的问题!
    【解决方案2】:

    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>
    

    【讨论】:

    【解决方案3】:

    对我来说,就像 Dan 提到的那样工作。删除提供的范围。

    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    

    谢谢大佬!

    【讨论】:

    • 看起来很有帮助,实际上 ;)
    【解决方案4】:

    也为我工作,但我不得不删除

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

    【讨论】:

      【解决方案5】:

      你可以更好地使用 gradle(它正在赶上 Maven)。在 build.gradle 文件中使用这个依赖。

      //JSP 需要的依赖

      providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
      

      【讨论】:

        【解决方案6】:

        我认为你错过了一些配置,因为它很容易集成 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
        

        那还是有疑问的,看看下面的链接吧

        Spring Boot and JSP Integration

        【讨论】:

          【解决方案7】:
          1. 确保 spring-boot-starter-tomcattomcat-embed-jasperjstl 依赖项位于 pom.xml 中。
          2. 确保包装类型为war
          3. 如果有多个模块(IntelliJ),请进入运行 -> 编辑配置 -> 配置,然后选择或将$MODULE_WORKING_DIR$ 放入“工作目录”中。

          就是这样。

          【讨论】:

            【解决方案8】:

            原因是因为你使用的是注解@RestController 而不是@Controller

            当您使用 RestController 注释一个类时,所有使用 @RequestMapping 注释的方法默认采用 @ResponseBody 语义。换句话说,您的方法 #index 将字符串 /webapp/WEB-INF/index.jsp 序列化为 JSON,而不是将其值映射到视图。

            就像其中一个答案中提到的那样,它必须是

            @控制器 公共类 YourController { ... }

            【讨论】:

              【解决方案9】:

              我解决了我之前描述的问题:

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

              来自:Why does Spring MVC respond with a 404 and report "No mapping found for HTTP request with URI [...] in DispatcherServlet"?

              【讨论】:

              • 我必须在哪里添加reo​​lver方法??我认为它应该在扩展 WebMvcConfigurationSupport 的类中,对吗?
              • 是的。或者在一个具有相同含义注释的类中:Configuration 和 EnableWebMvc 我已经在我的回答中更新了这个案例的示例。
              【解决方案10】:

              只需更改依赖项

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

              【讨论】:

                【解决方案11】:

                带有 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;
                    }
                
                }
                

                【讨论】:

                  【解决方案12】:

                  你需要在类路径中的 jsp 编译器 jar (tomcat-jasper)。嵌入式tomcat不附带它。 如果已经添加,则删除 tomcat-embed-jasper.jar 并添加到下面

                  <dependency>
                          <groupId>javax.servlet</groupId>
                          <artifactId>jstl</artifactId>
                      </dependency>
                      <dependency>
                          <groupId>org.apache.tomcat</groupId>
                          <artifactId>tomcat-jasper</artifactId>
                          <version>9.0.1</version>
                  </dependency> 
                  

                  【讨论】:

                  • 这个答案对于 Spring 2.5.0 版特别正确。谢谢
                  【解决方案13】:

                  正如 Spring 和 Spring Boot 一直在变化的那样,这里有一个最新的解决方案。

                  build.gradle:

                  dependencies {
                      compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.0.RELEASE'
                      compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.35'
                  }
                  

                  IndexController.java 如下所示:

                  @Controller
                  public class IndexController {
                  
                      @RequestMapping("/index")
                      public String index(Model model) {
                          model.addAttribute("name", "jancsi");
                          return "index";
                      }
                  }
                  

                  WebConfig.java:

                  @Configuration
                  @EnableWebMvc
                  @ComponentScan
                  public class WebConfig implements WebMvcConfigurer {
                  
                      @Override
                      public void configureViewResolvers(ViewResolverRegistry registry) {
                          registry.jsp("/WEB-INF/views/", ".jsp");
                      }
                  
                      @Override
                      public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
                          configurer.enable();
                      }
                  }
                  

                  这里不要使用WebMvcConfigurerAdapter,而是使用WebMvcConfigurer接口,不要忘记启用默认的servlet处理程序。

                  然后是jsp文件的文件夹结构。

                  src/main/webapp
                  └── WEB-INF
                      └── views
                          └── index.jsp
                  

                  【讨论】:

                    【解决方案14】:

                    有时 tomcat-embed-jasper 不可用,因此需要从 tomcat-embed-jasper 的 maven 依赖项中删除提供。

                    例如。

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

                    【讨论】:

                      【解决方案15】:

                      如果你想使用 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.发布

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

                      【讨论】:

                        【解决方案16】:

                        我遇到了这个问题,终于解决了!

                        我的问题是我一直将 JSP 代码放在我的 /WEB-INF/index.jsp 页面中。但是,此页面是直接提供的,无需任何 servlet 或控制器处理。因此,它没有被编译的机会。

                        我的解决方案:

                        1. index.jsp 移动到名为views 的子文件夹中。

                        2. 编辑web.xml,以便它将根目录的控制权传递给调度程序servlet。

                          <!-- 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>
                          
                        3. 编辑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>
                          
                        4. 使用与dispatcher-servlet.xml 中指定的相同base-package 路径,创建将返回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!!!");
                              }
                          
                          }
                          
                        5. 语法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>
                        
                        1. 将项目加载到您的 Tomcat 服务器中,启动它,然后转到 http://localhost:8080/[project name]/

                        【讨论】:

                          【解决方案17】:

                          对于使用 Spring Boot 版本 1.5.10.RELEASE 的我来说,它可以添加以下 maven 依赖项。

                          注意: 只是不为这两个提供&lt;scope&gt;

                          <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

                          【讨论】:

                            【解决方案18】:

                            我遇到了类似在浏览器中打印 jsp 文件名而不是其内容的问题。

                            通过在 pom.xml 中添加下面的 sn-p 进行 jsp 页面渲染,它可以正常渲染。

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

                            【讨论】:

                            • @Crimean.us - Springboot 不需要像您的视图解析器那样的显式配置。那么 Spring MVC 和 boot 有什么区别呢?
                            【解决方案19】:
                            <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>
                            

                            【讨论】:

                              【解决方案20】:

                              请考虑,有一些 JSP 限制。您不能将pompackaging 设置为jar。阅读此JSP Limitations

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2015-03-18
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2019-04-04
                                • 2018-04-11
                                • 1970-01-01
                                • 2018-11-07
                                相关资源
                                最近更新 更多