我正在尝试使用Spring引导和Hibernate构建一个基本的MVC应用程序,如ORM和MySql作为数据库。我面临的问题是 jsp视图 无法解析。
当我尝试使用带有以下网址的GET请求获取注册表单时出现 404 错误:
http://localhost:9000/users/register/
这是我在我的应用程序中的设置。
目录结构:
-src
-main
-java
-com
ApplicationStart.java
-controllers
UserController.java
-repositories
UserRepository.java
-webapp
-WEB-INF
-jsp
register.jsp
-resources
application.properties
UserController中:
@RestController
public class UserController {
private UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository)
{
this.userRepository = userRepository;
}
@RequestMapping(value = "/users/register", method = RequestMethod.GET)
public String Register()
{
return "register";
}
}
Application.properties:
server.port:9000
spring.datasource.url:jdbc:mysql:// localhost / Contacts
spring.datasource.driverClassName:com.mysql.jdbc.Driver
spring.datasource.username:root
spring.datasource.password:
spring.view.prefix:/ WEB-INF / jsp /
spring.view.suffix:.jsp
的pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.3.RELEASE</version>
</parent>
<dependencies>
<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>
<!-- HIBERNATE -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
MAIN CLASS
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class ApplicationStart {
public static void main(String[] args)
{
SpringApplication.run(ApplicationStart.class, args);
}
}
这是我的应用程序的当前设置。任何有关如何解决问题的帮助都非常感谢。
如果需要更多信息,请发表评论。
谢谢 -
答案 0 :(得分:6)
Spring Boot对JSP的支持有限,因为它使用了嵌入式servlet容器。从Spring Boot reference documentation开始:
当运行使用嵌入式servlet容器的Spring Boot应用程序(并打包为可执行存档)时,JSP支持存在一些限制。
- 使用Tomcat它应该可以使用war包装,即可执行的war会起作用,并且也可以部署到标准容器(不限于但包括Tomcat)。由于Tomcat中的硬编码文件模式,可执行jar将无法工作。
- Jetty目前不能用作带JSP的嵌入式容器。 有一个JSP sample,所以你可以看到如何设置。
首先让您的应用成为可执行的战争,并确保使用Tomcat(在启动应用程序时检查日志)。除非您明确声明应该包含Jetty,否则您使用的是Tomcat,因为默认情况下会提供。或者,尝试更改您的视图技术,这可能需要更多初始工作,但可以显着缩短开发期间的周转时间,请参阅Hotswapping。
答案 1 :(得分:1)
我最近遇到了这个问题,同时将需要jsps
作为视图技术的旧项目升级为tomcat
作为嵌入式servlet-container
。警告:选择一个替代templating engine,如果可以,请避免使用jsps。但是,如果您无法避免jsps,并且您的应用程序无法解决它们,那么在撰写本文时(spring-boot 2.x.x),请确保以下内容:
java -jar war-filename.war
@Controller
注释
但不注释@EnableWebMvc
。这是因为您正在使用spring-boot
为您配置WebMVC。@ComponentScan
注释?application.properties
应该是这样的:
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
此外,由于您使用的是spring-boot,因此Application
无需延长SpringBootServletInitializer
。它也会起作用,但为了保持简单,你需要的只是下面的一个类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
仅供参考,下面提到了所需的最小依赖关系(Maven示例):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<dependencies>
<!-- spring-boot dependencies below -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- jstl and jsp compilation support below -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
答案 2 :(得分:0)
同意@code4kix,如果所有操作均无效,请尝试在application.properties文件中添加以下属性
spring.thymeleaf.enabled = false