Как установить spring framework
Перейти к содержимому

Как установить spring framework

  • автор:

Как установить spring framework

Обеспечивает базовую поддержку управления зависимостями, управление транзакциями веб-приложений, доступ к данным, обмен сообщениями и многое другое.

Введение

Spring Framework обеспечивает комплексную модель разработки и конфигурации для современных бизнес-приложений на Java — на любых платформах. Ключевой элемент Spring — поддержка инфраструктуры на уровне приложения: основное внимание уделяется «водопроводу» бизнес-приложений, поэтому разработчики могут сосредоточиться на бизнес-логике без лишних настроек в зависимости от среды исполнения.

Возможности

  • Внедрение зависимости
  • Аспектно-ориентированное программирование, включая декларативное управление транзакциями
  • Создание Spring MVC web-приложений и RESTful web-сервисов
  • Начальная поддержка JDBC, JPA, JMS
  • Многое другое.

Быстрый старт

Рекомендованный путь для начального использования spring-framework в вашем проекте с использованием системы управления зависимостями – скопировать фрагмент кода ниже и вставить в вашу конфигурацию сборки. Нужна помощь? Ознакомьтесь с нашими руководствами по созданию приложений с использованием Maven и Gradle.

  org.springframework spring-context 4.1.6.RELEASE   
  org.springframework spring-context 4.0.8.RELEASE   
dependencies
dependencies

Spring Framework состоит из различных модулей, здесь мы показываем функциональность spring-context . См. «Руководства к действию» для использования в других случаях.

После того, как вы добавили в вашу сборке spring-context зависимость, вы можете сделать следующее:

package hello; public interface MessageService

hello/MessagePrinter.java

package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MessagePrinter < @Autowired private MessageService service; public void printMessage() < System.out.println(this.service.getMessage()); >>

hello/Application.java

package hello; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.*; @Configuration @ComponentScan public class Application < @Bean MessageService mockMessageService() < return new MessageService() < public String getMessage() < return "Hello World!"; >>; > public static void main(String[] args) < ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); MessagePrinter printer = context.getBean(MessagePrinter.class); printer.printMessage(); >>

Приведенный выше пример показывает основную концепцию внедрения зависимостей: MessagePrinter отделен от реализации MessageService , но Spring Framework связал из всех вместе.

Подробное руководство по работе с Java Spring для чайников

Spring – это простая в использовании среда Java MVC с открытым исходным кодом, обеспечивающая всестороннюю поддержку для простой и быстрой разработки приложений Java.

Spring – это облегченный фреймворк, который можно рассматривать как фреймворк фреймворков, поскольку он предлагает поддержку различных фреймворков, таких как Hibernate, Struts, Tapestry, JSF и т. д.

поддержка различных фреймворков

Особенности Spring Framework

Вот некоторые наиболее важные особенности Spring Framework:

  • Предопределенные шаблоны
  • облегченный
  • Быстрое развитие
  • Мощная абстракция
  • Предлагает множество ресурсов
  • Декларативная поддержка
  • Предлагает комплексные инструменты

Краткая история

Вот важные ориентиры из истории:

  • Spring Framework был написан Родом Джонсоном и впервые выпущен в июне 2002 года.
  • Spring La с т версия выпуск в марте 2004 года
  • Версия Spring 1.2.6 выпущена в 2006 году
  • Выпуск версии Spring 2.0 в октябре 2006 г.
  • Выпуск версии Spring 2.5 в ноябре 2007 г.
  • Выпуск версии Spring 3 в декабре 2009 г.
  • Выпуск версии Spring 3.1 в декабре 2011 г.
  • Выпуск версии Spring Framework 4 в декабре 2013 года с поддержкой Java 8
  • Spring Framework 4.2.0 версия выпущена в июле 2015 года
  • Spring Framework 4.2.1 версия выпущена в сентябре 2015
  • Версия Spring Framework 4.3 выпущена 10 июня 2016 года
  • Spring Framework 5.0 версия выпущена в июне 2017 года

Spring Framework Architecture

Spring Framework предоставляет 20 модулей, которые можно использовать в зависимости от требований приложения.

