Spring启动 - 无法解析jsp视图

时间:2014-07-06 17:59:11

标签: java jsp spring-mvc spring-boot

我正在尝试使用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);
    }
}

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

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

谢谢 -

3 个答案:

答案 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),请确保以下内容:

  • 确保应用程序packaged为战争而不是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>

答案 2 :(得分:0)

同意@code4kix,如果所有操作均无效,请尝试在application.properties文件中添加以下属性

spring.thymeleaf.enabled = false