对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

XSLT 视图

XSLT 是一种用于 XML 的转换语言,在 Web 应用程序中作为视图技术广受欢迎。如果你的应用程序天然处理 XML,或者你的模型可以轻松转换为 XML,那么 XSLT 可以作为视图技术的一个不错选择。以下章节展示了如何在 Spring Web MVC 应用程序中生成 XML 文档作为模型数据,并使用 XSLT 对其进行转换。spring-doc.cadn.net.cn

这个示例是一个简单的 Spring 应用程序,它在 Controller 中创建一个单词列表,并将其添加到模型映射(model map)中。该映射连同 XSLT 视图的视图名称一起被返回。有关 Spring Web MVC 的 xref page 接口的详细信息,请参见带注解的控制器。XSLT 控制器会将单词列表转换为一个简单的 XML 文档,以供后续转换使用。spring-doc.cadn.net.cn

Bean

配置对于一个简单的 Spring Web 应用程序来说是标准的:MVC 配置必须定义一个 XsltViewResolver bean 以及常规的 MVC 注解配置。 以下示例展示了如何进行此类配置:spring-doc.cadn.net.cn

@EnableWebMvc
@ComponentScan
@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Bean
	public XsltViewResolver xsltViewResolver() {
		XsltViewResolver viewResolver = new XsltViewResolver();
		viewResolver.setPrefix("/WEB-INF/xsl/");
		viewResolver.setSuffix(".xslt");
		return viewResolver;
	}
}
@EnableWebMvc
@ComponentScan
@Configuration
class WebConfig : WebMvcConfigurer {

	@Bean
	fun xsltViewResolver() = XsltViewResolver().apply {
		setPrefix("/WEB-INF/xsl/")
		setSuffix(".xslt")
	}
}

控制器

我们还需要一个控制器来封装我们的单词生成逻辑。spring-doc.cadn.net.cn

控制器逻辑被封装在一个 @Controller 类中,其处理方法定义如下:spring-doc.cadn.net.cn

@Controller
public class XsltController {

	@RequestMapping("/")
	public String home(Model model) throws Exception {
		Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
		Element root = document.createElement("wordList");

		List<String> words = Arrays.asList("Hello", "Spring", "Framework");
		for (String word : words) {
			Element wordNode = document.createElement("word");
			Text textNode = document.createTextNode(word);
			wordNode.appendChild(textNode);
			root.appendChild(wordNode);
		}

		model.addAttribute("wordList", root);
		return "home";
	}
}
import org.springframework.ui.set

@Controller
class XsltController {

	@RequestMapping("/")
	fun home(model: Model): String {
		val document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()
		val root = document.createElement("wordList")

		val words = listOf("Hello", "Spring", "Framework")
		for (word in words) {
			val wordNode = document.createElement("word")
			val textNode = document.createTextNode(word)
			wordNode.appendChild(textNode)
			root.appendChild(wordNode)
		}

		model["wordList"] = root
		return "home"
	}
}

到目前为止,我们仅创建了一个 DOM 文档并将其添加到了 Model 映射中。请注意,您也可以将一个 XML 文件作为 Resource 加载,并用它来替代自定义的 DOM 文档。spring-doc.cadn.net.cn

有一些可用的软件包可以自动将对象图“转换为DOM”(domify),但在Spring中,你可以完全灵活地以自己选择的任何方式从模型创建DOM。这样可以避免XML转换过程过多地影响模型数据的结构,而当你使用工具来管理DOM转换过程时,这种影响正是一种潜在的风险。spring-doc.cadn.net.cn

转换

最后,XsltViewResolver 会解析名为“home”的 XSLT 模板文件,并将 DOM 文档合并到该模板中以生成我们的视图。如 XsltViewResolver 的配置所示,XSLT 模板位于 war 文件的 WEB-INF/xsl 目录下,并以 xslt 作为文件扩展名。spring-doc.cadn.net.cn

以下示例展示了一个 XSLT 转换:spring-doc.cadn.net.cn

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output method="html" omit-xml-declaration="yes"/>

	<xsl:template match="/">
		<html>
			<head><title>Hello!</title></head>
			<body>
				<h1>My First Words</h1>
				<ul>
					<xsl:apply-templates/>
				</ul>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="word">
		<li><xsl:value-of select="."/></li>
	</xsl:template>

</xsl:stylesheet>

上述转换将渲染为以下 HTML:spring-doc.cadn.net.cn

<html>
	<head>
		<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Hello!</title>
	</head>
	<body>
		<h1>My First Words</h1>
		<ul>
			<li>Hello</li>
			<li>Spring</li>
			<li>Framework</li>
		</ul>
	</body>
</html>