我使用嵌入式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
答案 0 :(得分:90)
确保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容器中。
答案 1 :(得分:21)
在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>
答案 2 :(得分:14)
对我来说,就像Dan提到的一样。删除提供的范围。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
谢谢你们!
答案 3 :(得分:12)
也为我工作,但我不得不删除
<scope>provided</scope>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
答案 4 :(得分:9)
最好你可以使用gradle(正在赶上Maven)。在build.gradle文件中使用此依赖项。
// JSP
的必需依赖项
providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
答案 5 :(得分:6)
我认为您错过了一些配置,因为只需按照以下步骤轻松集成JSP
1 - tomcat-embad-jasper依赖
spring.mvc.view.prefix: /
spring.mvc.view.suffix: .jsp
2 - 添加以下配置是application.properties
while (j!=0 && arr[j] < arr[j-1])
{
temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
cout << "arr["<<j<<"] is "<< arr[j]<<endl;
cout<< "arr[" << j-1<< "is " << arr[j-1]<<endl;
j--;
它还有一些疑问,请在链接下方查看
答案 6 :(得分:2)
除了之前描述之外,我解决了我的问题:
<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;
}
}
答案 7 :(得分:2)
只需更改依赖关系
<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>
答案 8 :(得分:2)
spring-boot-starter-tomcat
,tomcat-embed-jasper
和jstl
依赖项位于pom.xml中。war
。$MODULE_WORKING_DIR$
或将其放置在“工作目录”中。就是这样。
答案 9 :(得分:1)
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
答案 10 :(得分:1)
您需要在类路径中使用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>
答案 11 :(得分:1)
原因是因为您使用的是@RestController而不是@Controller
使用RestController注释类时,默认情况下,所有使用@RequestMapping注释的方法都采用@ResponseBody语义。换句话说,您的方法#index会将String /webapp/WEB-INF/index.jsp序列化为JSON,而不是将其值映射到视图。
就像答案中提到的那样,它必须是
@控制器 公共类YourController { ... }
答案 12 :(得分:1)
如果你想使用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 弹簧引导启动父 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";
}
}
答案 13 :(得分:1)
有时tomcat-embed-jasper不可用,因此需要从tomcat-embed-jasper的maven依赖项中删除。
例如
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--scope>provided</scope-->
</dependency>
答案 14 :(得分:1)
使用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;
}
}
答案 15 :(得分:0)
<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>
答案 16 :(得分:0)
我遇到了这个问题,终于解决了!
我的问题是我一直在将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>
使用与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"
的文件。${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>
答案 17 :(得分:0)
对于使用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 :(得分:0)
请考虑,有一些JSP限制。您无法将packaging
中的pom
设置为jar
。阅读此JSP Limitations
答案 19 :(得分:0)
我遇到的问题就是在浏览器中打印jsp文件名而不是其内容。
通过在pom.xml中添加以下用于jsp页面呈现的片段,它可以正确呈现。
layoutProgress.setVisibility(View.GONE)