JSP 文件未在 Spring Boot Web 应用程序中呈现

Posted

技术标签:

【中文标题】JSP 文件未在 Spring Boot Web 应用程序中呈现【英文标题】:JSP file not rendering in Spring Boot web application 【发布时间】: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

【问题讨论】:

【参考方案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>

【讨论】:

@sezil Karil 你能帮我解决我的问题吗? ***.com/questions/61359718/…【参考方案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】:
    确保 spring-boot-starter-tomcattomcat-embed-jasperjstl 依赖项位于 pom.xml 中。 确保包装类型为war。 如果有多个模块(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 或控制器处理。因此,它没有被编译的机会。

我的解决方案:

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

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

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

    使用与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!!!");
        
    
    
    
    语法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>

    将项目加载到您的 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

【讨论】:

以上是关于JSP 文件未在 Spring Boot Web 应用程序中呈现的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Web应用程序未在tomcat 9上运行

[Spring boot] web应用返回jsp页面

Spring Boot 配置文件介绍

Spring Boot系列Spring Boot视图技术(JspFreeMarkerThymeleaf)

spring boot jsp文件无法查看

我应该将jsp文件放在spring-boot项目中的位置