Spring引用使用资源模板文件夹和JSP模板而不是webapp文件夹?

时间:2017-09-12 19:00:12

标签: spring jsp spring-mvc templates spring-boot

我启动了一个Spring Boot MVC项目,并意识到resources中有两个文件夹。一个称为templates,另一个称为static。我真的很喜欢这个文件夹设置。

问题是我将JSP模板用于我的视图。我无法在.jsp文件夹中放置templates模板并使其正常工作。 我需要做的是在与webappsrc相同的级别创建一个resources文件夹。将JSP模板放在那里,然后找到我的视图。

我需要在templates内的resources文件夹中重新配置以实际使用我的JSP模板吗?

4 个答案:

答案 0 :(得分:11)

根据Maven documentation src/main/resources,最终会在WAR中的WEB-INF/classes结束。

这可以解决application.properties中的Spring Boot问题:

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

如果您更喜欢Java配置,那么就可以了:

@EnableWebMvc
@Configuration
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/classes/templates/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

使用完整示例进行更新

此示例基于Spring's initializer(Gradle项目" Web"依赖项)。我刚刚将apply plugin: 'war'添加到build.gradle,添加/更改了以下文件,使用gradle war构建了项目并将其部署到我的应用服务器(Tomcat 8)。

这是此示例项目的目录树:

\---src
    +---main
        +---java
        |   \---com
        |       \---example
        |           \---demo
        |                   ApplicationConfiguration.java
        |                   DemoApplication.java
        |                   DemoController.java
        |
        \---resources
            +---static
            \---templates
                    index.jsp

ApplicationConfiguration.java:见上文

DemoApplication.java:

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }

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

}

DemoController.java:

@Controller
public class DemoController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}

的index.jsp:

<html>
    <body>
        <h1>Hello World</h1>
    </body>
</html>

答案 1 :(得分:6)

官方信息:

资源处理:

  

由于a,在运行时在模板中重写了对资源的链接   ResourceUrlEncodingFilter,为Thymeleaf和。自动配置   FreeMarker的。您应该在使用JSP时手动声明此过滤器。   source

支持的模板引擎

  

除REST Web服务外,您还可以使用Spring MVC进行服务   动态HTML内容。 Spring MVC支持各种模板   技术包括Thymeleaf,FreeMarker和JSP。

[...]

  

如果可能,应该避免使用JSP,有几个已知的限制   与嵌入式servlet容器一起使用时。

[..]

  

使用默认情况下使用其中一个模板引擎时   配置,您的模板将自动从中获取   的src /主/资源/模板。

source

Spring引导JSP限制

  
      
  • 使用Tomcat,如果你使用战争包装,它可以工作,即可执行的战争将起作用,并且也可以部署到标准中   容器(不限于,但包括Tomcat)。
  •   
  • 由于Tomcat中的硬编码文件模式,可执行jar将无法工作。
  •   
  • 使用Jetty它应该可以使用war包装,即可执行的战争可行,并且也可以部署到任何   标准容器。
  •   
  • Undertow不支持JSP。
  •   
  • 创建自定义error.jsp页面不会覆盖错误处理的默认视图,而应使用自定义错误页面。
  •   

source

技术变更

告诉spring boot从哪里加载JSP files。在application.properties设置

spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

source

使用JSP

的Spring弹出示例

如果你想在弹簧启动中使用JSP,这里有两个例子:

https://github.com/spring-projects/spring-boot/tree/v1.5.9.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp

https://github.com/joakime/spring-boot-jsp-demo

答案 2 :(得分:2)

总结一下,到目前为止, none 建议的答案对我有用。使用空白的Spring启动启动项目。

某种程度上,某些东西在Spring或servlet中看起来是硬连线的,因此JSP 必须/webapp(或子文件夹)中。与默认的百万美元模板不同在/resources/templates

我尝试了所有类型的更改,实际上有很多不同的配置,但无法修改该行为。它只是产生了复杂性,无法再为JSP服务。所以,最重要的是,如果你正在使用JSP,只需将它们放在/webapp中即可。它还可以通过使用如下控制器添加配置来实现:

@GetMapping("/foo") public String serveFoo() { return "relative-path-inside-webapp/foo.jsp"; }

另一方面,默认情况下,/webapp文件夹也会隐藏在Spring Toolsuite中,因此您必须手动将其配置为“源文件夹”。

答案 3 :(得分:0)

假设您在 welcome.jsp 中有 src\main\webapp\WEB-INF\jsp\welcome.jsp 文件,并且您有以下配置:spring.mvc.view.prefix: /WEB-INF/jsp/spring.mvc.view.suffix: .jsp

它适用于 mvn spring-boot:run 如果您希望使用 java -jar java -jar spring-boot-web-jsp.jar 命令运行 jar 文件,只需将 src\main\webapp\WEB-INF 复制到 src\main\resources\META-INF\resources

文件 welcome.jsp 应该在 src\main\resources\META-INF\resources\WEB-INF\jsp\welcome.jsp

也根据this answerfound that since 1.4.3 version and above stops supporting the embedded JSPs