XSLT视图
XSLT是一种用于XML的转换语言,在Web应用程序中作为一种视图技术非常流行。如果您的应用程序自然地处理XML,或者您的模型可以很容易地转换为XML,那么XSLT可以是一个很好的选择作为视图技术。以下部分将展示如何在Spring Web MVC应用程序中将模型数据生成为XML文档,并使用XSLT对其进行转换。
这个例子是一个简单的Spring应用程序,它在Controller中创建一个单词列表,并将这些单词添加到模型映射(model map)中。然后,该映射会被返回,同时还会附带我们XSLT视图的名称。有关Spring Web MVC的Controller接口的详细信息,请参阅带注解的控制器。XSLT控制器会将这些单词列表转换成一个简单的XML文档,以便进行后续处理(如转换)。
Beans
对于一个简单的Spring Web应用程序来说,配置是标准的:MVC配置需要定义一个XsltViewResolverbean以及常规的MVC注解配置。以下示例展示了如何进行这样的配置:
- Java
- Kotlin
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Bean
public XsltViewResolver xsltViewResolver() {
XsltViewResolver viewResolver = new XsltViewResolver();
viewResolver.setPrefix("/WEB-INF/xsl/");
viewResolver.setSuffix(".xslt");
return viewResolver;
}
}
@Configuration
class WebConfiguration : WebMvcConfigurer {
@Bean
fun xsltViewResolver() = XsltViewResolver().apply {
setPrefix("/WEB-INF/xsl/")
setSuffix(".xslt")
}
}
Controller
我们还需要一个控制器来封装我们的单词生成逻辑。
控制器逻辑被封装在一个@Controller类中,处理方法(handler method)的定义如下:
- 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 模板位于 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>
上述转换结果如下所示的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>