Spring Framework предоставляет 20 модулей

Core и Bean обеспечивают фундаментальную часть платформы, включая IoC и DI.

Основной контейнер

Базовый контейнер дополнительно разделен на подкомпоненты, такие как модули Core, Beans, Context и Expression Language.

Давайте рассмотрим каждую из этих моделей в деталях:

Spring Core:

Основной модуль обеспечивает все основные компоненты каркаса пружины. Включает функции IoC (Inversion of Control) и Inpension Injection.

Модуль предлагает BeanFactory, которая представляет собой сложную реализацию фабричного шаблона.

Context

Модуль Context основан на прочной основе, предоставляемой модулями Core и Beans, и является средой, которая помогает вам получить доступ к любым объектам, определенным и настроенным.

Языки весеннего выражения (SpEL):

Этот модуль предлагает язык выражений для изменения и запроса графов объектов во время выполнения.

Доступ к данным и интеграция:

Уровень доступа к данным и интеграции состоит из модулей JDBC, ORM, JDBC, OXM, JMS и Transaction.

  • ORM: модуль ORM обеспечивает согласованность / переносимость кода независимо от технологий доступа к данным. Он будет основан на концепции объектно-ориентированного отображения.
  • Модуль JDBC состоит из уровня абстракции JDBC. Это помогает вам понять необходимость выполнения кодирования, связанного с JDBC.
  • OXM: Object XML Mappers (OCM) помогает конвертировать объекты в формат XML и наоборот.
  • Модуль Java Messaging Service предлагает такие функции, как создание и потребление сообщений.
  • Транзакция: Этот модуль предлагает декларативный и программный метод управления для реализации уникальных интерфейсов и для всех типов POJO (Plain Old Java Object)

Web

Web: в этом модуле используются слушатели сервлетов и контекст веб-ориентированного приложения. Он также предлагает функцию веб-ориентированной интеграции и функциональность для загрузки файлов из нескольких частей.

Веб-сервлет: Этот модуль хранит реализацию на основе MVC для веб-приложений.

Web-Socket: модуль предлагает основанную на WebSocket и двустороннюю связь между клиентом и сервером в веб-приложениях.

Web-портлет: этот модуль также называется Spring-MVC-Portlet module. Он предлагает портлеты на основе Spring и копирует все функциональные возможности модуля Web-сервлетов.

AOP: язык AOP является полезным инструментом, который позволяет разработчикам добавлять корпоративные функциональные возможности в приложение.

Инструментарий: Этот модуль предлагает инструментарий класса и реализации загрузчика. Используется для конкретных серверов приложений.

Тест: Этот модуль поддерживает тестирование компонентов Spring с помощью инструментов TestNG или JUnit. Он предлагает последовательную загрузку Spring ApplicationContexts и кэширование этих контекстов.

Spring – MVC Framework

Spring - MVC Framework

Spring Web MVC Framework предлагает архитектуру модель-представление-контроллер и предлагает компоненты, которые помогают вам быть гибкими и слабо связанными веб-приложениями.

Шаблон MVC позволяет разделять различные аспекты приложения, предлагая слабую связь между этими элементами. Spring MVC также помогает вам создавать гибкие и слабо связанные веб-приложения.

Дизайн MVC также позволяет разделить бизнес-логику, логику представления и логику навигации. Он также предлагает элегантное решение для использования MVC в Spring Framework с помощью DispatcherServlet.

Как работает MVC?

Как работает MVC

  • DispatcherServlet получает запрос.
  • После этого DispatcherServlet связывается с HandlerMapping. Он также отзывает контроллер, связанный с этим конкретным запросом.
  • Контроллер обрабатывает этот запрос, вызывая методы службы и объект ModelAndView, возвращаемый DispatcherServlet.
  • Имя представления отправляется ViewResolver для поиска фактического представления для вызова.
  • После этого DispatcherServlet передается в View для отображения результата.
  • Используя данные модели, представление рендерится и отправляет результат обратно пользователю.

Аспектно-ориентированное программирование

Аспектно-ориентированное программирование позволяет глобальным свойствам программы решать, как она компилируется в исполняемую программу.

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

