XSLT 是一种 XML 的转换语言,在网络应用中作为一种视图技术很受欢迎。如果你的应用程序自然地处理 XML,或者你的模型可以很容易地转换为XML,那么 XSLT 可以作为视图技术的一个好选择。下面的部分展示了如何在 Spring Web MVC 应用程序中产生一个 XML 文档作为模型数据并通过 XSLT 进行转换。
这个例子是一个微不足道的 Spring 应用程序,它在控制器中创建了一个单词列表,并将它们添加到模型 Map 中。Map 会被返回,同时返回的还有我们的 XSLT 视图的名称。关于 Spring Web MVC 的控制器接口的细节,请看 注解的控制器。XSLT 控制器将单词列表变成一个简单的 XML 文档,准备进行转换。
Bean
配置是一个简单的 Spring Web 应用程序的标准配置。MVC 配置必须定义一个 XsltViewResolver Bean 和常规的 MVC 注解配置。下面的例子展示了如何做到这一点:
@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;
}
}
Controller
我们还需要一个控制器来封装我们的单词生成逻辑。
控制器的逻辑被封装在一个 @Controller 类中,处理方法被定义如下:
@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";
}
}
到目前为止,我们只创建了一个 DOM 文档,并将其添加到模型图中。请注意,你也可以将一个 XML 文件作为资源加载,并使用它来代替一个自定义的 DOM 文档。
有一些软件包可以自动 “domify” 对象图,但是,在 Spring 中,你可以完全灵活地以你选择的任何方式从你的模型中创建 DOM。这就防止了 XML 的转换在你的模型数据结构中扮演太重要的角色,这在使用工具来管理 DOM 化过程时是很危险的。
Transformation
最后,XsltViewResolver 解析了 “home” 的 XSLT 模板文件,并将 DOM 文档合并到其中,生成我们的视图。如 XsltViewResolver 配置所示,XSLT 模板住在 WEB-INF/xsl 目录下的 war 文件中,以 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>