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>