Межотраслевая проблема может затронуть все приложение и сосредоточена в одном месте в коде, таком как безопасность транзакций, управление, ведение журналов, аутентификация и т. д.

Аспектно-ориентированное программирование

Его также можно рассматривать как динамический шаблон оформления декоратора. Этот шаблон также предлагает дополнительное поведение, которое будет добавлено к существующему классу, оборачивая исходный класс и дублируя его интерфейс и удаляя исходный.

Основные концепции АОП

В Аспектно-ориентированном программировании есть семь основных концепций.

Основные концепции

Давайте обсудим их подробно:

  • Аспект: Аспект – это класс, который позволяет реализовать приложение JEE. Это касается нескольких классов, таких как управление транзакциями, безопасность и т. Д. Аспекты могут быть типичным классом, настроенным с использованием конфигурации Spring XML, или обычным классом, аннотированным с помощью аннотации @Aspect.
  • Точка соединения: это точка-кандидат в выполнении программы, где аспект может быть подключен. Это может быть метод, вызываемый как выбрасываемое исключение, или даже поле, которое модифицируется.
  • Совет: Совет – это фактические действия, предпринятые для конкретной точки соединения. Этот метод будет выполняться, когда конкретная точка соединения встречает точку сопоставления в приложении.
  • Pointcut: Это выражение, которое можно сопоставить с точками соединения, чтобы проверить, следует ли выполнить этот совет или нет.
  • Целевой объект: на основе целевого объекта применяются устройства. В AOP подкласс создается во время выполнения, где целевой метод должен быть переопределен, и рекомендации включаются в зависимости от их конфигурации.
  • Прокси: этот объект должен быть создан после применения рекомендации к целевому объекту.
  • Плетение: это метод связывания аспекта с другими объектами или типами приложения для создания рекомендованного объекта.

Установка Java Spring

Вот пошаговая информация по установке Java Spring на ваш компьютер:

Шаг 1) Зайдите на сайт www.eclipse.org.

Шаг 2) Загрузите установщик Eclipse Neon и установите его в своей системе Windows.

Установка Java Spring

Шаг 3) Нажмите кнопку «Загрузить 64-разрядную версию».

загрузка

Шаг 4) Перейдите в Eclipse IDE для разработчиков Java и нажмите на ссылку «64-bit».

64-bit

Шаг 5) Нажмите на ссылку «Windows 64-bit».

Windows 64-bit

Шаг 6) Нажмите на кнопку «Загрузить», чтобы загрузить ZIP-файл.

скачивание

Шаг 7) Распакуйте zip-файл для загрузки в определенную папку.

распаковка

Шаг 8) Нажмите кнопку «Обзор», чтобы выбрать каталог рабочей области.

выбор места

Шаг 9) Нажмите «Выбрать папку», чтобы выбрать папку.

выбор папки

Процесс будет отображаться, как показано на следующем экране.

процесс инсталяции

Шаг 10) Открытие клиента Eclipse Marketplace.

Eclipse Marketplace

Шаг 11) Поиск и установка плагина Spring.

установка плагина

Шаг 12) Подтвердите выбранные функции и нажмите кнопку «Подтвердить».

подтверждение

Шаг 13) Принятие условий и установка программного обеспечения.

принятие условий

Появится экран приветствия с ходом установки программного обеспечения.

экран приветствия

Шаг 14) Нажмите кнопку «Перезагрузить сейчас», чтобы перезапустить Eclipse IDE и применить изменения.

перезапустить Eclipse

Будет отображен следующий экран:

запуск

Преимущества Spring Framework

  • Spring позволяет разработчикам разрабатывать приложения корпоративного класса с помощью POJO.
  • Предлагает шаблоны для Hibernate, JDBC, Hibernate, JPA и т. Д., Чтобы уменьшить объем написанного кода.
  • Предоставляет абстракцию для Java Enterprise Edition (JEE).
  • Вы можете организовать по модульному принципу. Так что, если количество пакетов и классов является существенным, вам нужно только об этом и игнорировать все остальное.
  • Он предлагает декларативную поддержку транзакций, форматирования, проверки, кэширования и т. Д.
  • Приложение, разработанное с использованием Spring, является простым, поскольку код, зависящий от среды, перемещен в эту среду.

