XSLT 视图
XSLT 是一种用于 XML 的转换语言,在 Web 应用程序中作为视图技术很受欢迎。如果您的应用程序自然处理 XML 或您的模型可以轻松转换为 XML,那么 XSLT 可以作为一种不错的视图技术选择。以下部分展示了如何在 Spring Web MVC 应用程序中生成 XML 文档作为模型数据并使用 XSLT 进行转换。
此示例是一个简单的 Spring 应用程序,它在Controller
中创建一个单词列表并将其添加到模型映射中。该映射与我们的 XSLT 视图的视图名称一起返回。有关 Spring Web MVC 的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
类中,处理程序方法定义如下
-
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 化”对象图,但在 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>