java - spring boot mvc如何支持多个viewresoler(例如jsp和freemarker)

标签 java spring

我希望我的网络应用程序支持 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/

相关文章:

java - 我怎么能在 map 上说 "these two generic types are the same"?

java - 验证 void 方法调用

java - 在 JFreeChart x 轴上绘制数据库中给定的时间戳

java - Autowiring bean 在线程位置为空

java - Spring3 mybatis 3 mapper 找不到这样的bean异常

java - MySQL 语法错误 INSERT INTO 和 WHERE 语句

java - 如何在 leiningen 中的 Clojure 代码之后编译 Java 代码

spring - 找不到 "http://tiles.apache.org/tags-tiles"的标签库描述符

java - Hibernate-无法从输入流解析映射文档

java - 为什么我会收到 java.lang.Exception : No runnable methods exception in this test class?