Spring MVC и клиентская шаблонизация

22 октября 2010 г.

В этой статья я расскажу о простом способе клиентской шаблонизации, используя spring MVC, apache tiles и jquery фреймворки.

Сериализация данных

Настройка spring MVC

В 3ю версию спринга уже включена поддержка json процессора (в роли которого выступает jackson codehaus), достаточно положить библиотеки jackson-core и jackson-mapper в class-path web приложения и объявить message converter и json-marshal в конфигурационном файле spring для сервлета.

<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 нужно добавить следующие зависимости:

<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 для примера:

public class User{private String name;@JsonIgnoreprivate String password;public String getName(){return name;}//... остальные гетеры и сетеры}

Поле, с аннотацией JsonIgnore, будет игнорироваться при сериализации. Это довольно удобно, если класс так-же является hibernate/jpa сущностью. Нет необходимости создавать дополнительные классы-модели для передачи данных, достаточно просто пометить ненужные данные аннотацией.

На стороне контроллера никаких дополнительных действий делать не требуется:

@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.

<%@ 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 может выглядеть как угодно, например:

<input type="text" name="${name}" value="${value}">
Парсинг

Теперь достаточно вызвать со станицы шаблонизатор:

$.getJSON('/user/json, function(data){$("#result").setTemplateURL("/templates/user.jsp");$("#result").processTemplate(data);});

остальное фреймворки сделают сами.

Заключение

Как видно из примера, нам не пришлось ничего кодировать для использования технологии клиентской шаблонизации. Более того, работай мы над реальной задачей, большая часть классов и tiles-шаблонов была бы уже создана.

Ссылки

jTemplates — jtemplates.tpython.com
Jackson процессор — jackson.codehaus.org

 

Теги:
рубрика Java