我启动了一个Spring Boot MVC项目,并意识到resources
中有两个文件夹。一个称为templates
,另一个称为static
。我真的很喜欢这个文件夹设置。
问题是我将JSP模板用于我的视图。我无法在.jsp
文件夹中放置templates
模板并使其正常工作。
我需要做的是在与webapp
和src
相同的级别创建一个resources
文件夹。将JSP模板放在那里,然后找到我的视图。
我需要在templates
内的resources
文件夹中重新配置以实际使用我的JSP模板吗?
答案 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 /主/资源/模板。
- 使用Tomcat,如果你使用战争包装,它可以工作,即可执行的战争将起作用,并且也可以部署到标准中 容器(不限于,但包括Tomcat)。
- 由于Tomcat中的硬编码文件模式,可执行jar将无法工作。
- 使用Jetty它应该可以使用war包装,即可执行的战争可行,并且也可以部署到任何 标准容器。
- Undertow不支持JSP。
- 创建自定义error.jsp页面不会覆盖错误处理的默认视图,而应使用自定义错误页面。
告诉spring boot从哪里加载JSP files
。在application.properties
设置
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
如果你想在弹簧启动中使用JSP
,这里有两个例子:
答案 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 answer他found that since 1.4.3 version and above stops supporting the embedded JSPs