Определение устройства
Этот урок освещает процесс использования Spring для определения типа устройства, с которого зашли на ваш web-сайт.
Что вы создадите
Вы создадите Spring MVC приложение, которое будет определять тип устройства, с которого осуществляется доступ к вашему web-сайту и динамически переключать на отображение данных, соответствующих типу устройства.
Что вам потребуется
- Примерно 15 минут свободного времени
- Любимый текстовый редактор или IDE
- JDK 6 и выше
- Gradle 1.11+ или Maven 3.0+
- Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.
Как проходить этот урок
Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.
Чтобы начать с нуля, перейдите в Настройка проекта.
Чтобы пропустить базовые шаги, выполните следующее:
- Загрузите и
распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью
Git:
git clone https://github.com/spring-guides/gs-device-detection.git
- Перейдите в каталог
gs-device-detection/initial
- Забегая вперед, создайте автоконфигурацию
Когда вы закончите, можете сравнить получившийся результат с образцом в gs-device-detection/complete
.
Настройка проекта
Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.
Создание структуры каталогов
В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру,
командой mkdir -p src/main/java/hello
для *nix систем:
└── src └── main └── java └── hello
Создание файла сборки Gradle
Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.
pom.xml
, вы найдете, что указана версия для maven-compiler-plugin.
В общем, это не рекомендуется делать. В данном случае он предназначен для решения проблем с нашей CI системы,
которая по умолчанию имеет старую(до Java 5) версию этого плагина.
build.gradle
buildscript {
repositories {
maven { url "http://repo.spring.io/libs-release" }
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.6.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
jar {
baseName = 'gs-device-detection'
version = '0.1.0'
}
repositories {
mavenLocal()
mavenCentral()
maven { url "http://repo.spring.io/libs-release" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.mobile:spring-mobile-device")
testCompile("junit:junit")
}
task wrapper(type: Wrapper) {
gradleVersion = '1.11'
}
Spring Boot gradle plugin предоставляет множество удобных возможностей:
- Он собирает все jar'ы в classpath и собирает единое, исполняемое "über-jar", что делает более удобным выполнение и доставку вашего сервиса
- Он ищет
public static void main()
метод, как признак исполняемого класса - Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий
Автоконфигурация
Включая Spring Mobile, Spring Boot настраивает
DeviceResolverHandlerInterceptor
и DeviceHandlerMethodArgumentResolver
автоматически. DeviceResolverHandlerInterceptor
находит User-Agent
в заголовке входящего запроса и в зависимости от значения,
определяет, откуда был выполнен запрос: обычный(desktop), мобильный(phone) или планшетный браузер.
DeviceHandlerMethodArgumentResolver
позволяет Spring MVC использовать распознанный
Device
объект в методе контроллера.
Создание web-контроллера
В Spring, конечной точкой web-обработки являются простые Spring MVC контроллеры. Ниже представлен Spring MVC контроллер, который обрабатывает GET запрос и возвращает строку со значением типа устройства:
src/main/java/hello/DeviceDetectionController.java
package hello;
import org.springframework.mobile.device.Device;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class DeviceDetectionController {
@RequestMapping("/detect-device")
public @ResponseBody String detectDevice(Device device) {
String deviceType = "unknown";
if (device.isNormal()) {
deviceType = "normal";
} else if (device.isMobile()) {
deviceType = "mobile";
} else if (device.isTablet()) {
deviceType = "tablet";
}
return "Hello " + deviceType + " browser!";
}
}
В этом примере, вместо того, чтобы использовать представление(такое как JSP)
для представления данных в HTML, этот контроллер просто возвращает информацию
для записи прямо в тело ответа. В этом случае, данные - это строка
"Hello mobile browser!", если запрос был с мобильного устройства.
@ResponseBody
аннотация говорит Spring MVC писать полученный объект в тело ответа,
вместо того, чтобы отображать модель в представлении.
Создание приложения исполняемым
Несмотря на то, что пакет этого сервиса может быть в составе web-приложения и
WAR файлов,
более простой подход, продемонстрированный ниже создает отдельное самостоятельное приложение.
Вы упаковываете все в единый, исполняемый JAR-файл, который запускается через хорошо знакомый
старый main()
Java-метод. Попутно, вы используете поддержку Spring для встроенного
Tomcat
контейнера сервлетов как HTTP среду выполнения вместо развертывания на сторонний экземпляр.
src/main/java/hello/Application.java
package hello;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
main()
метод передает управление вспомогательному классу
SpringApplication,
где Application.class
- аргумент его run()
метода. Это сообщает Spring
о чтении метаданных аннотации из Application
и управлении ею как компонента в
Spring application context.
Аннотация @ComponentScan
говорит Spring'у рекурсивно искать в пакете hello
и его потомках классы, помеченные прямо или косвенно Spring аннотацией
@Component.
Эта директива гарантирует, что Spring найдет и зарегистрирует GreetingController
,
потому что он отмечен @RestController
, который, в свою очередь, является своего рода
@Component
аннотацией.
Аннотация @EnableAutoConfiguration
переключает на приемлемое по умолчанию поведение, основанное на содержании вашего classpath. К примеру,
т.к. приложение зависит от встраиваемой версии Tomcat (tomcat-embed-core.jar), Tomcat сервер установлен
и сконфигурирован на приемлемое по умолчанию поведение от вашего имени. И т.к. приложение также
зависит от Spring MVC (spring-webmvc.jar), Spring MVC
DispatcherServlet
сконфигурирован и зарегестрирован для вас - web.xml
не нужен! Автоконфигурация полезный и
гибкий механизм. Подробную информацию смотрите в
API документации.
Сборка исполняемого JAR
Вы можете собрать единый исполняемый JAR-файл, который содержит все необходимые зависимости, классы и ресурсы. Это делает его легким в загрузке, версионировании и развертывании сервиса как приложения на протяжении всего периода разработки, на различных средах и так далее.
./gradlew build
Затем вы можете запустить JAR-файл:
java -jar build/libs/gs-device-detection-0.1.0.jar
Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run
,
либо вы можете собрать приложение с mvn clean package
и запустить JAR примерно так:
java -jar target/gs-device-detection-0.1.0.jar
Запуск сервиса
Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:
./gradlew clean build && java -jar build/libs/gs-device-detection-0.1.0.jar
mvn clean package && java -jar target/gs-device-detection-0.1.0.jar
.
Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:
./gradlew bootRun
mvn spring-boot:run
.Выходные данные отображены. Сервис должен быть поднят и запущен через несколько секунд.
Тестирование сервиса
Для тестирования приложения, зайдите по ссылке http://localhost:8080/detect-device в вашем браузере. В обычном браузере вы должны увидеть такое:
Если вы зайдете с браузера мобильного телефона по тому же URL, вы должны такое:
Если вы зайдете с браузера планшетного ПК по тому же URL, вы должны такое:
Обратите внимание, что если вы захотите использовать реальное мобильное устройство для тестирования этого контроллера, то он не будер работать с localhost сервером. Для этого вам нужно узнать имя вашей машины в вашей сети и использовать его вместо localhost.
Итог
Поздравляем! Вы только что разработали простую web-страницу, которая определяет тип устройства, которое используется клиентом.
С оригинальным текстом урока вы можете ознакомиться на spring.io.
comments powered by Disqus