Статьи

Современный базовый стек приложений Java Spring

Создание веб-приложений на Java с использованием Spring Framework никогда не было таким простым. Если вы уже знакомы с Java и практически не имеете опыта создания веб-приложений, или если вы беспокоитесь о том, что все крутые ребята отказались от Java в пользу Ruby и Node.js, вы захотите прочитать это.

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

Мы будем использовать последние версии Java, Spring Framework (4.x), Spring Boot (v1.2.x), Spring Security, Spring Data JPA, Thymeleaf и Maven 3.

Почему весна?

Spring — одна из наиболее широко распространенных сред Java с открытым исходным кодом.

  • Spring — зрелая, но все еще инновационная платформа с открытым исходным кодом
  • У Spring очень активное сообщество
  • Spring легкий — его можно запустить из командной строки, используя встроенный контейнер
  • Spring и особенно Spring Boot делают вас очень продуктивным — не требуется настройка XML

Весна — это больше, чем рамки …

… Это платформа, которая охватывает большинство технологий, необходимых для создания веб-приложений:

  • Создание приложений MVC
  • Обеспечение аутентификации и авторизации
  • Подключение к базам данных RDBMS с использованием JDBC, Hibernate и JPA
  • Подключение к базам данных NoSQL (MongoDB, Neo4J, Redis, Solr, Hadoop и т. Д.)
  • Обработка сообщений (JMS, AMQP)
  • Кэширование
  • и т.п.

Время написать код

В этом руководстве мы создадим пример приложения для сокращения URL (исходный код доступен здесь ), и, хотя этот пост не охватывает все аспекты построения веб-приложения, надеюсь, вы найдете достаточно полезной информации, чтобы иметь возможность начать и хотеть узнать больше.

Приложение состоит из одной HTML-страницы, и оно может создать короткий URL-адрес из любого URL-адреса, и, как вы, вероятно, можете догадаться, оно также может перенаправить с короткого URL-адреса на исходный URL-адрес.

Чтобы запустить его, выполните в CLI следующую команду (при условии, что у вас уже установлен Maven v3 ):

$ mvn spring-boot:run

Составные части

YourlApplication.java

Это основной класс приложения, который инициализирует контекст Spring, включая все компоненты Spring в этом проекте, и запускает веб-приложение внутри встроенного веб-контейнера Apache Tomcat ( http://tomcat.apache.org ).

@SpringBootApplication
public class YourlApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourlApplication.class, args);
    }
}

Это в основном метод @SpringBootApplication и метод SpringApplication.run (), который делает магию здесь.

UrlController.java

@Controller
public class UrlController {
    @Autowired
    private IUrlStoreService urlStoreService;

    // ...
}

Следуя парадигме MVC, этот класс служит контроллером (обратите внимание на аннотацию @Controller), который обрабатывает HTTP-запросы. Каждый метод в этом классе с аннотацией @RequestMapping сопоставляется с конкретной конечной точкой HTTP:

  • showForm (): отображает домашний экран, где пользователи могут вводить URL для сокращения
    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(ShortenUrlRequest request) {
        return "shortener";
    }
  • redirectToUrl (): перенаправляет с сокращенного URL на исходный
        @RequestMapping(value = "/{id}", method = RequestMethod.GET)
        public void redirectToUrl(@PathVariable String id, HttpServletResponse resp) throws Exception {
            final String url = urlStoreService.findUrlById(id);
            if (url != null) {
                resp.addHeader("Location", url);
                resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
            } else {
                resp.sendError(HttpServletResponse.SC_NOT_FOUND);
            }
        }
  • shortenUrl (): как следует из названия, он создает сокращенную версию предоставленного URL-адреса и передает ее в файл shorttener.html для отображения.
    @RequestMapping(value="/", method = RequestMethod.POST)
    public ModelAndView shortenUrl(HttpServletRequest httpRequest,
                                   @Valid ShortenUrlRequest request,
                                   BindingResult bindingResult) {
        String url = request.getUrl();
        if (!isUrlValid(url)) {
            bindingResult.addError(new ObjectError("url", "Invalid url format: " + url));
        }
    
        ModelAndView modelAndView = new ModelAndView("shortener");
        if (!bindingResult.hasErrors()) {
            final String id = Hashing.murmur3_32()
                .hashString(url, StandardCharsets.UTF_8).toString();
            urlStoreService.storeUrl(id, url);
            String requestUrl = httpRequest.getRequestURL().toString();
            String prefix = requestUrl.substring(0, requestUrl.indexOf(httpRequest.getRequestURI(),
                "http://".length()));
    
            modelAndView.addObject("shortenedUrl", prefix + "/" + id);
        }
        return modelAndView;
    }

