Spring MVC и клиентская шаблонизация
В этой статья я расскажу о простом способе клиентской шаблонизации, используя spring MVC, apache tiles и jquery фреймворки.
Сериализация данных
Настройка spring MVC
В 3ю версию спринга уже включена поддержка json процессора (в роли которого выступает jackson codehaus), достаточно положить библиотеки jackson-core и jackson-mapper в class-path web приложения и объявить message converter и json-marshal в конфигурационном файле spring для сервлета.
1 | < bean class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />< bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >< property name = "messageConverters" >< list >< bean class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /></ list ></ property ></ bean >< bean id = "restJsonMarshalView" class = "org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> |
если вы работайте с maven, то в pom.xml нужно добавить следующие зависимости:
1 | < dependency >< groupId >org.codehaus.jackson</ groupId >< artifactId >jackson-core-lgpl</ artifactId >< version >1.5.6</ version ></ dependency >< dependency >< groupId >org.codehaus.jackson</ groupId >< artifactId >jackson-mapper-lgpl</ artifactId >< version >1.5.6</ version ></ dependency > |
Создание контроллера
Метод контроллера, который будет обрабатывать запрос, должен иметь аннотацию @ResponseBody. И возвращать объект для сериализации. Возьмем pojo для примера:
1 | public class User{ private String name; @JsonIgnoreprivate String password; public String getName(){ return name;} //... остальные гетеры и сетеры} |
Поле, с аннотацией JsonIgnore, будет игнорироваться при сериализации. Это довольно удобно, если класс так-же является hibernate/jpa сущностью. Нет необходимости создавать дополнительные классы-модели для передачи данных, достаточно просто пометить ненужные данные аннотацией.
На стороне контроллера никаких дополнительных действий делать не требуется:
1 | @Controller @RequestMapping ( "/user/" ) public class UserController{ @RequestMapping ( "/json" ) @ResponseBodypublic User json(){User user = new User();user.setName( "user" );user.setPassword( "pass" ); return user;}} |
Все, теперь по запросу /user/json сервер возврщает нам {«name»:«user»}, игнорируя поле password.
Json процессор, используемый в спринге, умеет работать со многими структурами (e.g. list, map, set) и типами (e.g file, dom) данных, структура с единственной строкой взята для простоты примера.
Шаблонизация
Создание шаблона
В качестве js шаблонизатора будем использовать jTemplates плагин для jquery. Чтобы избавиться от дублирования в шаблонах — apache tiles 2.
1 | <%@ page contentType= "text/html;charset=UTF-8" language= "java" %><%@ taglib uri= "http://tiles.apache.org/tags-tiles" prefix= "tiles" %><%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %><%response.setHeader( "Cache-Control" , "max-age" );//...%>{#template MAIN}<tiles:insertDefinition name= "inputField" ><tiles:putAttribute name= "name" value= "name" /><tiles:putAttribute name= "value" value= "{$T.name}" /></tiles:insertDefinition>{#/template MAIN} |
jTemplates умеет загружать внешние шаблоны, но накладывает ограничение: 1 файл — 1 шаблон. Тег {#template MAIN} говорит о начале js шаблона, а {$T.user} будет заменено шаблонизатором на значение «name» из json ответа. Сам тайлс inputField может выглядеть как угодно, например:
1 | < input type = "text" name = "${name}" value = "${value}" > |
Парсинг
Теперь достаточно вызвать со станицы шаблонизатор:
1 | $.getJSON('/user/json, function(data){$( "#result" ).setTemplateURL( "/templates/user.jsp" );$( "#result" ).processTemplate(data);}); |
остальное фреймворки сделают сами.
Заключение
Как видно из примера, нам не пришлось ничего кодировать для использования технологии клиентской шаблонизации. Более того, работай мы над реальной задачей, большая часть классов и tiles-шаблонов была бы уже создана.
Ссылки
jTemplates — jtemplates.tpython.com
Jackson процессор — jackson.codehaus.org