Статьи

Создание современных веб-приложений с использованием Java и Spring

springavatar53586_0-150x150 Создание веб-приложений на 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 Framework

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-адрес.

Для запуска выполните в командной строке следующую команду (при условии, что у вас уже установлен Maven v3 ):

1
$ mvn spring-boot:run

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

YourlApplication.java

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

1
2
3
4
5
6
7
@SpringBootApplication
public class YourlApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(YourlApplication.class, args);
    }
}

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

UrlController.java

1
2
3
4
5
6
7
@Controller
public class UrlController {
    @Autowired
    private IUrlStoreService urlStoreService;
 
    // ...
}

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

  • showForm (): отображает домашний экран, где пользователи могут вводить URL для сокращения
    1
    2
    3
    4
    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(ShortenUrlRequest request) {
        return "shortener";
    }
  • redirectToUrl (): перенаправляет с сокращенного URL на исходный
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    @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 для отображения.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @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.

01
02
03
04
05
06
07
08
09
10
11
12
13
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.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...
<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 для сохранения данных в базе данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@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. Не стесняйтесь оставлять комментарии ниже, если у вас есть какие-либо вопросы или предложения.