Недостатки Spring Framework

Вот минусы Spring Framework.

  • Слишком много ограничений.
  • Код общедоступен – это видно всем.
  • Не предлагает пользовательских функций.

Spring

Spring is an application framework for the Java platform. It helps you build modern web applications with support for microservice architectures, cloud systems, reactive processing, and serverless workloads.

IntelliJ IDEA provides extensive coding assistance for Spring, including a dedicated project wizard, code highlighting, intelligent context actions, embedded documentation, navigation, and highly customizable run configurations. For a detailed description of the supported features, refer to IntelliJ IDEA for Spring Developers.

Enable Spring support in IntelliJ IDEA

Spring support relies on the Spring and related plugins, which are bundled and enabled by default in IntelliJ IDEA Ultimate. This functionality is not available in IntelliJ IDEA Community Edition and IntelliJ IDEA Edu.

  1. Press Control+Alt+S to open the IDE settings and then select Plugins .
  2. Open the Installed tab, search for Spring and make sure that the checkboxes next to all relevant plugins are selected.

If you are new to Spring support in IntelliJ IDEA, start with Tutorial: Create your first Spring application or watch this video:

Spring Boot: от начала до продакшена


В данной статье я попробую расписать все шаги, которые потребуются для создания небольшого проекта на Spring Boot и развертывания его на боевом сервере.

Не будем тянуть долгими прелюдиями о философии java и spring’а, и сразу приступим к делу.

Для начала нам необходимо создать каркас приложения, внедрив туда весь необходимый зоопарк технологий(как минимум Spring, JPA, JDBC). До появления spring boot нужно было потратить на это немало времени, если конечно у вас не было рабочей заготовки в закромах кода. И именно сложность создания подобного каркаса, как мне кажется, останавливает многих от разработки небольших веб-проектов на java. Конечно, когда-то был хромой spring roo, который мог создать подобный каркас в ущерб производительности(привет аспектам), но даже с ним количество и сложность конфигурационных файлов заставляли долго медитировать над ними неподготовленного разработчика. Однако теперь с приходом Boot и Spring 4 жизнь стала немного проще и количество конфигурационных файлов заметно уменьшилось.

Если у вас есть Intellij Idea 14.1, то проблем с каркасом возникнуть вообще не должно, можно все сделать через специальный мастер создания проектов(File-New-Project. -Spring Initializr). Далее останется только указать названия проектов, выбрать интересующие нас технологии(Web, JDBC, JPA, PostgreSQL) и создать проект.

Если же у вас нет данной IDE, то скачиваем Spring Boot CLI, следуем инструкции в INSTALL.txt. Нужно задать системную переменную SPRING_HOME(путь к папке со Spring Boot, не к папке bin!) и добавить путь к SPRING_HOME/bin в системную переменную PATH на windows.

Итак, консоль спринга настроили, теперь самое время создать проект. Сделать это можно следующей командой:

spring init --dependencies=web,data-jpa,jdbc yourapp 

UPDATE
Кроме того, как написали в комментариях, существует еще веб-конструктор: start.spring.io

Далее импортируем получившийся каркас в любимую IDE и начинаем его модифицировать под наши нужды.

Для начала добавим в каталог src/main папку webapps. Все веб-ресурсы мы будем создавать в ней, а не в папке resources, как хочет того спринг. Дело в том, что если мы будем создавать файлы в папке resources, то тогда мы лишимся возможности видеть изменения, сделанные в наших веб-ресурсах, без перезагрузки сервера. А это может быть неприятно, когда ради того, чтобы посмотреть изменившийся текст на веб-странице приходится перезапускать веб-сервер.

Теперь в папке webapps создаем файл index.html и папки css, js, font, images, в которые будем класть соответствующие ресурсы.

Для примера сделаем самый простой каркас index.html:

   Yourapp   

HELLO WORLD

