XSLT — це мова перетворення XML, яка популярна як технологія подання у вебдодатках. XSLT може бути продуманим вибором як технологія подання, якщо твоя програма природним чином працює з XML або якщо твою модель можна легко перетворити на XML. У наступному розділі показано, як створити XML-документ як дані моделі та перетворити його за допомогою XSLT у додатку на Spring Web MVC.
Цей приклад є найпростішим додатком Spring, який створює список слів в Контролер
і додає їх до Map
моделі. Повертається Map, а також ім'я подання нашого XSLT-подання. Контролер XSLT перетворює список слів на простий
XML-документ, готовий до перетворення.
Біни
Конфігурація є стандартною для простого вебдодатку Spring: Конфігурація MVC повинна визначати бін XsltViewResolver
та звичайну конфігурацію анотацій MVC. У цьому прикладі показано, як це зробити:
@EnableWebMvc
@ComponentScan
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public XsltViewResolver xsltViewResolver() {
XsltViewResolver viewResolver = новий 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
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-документ і додали його до моделі Map. Зверни увагу, що також можна завантажити XML-файл
як Resource
і використовувати його замість кастомного DOM-документа.
Існують програмні пакети, які автоматично "DOMіфікують" об'єктний граф, але Spring забезпечує цілковиту гнучкість у частині створення DOM з твоєї моделі будь-яким вибраним вами способом. Це дозволяє запобігти перетворенню XML, що відіграє надто велику роль у структурі даних твоєї моделі, і це становить небезпеку при використанні інструментів для керування процесом DOMіфікації.
Перетворення
Нарешті, XsltViewResolver
дозволяє "домашній" файл шаблону 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>
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