Spring boot - 无法解析jsp视图

Posted

技术标签:

【中文标题】Spring boot - 无法解析jsp视图【英文标题】:Spring boot - Unable to resolve jsp views 【发布时间】:2014-08-27 05:37:14 【问题描述】:

我正在尝试使用 Spring Boot 构建一个基本的 MVC 应用程序,Hibernate 作为 ORM,mysql 作为数据库。我面临的问题是 jsp 视图 没有得到解决

当我尝试使用带有以下 URL 的 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

用户控制器:

@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: 根

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>

主类

@ComponentScan
@Configuration
@EnableAutoConfiguration
public class ApplicationStart 
    public static void main(String[] args)
    
        SpringApplication.run(ApplicationStart.class, args);
    

这是我的应用程序的当前设置。非常感谢任何有关如何解决此问题的帮助。

如果需要更多信息,请发表评论。

谢谢-

【问题讨论】:

试试http://localHost:port/YourProjectName/users/register 确保你的 pom 包装是战争而不是罐子。 【参考方案1】:

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。

【讨论】:

【参考方案2】:

我最近在升级一个旧项目时遇到了这个问题,该项目需要将jsps 作为视图技术,并将tomcat 作为嵌入式servlet-container。警告:选择一个替代templating engine,如果可以,请避免使用 jsps。但是,如果您无法避免 jsps,并且您的应用程序无法解析它们,那么在撰写本文时(spring-boot 2.x.x),请确保以下几点:

确保应用程序packaged 是一个war 而不是jar。虽然让jsps和jar包一起工作并非不可能,但由于某些limitations的原因,还是有点复杂。您可以在服务器或容器中使用 war 包运行它们,就像:java -jar war-filename.war 验证您的控制器是否具有@Controller 注释 但不是注解@EnableWebMvc。那是因为您正在使用spring-boot 为您配置 WebMVC。 您的控制器是否被扫描并作为组件注入?如果您在不同的包中定义了您的控制器,可能您缺少@ComponentScan 注释? 您的 jsps 定位和配置是否正确?例如,假设您的 jsps 位于 /src/main/webapp/WEB-INF/jsp/,那么您的 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>

【讨论】:

【参考方案3】:

同意@code4kix,如果所有这些都不起作用,请尝试在 application.properties 文件中添加以下属性

spring.thymeleaf.enabled=false

【讨论】:

以上是关于Spring boot - 无法解析jsp视图的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 无法解析 Freemarker 视图

无法在 Spring Boot 中解析名称为“index”的视图

状态为404的Springboot Whitelabel错误页面:无法解析JSP的路径

Spring Boot - 放置 jsp 文件的位置

在 Spring Boot 应用程序中使用 JSP 和 Thymeleaf 视图

内部资源视图解析器在 Spring Boot 中不起作用