Создание веб-приложений на 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: <a href=\'' + ${shortenedUrl} + '\'>' + ${shortenedUrl}
+ '</a>'">
</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. Не стесняйтесь оставлять комментарии ниже, если у вас есть какие-либо вопросы или предложения.