XSLT 视图
XSLT 是一种用于 XML 的转换语言,在 Web 应用中作为视图技术非常流行。如果你的应用自然处理 XML,或者模型可以轻松转换为 XML,那么 XSLT 是一个很好的视图技术选择。以下部分展示了如何在 Spring Web MVC 应用中生成 XML 文档作为模型数据,并通过 XSLT 进行转换。
这个示例是一个简单的 Spring 应用,它在 Controller
中创建了一个单词列表并将其添加到模型 Map 中。返回这个 Map 和我们的 XSLT 视图名。有关 Spring Web MVC 的 Controller
接口详情,请参阅 注解式 Controller。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
我们还需要一个封装单词生成逻辑的 Controller。
Controller 逻辑封装在一个 @Controller
类中,handler 方法定义如下:
-
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 Map 中。请注意,你也可以加载一个 XML 文件作为 Resource 来使用,而不是自定义 DOM 文档。
有一些软件包可以自动将对象图“DOM 化”,但在 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>