Как видите, аннотация @RequestMapping заботится о сопоставлении одного URL-адреса с методом Java. Метод может иметь несколько параметров:

  • @PathVariable (то есть: id), который происходит из динамической части URL (/ {id}), или
  • @RequestParam или
  • POJO (Простой старый Java-объект), где поля соответствуют параметрам запроса, или
  • @RequestBody в случае запросов POST, или
  • другие предопределенные компоненты, которые Spring делает доступными (например, HttpServletResponse)

ShortenUrlRequest.java

Spring укороченный запрос URL отображается в этот POJO (простой старый объект Java). Spring также заботится о проверке запроса, см. Аннотации в поле url.

public class ShortenUrlRequest {
    @NotNull
    @Size(min = 5, max = 1024)
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

shortener.html

Это шаблон на основе Thymeleaf ( http://www.thymeleaf.org/ ), который использует Twitter Bootstrap ( http://getbootstrap.com/ ) для визуализации HTML-кода главного экрана. Он отображает данные (модель), предоставленные сопоставлениями запросов в классе UrlController.

...
<div class="jumbotron">
  <div class="container">
  <h1>Shorten your url</h1>
    <p>
    <div class="alert alert-success" role="alert" th:if="${shortenedUrl}"
      th:utext="'Link created: &lt;a href=\'' + ${shortenedUrl} + '\'&gt;' + ${shortenedUrl}
       + '&lt;/a&gt;'">
    </div>
    <form class="form-inline" th:action="@{/}" th:object="${shortenUrlRequest}" method="POST">
      <div class="alert alert-danger" role="alert" th:if="${#fields.hasErrors('*')}"
         th:errors="*{url}">Input is incorrect</div>

      <div class="form-group">
        <input type="text" class="form-control" id="url" name="url"
           placeholder="http://www.example.com"
           th:field="*{url}" th:class="${#fields.hasErrors('url')}? fieldError"/>
      </div>
      <button type="submit" class="btn btn-primary">Shorten</button>
    </form>
    </p>
  </div>
</div>
...

InMemoryUrlStoreService.java

В настоящее время приложение сохраняет только сокращенные URL-адреса в постоянном слое в памяти, реализованном в этом минималистском классе. Позже мы можем улучшить это, внедрив интерфейс IUrlStoreService для сохранения данных в базе данных.

@Service
public class InMemoryUrlStoreService implements IUrlStoreService{
    private Map<String, String> urlByIdMap = new ConcurrentHashMap<>();

    @Override
    public String findUrlById(String id) {
        return urlByIdMap.get(id);
    }

    @Override
    public void storeUrl(String id, String url) {
        urlByIdMap.put(id, url);
    }
}

Обратите внимание, что метод @Service сообщает Spring, что это bean-компонент из уровня Service, который может быть внедрен в другие bean-компоненты, такие как UrlController.

Вывод

Это в двух словах. Мы рассмотрели все части этого веб-приложения. Я надеюсь, вы согласны с тем, что создание веб-приложений с использованием Java и Spring может быть увлекательным Больше нет шаблонного кода и конфигураций XML, последняя версия Spring позаботится об этом за нас.

Если вы хотите узнать больше о Spring Framework и Spring Boot, не забудьте подписаться на мою рассылку, чтобы получать последние обновления о Spring. Не стесняйтесь оставлять комментарии ниже, если у вас есть какие-либо вопросы или предложения.