我正在开发简单的Spring Boot MVC应用程序。以前我只使用Spring + Hibernate(即有servlet.xml等),我正在尝试重建项目以使用Spring Boot。虽然我已经阅读了很多答案,但我还是无法修复Spring Boot找不到我的.jsp文件 - 它显示whitelabel错误页面。
关于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;
}
}
答案 0 :(得分:2)
您正在使用Spring Boot,但您的pom充满了冲突的依赖关系。首先要清理你的pom.xml
。同样在您的pom中,您应该考虑JSP Samples 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引导和JSP时的the limitations 。
但实际问题是你的项目结构,你使用Maven应该有一个src/main/java
目录用于你的java源代码,所有与你网络相关的东西应该在src/main/webapp
而不是web
},进一步的非Java相关资源应该在src/main/resources
中。由于没有这个默认结构,文件不会被复制到正确的位置(实际上它们将被忽略)。