Изменим файл pom.xml
Должно получиться что-то подобное:

  4.0.0 com.yourcompany yourapp 0.0.1-SNAPSHOT jar YourApp org.springframework.boot spring-boot-starter-parent 1.2.3.RELEASE  UTF-8 com.yourcompany.Application 1.8   org.springframework.boot spring-boot-starter-web  org.springframework.boot spring-boot-starter-data-jpa  org.springframework.boot spring-boot-starter-jdbc  com.zaxxer HikariCP  org.postgresql postgresql 9.4-1201-jdbc41 runtime  org.springframework.boot spring-boot-starter-test test     org.springframework.boot spring-boot-maven-plugin  maven-resources-plugin 2.6  copy-resources validate copy-resources  $/target/classes/static  src/main/webapp true          

Из pom-файла мы можем увидеть следующее:
Мы используем java 8(самое время ее попробовать). Наш класс приложения называется com.yourcompany.Application(не забудьте переименовать стандартно сгенерированный класс, который может называться к примеру DemoApplication).

Мы используем postgresql 9.4(тоже неплохо бы установить его локально на свою машину). Connection pool для взаимодействия с базой данных мы берем самый модный и производительный (HikariCP). Кроме того, мы используем специальный плагин, который, когда мы будем генерировать итоговый jar’ник, перенесет все наши данные из webapp в resources/static, как того хочет spring boot. В противном случае вы не сможете увидеть все те веб-страницы, что создадите в папке webapps, когда запустите jar-ник.

Добавим пакет config и создадим в нем класс JpaConfig:

@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackageClasses = Application.class) public class JpaConfig implements TransactionManagementConfigurer < @Value("$") private String driver; @Value("$") private String url; @Value("$") private String username; @Value("$") private String password; @Value("$") private String dialect; @Value("$") private String hbm2ddlAuto; @Bean public DataSource configureDataSource() < HikariConfig config = new HikariConfig(); config.setDriverClassName(driver); config.setJdbcUrl(url); config.setUsername(username); config.setPassword(password); return new HikariDataSource(config); >@Bean public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory() < LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setDataSource(configureDataSource()); entityManagerFactoryBean.setPackagesToScan("com.yourcompany"); entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); Properties jpaProperties = new Properties(); jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, dialect); jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, hbm2ddlAuto); entityManagerFactoryBean.setJpaProperties(jpaProperties); return entityManagerFactoryBean; >@Bean public PlatformTransactionManager annotationDrivenTransactionManager() < return new JpaTransactionManager(); >> 

Кроме того, добавим в файл application.properties следующие строчки:

dataSource.driverClassName=org.postgresql.Driver dataSource.url=jdbc:postgresql://:5432/yourapp_data dataSource.username=postgres dataSource.password= hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.hbm2ddl.auto=update 

И наконец в Application.java меняем строку инициализации на следующую:

SpringApplication.run(new Class[] , args); 

Тем самым мы настроили подключение к СУБД PostgreSQL.

Не забываем создать саму базу данных и простенькую таблицу в ней. Сделать это удобнее всего через PgAdmin.
Создав в ней пустую базу yourapp_data, выполняем скрипт создания таблицы:

CREATE TABLE yourapp_data ( data_id uuid NOT NULL, data_description character varying(100) NOT NULL, CONSTRAINT yourapp_data_pk PRIMARY KEY (data_id) ) WITH ( OIDS=FALSE ); ALTER TABLE yourapp_data OWNER TO postgres; 

Теперь настало время немного заняться начинкой нашего проекта. А именно добавить какую-нибудь сущность БД и научиться с ней работать, получая с клиента данные для ее формирования и отправляя клиенту же данные об уже созданных сущностях.

Создаем пакеты controller, entity, repository, service, utils.

В пакете entity создаем интерфейс:

public interface DomainObject extends Serializable

и сущность:

public class Data implements DomainObject < private UUID id; private String description; public Data(UUID id, String description) < this.id = id; this.description = description; >public UUID getId() < return id; >public void setId(UUID id) < this.id = id; >public String getDescription() < return description; >public void setDescription(String description) < this.description = description; >> 

