|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
XSLT 视图
XSLT 是一种用于 XML 的转换语言,在 Web 应用程序中作为视图技术广受欢迎。如果你的应用程序天然处理 XML,或者你的模型可以轻松转换为 XML,那么 XSLT 可以作为视图技术的一个不错选择。以下章节展示了如何在 Spring Web MVC 应用程序中生成 XML 文档作为模型数据,并使用 XSLT 对其进行转换。
这个示例是一个简单的 Spring 应用程序,它在 Controller 中创建一个单词列表,并将其添加到模型映射(model map)中。该映射连同 XSLT 视图的视图名称一起被返回。有关 Spring Web MVC 的 xref page 接口的详细信息,请参见带注解的控制器。XSLT 控制器会将单词列表转换为一个简单的 XML 文档,以供后续转换使用。
Bean
配置对于一个简单的 Spring Web 应用程序来说是标准的:MVC 配置必须定义一个 XsltViewResolver bean 以及常规的 MVC 注解配置。
以下示例展示了如何进行此类配置:
-
Java
-
Kotlin
@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")
}
}
控制器
我们还需要一个控制器来封装我们的单词生成逻辑。
控制器逻辑被封装在一个 @Controller 类中,其处理方法定义如下:
-
Java
-
Kotlin
@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 文档。
有一些可用的软件包可以自动将对象图“转换为DOM”(domify),但在Spring中,你可以完全灵活地以自己选择的任何方式从模型创建DOM。这样可以避免XML转换过程过多地影响模型数据的结构,而当你使用工具来管理DOM转换过程时,这种影响正是一种潜在的风险。
转换
最后,XsltViewResolver 会解析名为“home”的 XSLT 模板文件,并将 DOM 文档合并到该模板中以生成我们的视图。如 XsltViewResolver 的配置所示,XSLT 模板位于 war 文件的 WEB-INF/xsl 目录下,并以 xslt 作为文件扩展名。
以下示例展示了一个 XSLT 转换:
<?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:
<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>