Spring Boot找不到jsp文件

问题描述 投票:0回答:2

我正在开发简单的 Spring Boot MVC 应用程序。以前我只使用 Spring + Hibernate(即有 servlet.xml 等)来完成所有工作,并且我正在尝试重建项目以使用 Spring Boot。尽管我已经阅读了很多答案,但我仍然无法修复 Spring Boot 找不到我的 .jsp 文件 - 它显示白标错误页面。
SO 上的许多答案都是关于将

tomcat-embed-jasper
jstl
包含在
pom.xml
中,但我已经有了。我正在使用 IntelliJ IDEA 17 Ultimate、Tomcat 8.5.13、最新版本的 Spring 和 Spring Boot。

项目结构:

Pom.xml:

<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>
<artifactId>spring-invoice</artifactId>
<groupId>spring-invoice</groupId>
<version>1.0.0</version>
<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<properties>
    <springframework.version>4.3.8.RELEASE</springframework.version>
    <hibernate.version>5.2.9.Final</hibernate.version>
    <mysql.connector.version>5.1.41</mysql.connector.version>
    <hibernatevalidator.version>5.4.1.Final</hibernatevalidator.version>
    <start-class>com.invoices.Application</start-class>
</properties>

<dependencies>

    <!-- Spring boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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-tomcat</artifactId>
    </dependency>

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

    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <!-- Hibernate validator -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernatevalidator.version}</version>
    </dependency>

    <!-- MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.connector.version}</version>
    </dependency>

    <!-- C3PO -->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>

    <!-- Servlet + JSP + JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

</dependencies>

<build>

    <finalName>spring-invoice</finalName>

    <plugins>

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

        <!-- The Compiler Plugin is used to compile the sources of project -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <!-- Builds a Web Application Archive (WAR) file from the project output and its dependencies. -->
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>

    </plugins>

</build>

</project>

application.properties
文件

# Database
spring.datasource.url=jdbc:mysql://localhost:3306/fakturowanie
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

# Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

entitymanager.packagesToScan=com.invoices
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

应用类

@SpringBootApplication
public class Application extends SpringBootServletInitializer
{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
    {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我的一个jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="pl-PL">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Zarządzaj kontrahentami</title>
</head>
<body>

    <div id="wrapper">
        <div id="header">
            <h2>Zarządzaj kontrahentami</h2>
        </div>
    </div>

    <div>
        <div>
            <!-- put new button: Add Customer -->
            <input type="button" value="Dodaj nowego kontrahenta"
                   onclick="window.location.href='addCustomer'; return false;"
                   class="add-button"/>

            <table>
                <tr>
                    <th>Alias</th>
                    <th>Nazwisko</th>
                    <th>Imię</th>
                    <th>Nazwa firmy</th>
                    <th>NIP/PESEL</th>
                    <th>Ulica i nr mieszkania</th>
                    <th>Kod pocztowy</th>
                    <th>Miejscowość</th>
                    <th>Sposób zapłaty</th>
                    <th>Uwzględnij numer faktury</th>
                </tr>

                <c:forEach var="tempCustomer" items="${allCustomers}">

                    <c:url var="updateLink" value="/customers/updateCustomer">
                        <c:param name="customerID" value="${tempCustomer.id}"/>
                    </c:url>

                    <c:url var="deleteLink" value="/customers/deleteCustomer">
                        <c:param name="customerID" value="${tempCustomer.id}"/>
                    </c:url>

                    <tr>
                        <td>${tempCustomer.alias}</td>
                        <td>${tempCustomer.lastName}</td>
                        <td>${tempCustomer.firstName}</td>
                        <td>${tempCustomer.companyName}</td>
                        <td>${tempCustomer.taxIdentifier}</td>
                        <td>${tempCustomer.postalCode}</td>
                        <td>${tempCustomer.city}</td>
                        <td>${tempCustomer.paymentMethod}</td>
                        <td>${tempCustomer.includeInCount}</td>

                        <td>
                            <!-- display the update and delete link -->
                            <a href="${updateLink}">Edytuj</a>
                            |
                            <a href="${deleteLink}" onclick="if (!(confirm(
                                'Czy na pewno usunąć tego kontrahenta?'))) return false">Usuń</a>
                        </td>

                    </tr>

                </c:forEach>

            </table>

        </div>
    </div>

</body>
</html>

以及它的控制器

@Controller
@RequestMapping("/customers")
public class CustomersController implements IUtilities<Customer>
{
    @Autowired
    private ICustomerDAO customerDAO;

    @GetMapping("/manageCustomers")
    public String manageCustomers(Model model)
    {
        List<Customer> allCustomers = convertIterableToCollection(customerDAO.findAll());
        model.addAttribute("allCustomers", allCustomers);
        return "manage-customers";
    }

    @GetMapping("/addCustomer")
    public String showFormForAdd(Model model)
    {
        // create model attribute to bind form data
        Customer theCustomer = new Customer();

        model.addAttribute("customerToEdit", theCustomer);

        return "customer-form";
    }

    @GetMapping("/updateCustomer")
    public String showFormForUpdate(@RequestParam("customerID") int customerId, Model model)
    {
        // get the customer from service
        Customer theCustomer = customerDAO.findOne(customerId);
        model.addAttribute("customerToEdit", theCustomer);

        //redirect to update form
        return "customer-form";
    }

    @GetMapping("/deleteCustomer")
    public String deleteCustomer(@RequestParam("customerID") int customerId)
    {
        //delete the customer
        customerDAO.delete(customerId);

        return "redirect:/customers/manageCustomers";
    }

    @PostMapping("/saveCustomer")
    public String saveCustomer(@ModelAttribute("customerToEdit") Customer customer) {
        //save the customer using our service
        customerDAO.save(customer);

        return "redirect:/customers/manageCustomers";
    }

    @Override
    public List<Customer> convertIterableToCollection(Iterable<Customer> iterable) {
        List<Customer> list = new ArrayList<>();
        iterable.forEach(list::add);
        return list;
    }
}
spring jsp spring-mvc intellij-idea spring-boot
2个回答
2
投票

您正在使用 Spring Boot,但您的 pom 充满了相互冲突的依赖项。首先清理你的

pom.xml
。另外,在您的 pom 中,您应该考虑 JSP 示例 pom.xml 中正在执行的操作(这意味着至少使
spring-boot-starter-tomcat
provided
而不是默认的
compile
范围。

最后,您不需要

maven-compile
maven-war
插件,因为它们已经从父级继承。

<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>
<artifactId>spring-invoice</artifactId>
<groupId>spring-invoice</groupId>
<version>1.0.0</version>
<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<properties>
    <hibernate.version>5.2.9.Final</hibernate.version>
    <start-class>com.invoices.Application</start-class>
</properties>

<dependencies>

    <!-- Spring boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

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

    <!-- MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- C3PO -->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>

    <!-- Servlet + JSP + JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

</dependencies>

<build>

    <finalName>spring-invoice</finalName>

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

</build>

</project>

还要考虑到 使用 Spring Boot 与 JSP 时存在的限制。

然而,实际的问题是你的项目结构,你使用的 Maven 应该有一个

src/main/java

 目录来存放你的 Java 源代码,所有与 Web 相关的东西都应该在 
src/main/webapp
 而不是 
web
 中,进一步的非 Java 相关资源应该在处于
src/main/resources
。由于没有这个默认结构,文件不会被复制到正确的位置(实际上它们将被忽略)。 


0
投票
对 webapp 文件路径尝试此方法

© www.soinside.com 2019 - 2024. All rights reserved.