Аннотации JPA и Hibernate в данном примере использовать не будем, так как эти технологии сильно замедляют работу(запрос может выполняться в 10 раз медленнее, чем на чистом jdbc), а так как у нас нет сильно сложных сущностей, для которых реально может потребоваться ORM, то воспользуемся обычным jdbcTemplate.

Создаем интерфейс репозитория:

public interface DataRepository  < void persist(V object); void delete(V object); SetgetRandomData(); > 

И его реализацию:

@org.springframework.stereotype.Repository("dataRespitory") public class DataRepositoryImpl implements DataRepository < @Autowired protected JdbcOperations jdbcOperations; @Override public void persist(Data object) < Object[] params = new Object[] < object.getId(), object.getDescription() >; int[] types = new int[] < Types.VARCHAR, Types.VARCHAR >; jdbcOperations.update("INSERT INTO yourapp_data(\n" + " data_id, data_description)\n" + " VALUES (cast(? as UUID), ?);", params, types); > @Override public void delete(Data object) < jdbcOperations.update("DELETE FROM yourapp_data\n" + " WHERE data_id = '" + object.getId().toString() + "';"); >@Override public Set getRandomData() < Setresult = new HashSet<>(); SqlRowSet rowSet = jdbcOperations.queryForRowSet("SELECT data_description FROM yourapp_data p ORDER BY RANDOM() LIMIT 50;"); while (rowSet.next()) < result.add(rowSet.getString("data_description")); >return result; > > 

Вместо уже упомянутого jdbcTemplate, мы, как видите, используем JdbcOperations, который является его интерфейсом. Нам приходится использовать везде интерфейсы, отделяя их от реализации, так как, во-первых это стильно, модно, молодежно, а во-вторых, spring в нашем случае использует стандартный jdk’шный Proxy для наших объектов, поэтому напрямую инжектить реализацию не получиться, пока мы не введем полноценные аспекты и AspectJ compile-time weaving. В нашем случае этого и не требуется, чтобы не перегружать приложение.

Осталось уже немного. Создаем наш сервис(мы же хорошие разработчики и должны отделить бизнес-логику от логики работы с СУБД?).

public interface DataService < public boolean persist(String problem); public SetgetRandomData(); > 

Реализация:

@Service("dataService") public class DataServiceImpl implements DataService < private static final Logger LOG = LoggerFactory.getLogger(DataServiceImpl.class); @Autowired @Qualifier("dataRespitory") private DataRepository dataRepository; @Override public boolean persist(String problem) < try < dataRepository.persist(new Data(UUID.randomUUID(), problem)); return true; >catch (Exception e) < LOG.error("ERROR SAVING DATA: " + e.getMessage(), e); return false; >> @Override public Set getRandomData() < return dataRepository.getRandomData(); >> 

Отлично. Теперь создаем пару вспомогательных классов, необходимых для реализации контроллера:

public class RestException extends Exception < public RestException() < >public RestException(String message) < super(message); >public RestException(String message, Throwable cause) < super(message, cause); >public RestException(Throwable cause) < super(cause); >public RestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) < super(message, cause, enableSuppression, writableStackTrace); >> 

Это наша реализация Exception’а. Может пригодиться в будущем, хотя и не обязательна, но на нее завязан следующий класс:

@Controller public class ExceptionHandlerController < private static final Logger LOG = Logger.getLogger(ExceptionHandlerController.class); @ExceptionHandler(RestException.class) public @ResponseBody String handleException(RestException e) < LOG.error("Ошибка: " + e.getMessage(), e); return "Ошибка: " + e.getMessage(); >> 

Если мы словили такую ошибку в нашем контроллере, то она будет обработана дополнительно в этом методе.
Наконец напишем небольшой классик, который будет формировать структуру данных для передачи на клиент:

public class Ajax < public static MapsuccessResponse(Object object) < Mapresponse = new HashMap(); response.put("result", "success"); response.put("data", object); return response; > public static Map emptyResponse() < Mapresponse = new HashMap(); response.put("result", "success"); return response; > public static Map errorResponse(String errorMessage) < Mapresponse = new HashMap(); response.put("result", "error"); response.put("message", errorMessage); return response; > > 

Все, со вспомогательными классами закончили. Осталось написать наш контроллер. Он будет простым, как пробка:

