XSLT 視圖

XSLT 是一種 XML 的轉換語言,在網路應用程式中作為視圖技術非常受歡迎。如果您的應用程式自然地處理 XML,或者您的模型可以輕鬆轉換為 XML,則 XSLT 可以作為視圖技術的良好選擇。以下章節說明如何產生 XML 文件作為模型資料,並使其在 Spring Web MVC 應用程式中使用 XSLT 進行轉換。

此範例是一個簡單的 Spring 應用程式,它在 Controller 中建立單字列表,並將其新增至模型 Map。Map 會連同我們 XSLT 視圖的視圖名稱一起傳回。如需 Spring Web MVC 的 Controller 介面的詳細資訊,請參閱 註解控制器。XSLT 控制器會將單字列表轉換為簡單的 XML 文件,以供轉換。

Bean

組態是簡單 Spring 網路應用程式的標準組態: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 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>