我希望我的网络应用程序支持 jsp 和 freemarker 这两个模板。我已阅读下面的文章。 https://spring.io/blog/2013/06/03/content-negotiation-using-views 我的代码如下。结果只有jsp模板就OK了。 我的配置有什么问题吗?
MvcConfiguration.java
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver getJspViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
resolver.setOrder(0);
return resolver;
}
@Bean
public FreeMarkerViewResolver getFmViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(true);
resolver.setPrefix("");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();
factory.setTemplateLoaderPath("classpath:templates");
factory.setDefaultEncoding("UTF-8");
FreeMarkerConfigurer result = new FreeMarkerConfigurer();
result.setConfiguration(factory.createConfiguration());
return result;
}
@Bean
public ViewResolver contentNegotiatingViewResolver(
ContentNegotiationManager manager) {
List<ViewResolver> resolvers = new ArrayList<ViewResolver>();
resolvers.add(getJspViewResolver());
resolvers.add(getFmViewResolver());
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setViewResolvers(resolvers);
resolver.setContentNegotiationManager(manager);
return resolver;
}
}
TestController.java
@Controller
public class TestController {
@RequestMapping("/hello")
public String jspView() {
return "hello";
}
@RequestMapping("/fm")
public String freemarkerView() {
return "fm";
}
}
hello.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
out.println("hello jsp");
%>
</body>
</html>
fm.ftl
<!DOCTYPE html>
<html lang="en">
<body>
hello freemarker
</body>
</html>
最佳答案
ViewResolver
都在链中进行查询,直到其中一个返回要渲染的 View
( javadoc )。
但是InternalResourceViewResolver
与其他 ViewResolver
实现略有不同,它只是构造一个 URL(使用 前缀
和 后缀
)并返回一个 View
反过来会将请求转发到此 URL。因此它*总是*返回一个
View`实例。
现在,当您有多个 ViewResolver
时,请确保 InternalResourceViewResolver
始终是链中的最后一个(正如所述类的 javadoc 中也提到的那样)。如果您不这样做,并且这是第一次,您的整个链条将不会被咨询。
要解决您的问题,只需切换 ViewResolver
的顺序,这样您就可以让 FreeMarker 和 JSP View 同时工作。
关于java - spring boot mvc如何支持多个viewresoler(例如jsp和freemarker),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30253953/