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-tomcat
、tomcat-embed-jasper
和 jstl
依赖项位于 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"?
【讨论】:
我必须在哪里添加reolver方法??我认为它应该在扩展 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 依赖项。
注意: 只是不为这两个提供<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
【讨论】:
【参考方案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 限制。您不能将pom
的packaging
设置为jar
。阅读此JSP Limitations
【讨论】:
以上是关于JSP 文件未在 Spring Boot Web 应用程序中呈现的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot Web应用程序未在tomcat 9上运行