Spring Boot 下载 JSP 文件

10

我正在使用Spring Boot简单应用程序来显示一个JSP页面。 但是,页面并没有呈现出来,而是在浏览器中下载了。 请给予建议?

application.properties

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tcadmin?zeroDateTimeBehavior=convertToNull
spring.datasource.username=tcuser
spring.datasource.password=tcuserpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
server.port=9090
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
server.context-path=/internal
spring.mvc.view.prefix:/
spring.mvc.view.suffix:.jsp

我已经创建了src/main/webapp文件夹,并将printReciept.jsp放在其中。
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.a2b</groupId>
    <artifactId>A2BInternalModules</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>A2BInternalModules</name>
    <description>Sitemap Generator for A2B</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
    <!-- Tomcat Embed -->

        <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>required</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
       </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

PrintRecieptController.java

@RequestMapping(value = "/PrinReciept", method = RequestMethod.GET)
    public String welcome(Model model) {
        model.addAttribute("message", "Hello World !!!");
        return "printReciept";
    }

printReciept.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Print Receipt
</body>
</html>

控制器正在被访问,但是它没有呈现JSP页面,而是在浏览器中下载该页面。请提供建议。

你能指定你的 JSP 文件的位置吗?它是在 WEB-INF 目录内还是在 WEB-INF 中的任何文件夹内? - Yogi
在 webapp 文件夹内。我还有一个副本在 WEB-INF 文件夹中,只是为了以某种方式运行它,但它会下载页面。 - Jeets
@Yogi 这里位置有什么关系吗?它被下载了,这意味着文件已经被找到,而不仅仅是在浏览器中打开。 - OwlR
@Jeets,你找到任何解决方案了吗?我也遇到了同样的问题。(另外,在我的Spring Boot应用程序中没有WEB-INF文件夹)。 - OwlR
7个回答

14

在Maven的依赖中检查tomcat-embed版本,并在Maven Central中找到相应的tomcat-jasper版本依赖。此jar文件是JSP编译所需的。因为它没有被编译,所以需要下载。

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

我的嵌入式Tomcat版本是9.0.19,并且我获取了与该版本相关的Jasper。


4
我得到了相同的错误,但我没有放置Tomcat Jasper,它负责将我们的jsp文件转换为HTML。
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>9.0.16</version>
    </dependency>

只需根据使用Tomcat的Spring Boot版本添加tomcat-jasper即可。

3
您缺少JEE依赖项。
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

此外,我强烈建议您将所有JSP放入WEB-INF文件夹中(这对于任何模板引擎都是正确的),并选择除根目录以外的前缀。这样更安全,如果您还想从同一应用程序提供一些REST-like端点,也更灵活。
您还可以扩展WebMvcConfigurerAdapter并覆盖适用的方法。
// Add the JSP view resolver.
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.jsp();
    // OR
    registry.jsp("/",".jsp");
}
//... snip
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry
        .addViewController("/yourpath")
        .setViewName("yourtemplate");
}

"

addViewControllers"非常方便,因为您不必为每个通用JSP和部分创建控制器。请注意,我没有将“.jsp”添加到视图名称中。

您可以使用根上下文作为前缀,并仍然使用上述配置。

"

1
如果您使用的是IntelliJ,请在添加tomcat jasper依赖项后尝试重新加载maven依赖项。这对我有用 :) 请记得添加正确的版本。

0

如果Tomcat服务器版本与tomcat-embed-jasper不匹配,就会出现这个问题。

如何查找服务器版本?

如果在pom.xml或build.gradle中提到了它,请直接替换它。 如果没有,请检查日志中的以下行并在tomcat-embed-jasper中使用相同的版本。它应该可以工作。

org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.60]

implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.60'

0
如果你正在使用Gradle,那么请添加以下依赖项。
compile('org.apache.tomcat.embed:tomcat-embed-jasper')

0
添加正确的版本号和这个依赖项对我来说完全没问题:
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>9.0.16</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接