@Controller public class DataController extends ExceptionHandlerController < private static final Logger LOG = Logger.getLogger(DataController.class); @Autowired @Qualifier("dataService") private DataService dataService; @RequestMapping(value = "/persist", method = RequestMethod.POST) public @ResponseBody Mappersist(@RequestParam("data") String data) throws RestException < try < if (data == null || data.equals("")) < return Ajax.emptyResponse(); >dataService.persist(data); return Ajax.emptyResponse(); > catch (Exception e) < throw new RestException(e); >> @RequestMapping(value = "/getRandomData", method = RequestMethod.GET) public @ResponseBody Map getRandomData() throws RestException < try < Setresult = dataService.getRandomData(); return Ajax.successResponse(result); > catch (Exception e) < throw new RestException(e); >> > 

В нем два метода — сохранить полученные данные и выдать порцию случайных данных на клиент. Контроллер унаследован от созданного нами ранее ExceptionHandlerController. Обработка исключений написана только как шаблон и нуждается в соответствующей доработки под себя.

Итак, основная часть серверного кода написана, осталось проверить его работу на клиенте. Для этого нужно доработать наш файл index.html и заодно добавить библиотеку jquery в каталог js.
index.html:

    YourApp    

HELLO WORLD

POST GET

Да, UI получился не бог весть каким красивым, но зато с его помощью мы можем проверить работу приложения.
Запустим наш проект. В Intellij Idea это можно сделать через специальную конфигурацию запуска(Spring Boot).
Если все сделано верно, то по адресу localhost:8080 вы сможете увидеть заголовок Hello World, строку ввода и две кнопки. Попробуйте ввести что-нибудь в строку ввода и нажать на кнопку POST. Если после этого вы увидите аналогичный текст ниже поля ввода, то все работает как надо. Теперь останется модифицировать проект под свои нужды, добавить модный UI(например materializecss.com) и творить разумное, доброе, вечное.

Однако рано или поздно вы сотворите желаемое и встанет вопрос о том, как донести ваше детище в массы. Об этом будет вторая часть статьи.

Начнем с малого, но важного.
Даже если проект небольшой, все равно для него потребуется свой домен. Если вы просто обкатываете какую-нибудь идею и не хотите тратить бешеные деньги для регистрации домена на том же godaddy, то можете воспользоваться бесплатной альтернативой: freenom.com

Этот сервис позволит бесплатно зарегистрировать домен в зонах .tk, .ml, .ga, .cf, .gq
Да, не самые лучшие зоны, но:

Далее займемся сервером, где все это будет крутиться. Так как проект у нас небольшой, то и сервер нам сгодится небольшой. В идеале хватит VPS. Достать его можно в разных местах, например www.digitalocean.com
Итак, регистрируемся, создаем самый простой дроплет и ставим на него ubuntu (в моем случае это ubuntu 12.04, дальнейшие инструкции буду описывать для этой системы, но на остальных будет примерно то же)

Отлично, у нас есть сервер, пора залить на него наш проект.

Для начала собираем проект maven’ом. Сделать это можно через IDE или же на худой конец зайдя в корневую директорию проекта и введя команду mvn clean install(путь к мавену должен быть прописан в системой переменной path на Windows). После выполнения команды собранный jar’ник помещается в локальный репозиторий (по умолчанию именуемый .m2), откуда его можно стянуть для отправки на сервер.

Для передачи файла на сервер используем WinSCP, если вы работаете под Windows.
Далее заходим на наш сервер, используя putty на Windows или ssh на Linux.
Переходим в директорию, куда был скопирован наш jar-ник и пробуем его запустить командой java -jar youapp.jar

Скорей всего, не получилось. А все почему? Наш проект был создан на java 8, а какая java стоит на сервере, можно узнать с помощью команды java -version. И скорей всего это либо 6, либо 7.

Но не будем унывать, поставим себе новую версию:

sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer 

Теперь настала очередь postgres’а. До этого мы использовали локальную версию на машине разработчика, теперь пришло время поставить СУБД на сервер.

