Из Википедии: Архитектура в стиле REST состоит из клиентов и серверов. Клиенты инициируют запросы к серверам; серверы обрабатывают запросы и возвращают соответствующие ответы. Запросы и ответы строятся вокруг передачи представлений ресурсов. Ресурс может быть, по существу, любым последовательным и значимым понятием, к которому можно обратиться.
Для тех, кто никогда не читал об отдыхе, это описание архитектуры отдыха может показаться странным и немного сложным.
Начнем с простого приложения Spring MVC, созданного с помощью шаблона Spring MVC . Не секрет, что здесь у вас будет файл servlet-context.xml, в котором регистрируются компонентное сканирование , управляемое аннотациями и InternalResourceViewResolver .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans:beans xmlns = "http://www.springframework.org/schema/mvc" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:beans = "http://www.springframework.org/schema/beans" xmlns:context = "http://www.springframework.org/schema/context" xmlns:util = "http://www.springframework.org/schema/util" xsi:schemaLocation = "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" > <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> < annotation-driven /> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> < beans:bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > < beans:property name = "prefix" value = "/WEB-INF/views/" /> < beans:property name = "suffix" value = ".jsp" /> </ beans:bean > < context:component-scan base-package = "org.springframework.rest" /> </ beans:beans > |
Следующим шагом является определение класса символов . Простой POJO с четырьмя атрибутами. Класс преобразуется в его представление XML с помощью аннотации Jaxb . Jaxb позволяет разработчикам отображать классы Java в представления XML и наоборот.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
package org.springframework.rest; import java.net.URL; import org.codehaus.jackson.annotate.JsonAutoDetect; @XmlRootElement public final class Character { private int id; private String name; private boolean isHuman; private URL characterUrl; protected Character() { } public Character( int id, String name, boolean isHuman, URL characterUrl) { super (); this .id = id; this .name = name; this .isHuman = isHuman; this .characterUrl = characterUrl; } public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public boolean isHuman() { return isHuman; } public void setHuman( boolean isHuman) { this .isHuman = isHuman; } public URL getCharacterUrl() { return characterUrl; } public void setCharacterUrl(URL characterUrl) { this .characterUrl = characterUrl; } @Override public int hashCode() { final int prime = 31 ; int result = 1 ; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if ( this == obj) return true ; if (obj == null ) return false ; if (getClass() != obj.getClass()) return false ; Character other = (Character) obj; if (id != other.id) return false ; return true ; } } |
И, наконец, самый важный класс в Spring MVC — « Контроллер ». Контроллер будет нести ответственность за выполнение необходимых операций ресурса персонажа . В текущем случае реализован только GET , остальные операции будут аналогичными. Давайте посмотрим код:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
@Controller public class HomeController { private static final Map<Integer, Character> characters = new HashMap<Integer, Character>(); static { try { characters.put( 1 , new Character( 1 , "Totoro" , false , new URL( "http://animeonly.org/albums/VISINAUJI/EGIO/fourth/Mon-Voisin-Totoro/normal_totoro_001.jpg" ))); characters.put( 2 , new Character( 2 , "Satsuki Kusakabe" , true , new URL( "http://profile.ak.fbcdn.net/hprofile-ak-ash2/48980_1802552968_7286_n.jpg" ))); characters.put( 3 , new Character( 3 , "Therru" , false , new URL( "http://28.media.tumblr.com/tumblr_lj4ctjKA8Y1qdvyqpo1_400.jpg" ))); } catch (MalformedURLException e) { e.printStackTrace(); } } /** * Simply selects the home view to render by returning its name. */ @RequestMapping (value = "/characters/{characterId}" , method = RequestMethod.GET) @ResponseBody public Character findCharacter( @PathVariable int characterId) { return characters.get(characterId); } } |
Первая часть — это карта, где хранятся все персонажи. Я использовал этот подход, чтобы не фокусироваться на доступе к данным. Затем метод findCharacter, который вызывается, когда URI равен / characters / {characterId }. Это шаблон URI и строка, подобная URI , содержащая одно или несколько имен переменных, доступ к которым можно получить с помощью аннотации @PathVariable . Поэтому, когда вы обращаетесь к параметру / characters / 1, characterId привязывается к 1.
Последняя важная часть — аннотация @ResponseBody . Эта аннотация может быть наложена на метод и указывает, что возвращаемый тип должен быть записан прямо в тело ответа HTTP , а не помещен в модель или интерпретирован как имя представления как стандартное поведение Spring MVC . Поэтому метод findCharacter возвращает объект Character .
И это все, если вы выполните этот код, и, например, введете URI http: // localhost: 8080 / RestServer / characters / 1, вывод (с использованием RestClient UI ) будет:
А теперь, когда вам интересно, ¿Если я возвращаю объект Character и выводим XML , где происходит преобразование между объектом и XML ? Так просто, позвольте мне представить новую концепцию: HttpMessageConverters . HttpMessageConverter отвечает за преобразование сообщения HTTP- запроса в объект и преобразование объекта в тело ответа HTTP . Далее HttpMessageConverters регистрируются по умолчанию:
ВЫВОДЫ
Конечно, это очень простое приложение с одной операцией, но оно дает вам представление о том, как разрабатывать веб-службы Restful с использованием Spring MVC . Это вопрос времени написания всех ваших необходимых операций, используя тот же подход, который я использовал с GET .
Придя в этот момент, я думаю, что все мы пришли к одинаковому выводу. Аннотации действительно мощные, и Spring MVC идеально подходит для разработки веб- сервисов RESTful .
Увидимся в следующий раз…
Ссылка: Разработайте веб-службы Restful с использованием Spring MVC от нашего партнера по JCG Алекса Сото в блоге One Jar To Rule All .
Статьи по Теме :
- Интеграция jqGrid, REST, AJAX и Spring MVC
- Тестирование интеграции Java RESTful API
- Создание веб-службы RESTful с использованием Spring 3.1 и конфигурации на основе Java, часть 2
- Разбор JSON для Android с помощью Gson
- Веб-сервисы RESTful с RESTeasy JAX-RS на Tomcat 7 — проект Eclipse и Maven
- Spring 3 RESTful веб-сервисы
- Spring MVC Development — Краткое руководство