Для этого сначала выполняем магическую последовательность команд:

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' sudo apt-get install wget ca-certificates wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update sudo apt-get upgrade sudo apt-get install postgresql-9.4 postgresql-contrib-9.4 

Запускаем postgres:

sudo service postgresql start

Далее выполняем команду входа в psql:

sudo -u postgres psql

Устанавливаем пароль:

\password postgres

И выходим c помощью команды \q

Редактируем файл /etc/postgresql/9.4/main/postgresql.conf, изменив строчку #listen_addresses = ‘localhost’ на listen_addresses = ‘*’
Тем самым мы сможем подключаться к postgresql извне с помощью pgadmin’а. Хотя, конечно, желательно этого избежать в целях безопасности, и когда все будет настроено и отлажено, отключить эту возможность.

Затем редактируем файл /etc/postgresql/9.4/main/pg_hba.conf
Должны быть добавлены две новых строчки и изменена одна строка для 127.0.0.1 следующим образом:

host all all 127.0.0.1/32 trust host all all /32 trust host all all /32 trust 

Я намеренно изменил md5 на trust, так как лично у меня были проблемы с запуском проекта, тем самым отключив проверку пароля для заданных адресов. Возможно у вас их не будет.

Теперь все настроено. Хотя тюнинговать постгрес можно до бесконечности, но ведь у нас всего лишь маленький проект, а значит, пока оставим как есть.

 sudo service postgresql restart 

и проверяем его работу.

Всё, с настройкой postgres’а закончили, что у нас дальше по сценарию?

Как уже было отмечено ранее, для запуска собранного jar’ника вполне достаточно команды java -jar youapp.jar
Однако при подобном запуске для того, чтобы зайти на сайт извне, придется прописывать порт(по умолчанию 8080). Чтобы пользователи смогли зайти на сайт, просто введя его адрес, то нам потребуется прокси сервер. В качестве него можно взять nginx, который нужно будет предварительно настроить.

sudo apt-get install nginx 

В моем случае корневой директорией nginx была /etc/nginx. Там нам в первую очередь потребуется изменить файл /sites_available/default следующим образом:

server < listen 80; server_name youapp.com; location / < proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080/; >> 

Однако и это еще не все. Необходимо также модифицировать наш проект, чтобы он поддерживал настроенный нами прокси. Благо сделать это не трудно, достаточно лишь в application.properties добавить строки(не забудьте залить новую версию с изменениями):

server.tomcat.remote_ip_header=x-forwarded-for server.tomcat.protocol_header=x-forwarded-proto 

Теперь можно запустить nginx командой service nginx start и затем попробовать запустить наш проект. Он будет доступен по ссылке сайта, либо же, если вы еще не приобрели домен, то по его ip-адресу, без указания порта.

Остался еще один небольшой штрих. Немного неудобно всегда стартовать проект тем способом, который был описан выше. Неплохо бы, чтобы при старте проекта консоль ввода на сервере освобождалась, приложение не закрывалось бы после выхода из ssh-сессии и чтобы где-нибудь велись логи приложения. Сделать это можно с помощью команды nohup. Предварительно создаем bash-скрипт, называя его script.sh:

#!/bin/bash java -jar youapp.jar 

Прописываем ему право на исполнение:

chmod +x ./script.sh 

И запускаем командой:

nohup ./start.sh > log.txt 2>&1 & 

Все, приложение запущено.

Чтобы остановить приложение, можно либо воспользоваться командой pkill -9 java(при условии, что это единственное java-приложение, запущенное на сервере), либо с помощью утилиты htop, выделив этот процесс, нажав кнопку F9, выбрав слева в списке SIGKILL и нажав enter. На заметку: иногда не срабатывает с первого раза и процедуру приходится повторять.

Теперь, если все сделано правильно, можно открыть сайт нашего проекта в браузере и насладиться результатом.

P.S. Надеюсь, ничего не упустил. Если же найдете ошибку, просьба написать об этом в личном сообщении. Текст будет оперативно исправлен.

  • java
  • spring
  • spring boot
  • веб-разработка
  • все читают теги но зачем
  • Веб-разработка
  • Программирование
  • Java

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *