- Привет, Амиго!
- Здорово, Билаабо! Что у нас сегодня?
- Сегодня я расскажу тебе, как установить web-сервер Tomcat.
- А веб-сервер – это что? Что такое вообще сервер?
- Есть такой принцип взаимодействия программ – «клиент-сервер». Сервер (от слова serve – обслуживать) – обслуживает запросы клиентов. Клиенты обращаются со своими запросами к серверу, сервер их выполняет и возвращает результат.
Вот представь ситуацию: продавец в магазине обслуживает клиентов. Тогда продавец – это фактически сервер, клиенты магазина – клиенты, а товар, который продавец продает, - результат обработки запроса (результат работы сервера).
- Т.е. сервер – это тот, кто обслуживает запросы/заказы/потребности клиентов, так?
- Да.
- Хорошо, а что же такое – веб-сервер?
- Веб-сервер – это программа, которая обслуживает запросы страниц из браузеров пользователей.
Когда ты вбиваешь в браузере определенный URL(ссылку), то запрос уходит на сервер, сервер этот запрос обслуживает, генерирует веб-страницу и отдает (отсылает) ее обратно браузеру.
Веб-сервер – это сервер. Браузер – клиент. URL – это запрос. Веб-страница – результат обработки запроса.
- Ага. Ситуация понемногу проясняется. Т.е. веб-сервер – это программа(?), которая генерирует страницы для браузера(ов). Так?
- Да.
Давай возьмем обычную ссылку:
Разбор ссылки |
---|
http://javarush.ru/alpha/api/contacts?userid=13&fileter=none&page=3 |
Описание частей ссылки |
javarush.ru – это домен - уникальное имя (адрес) компьютера в интернете |
http - это протокол (стандарт) взаимодействия клиента и сервера |
alpha/api/contacts – запрос к веб-серверу / запрос веб-страницы на сервере |
userid=13 &fileter=none & page=3 – параметры запроса |
Смотри. Мы берем компьютер, подключаем его к интернету.
Затем покупаем ему доменное имя.
Затем запускаем на нем программу веб-сервер.
Теперь этому веб-серверу можно посылать запросы из любого браузера, вбивая ссылку и указывая в ней его доменное имя.
- Вроде понятно.
- Приведу некоторую аналогию, чтобы все стало еще немного понятнее.
Разбор |
---|
По-русски://Вася,/дай мне папку?номер=13 |
Описание частей |
Вася – это уникальное имя компьютера в интернете |
По-русски - это протокол (стандарт) взаимодействия клиента и сервера |
дай мне папку – запрос к веб-серверу / запрос веб-страницы на сервере |
номер=13 – параметры запроса |
- Ага. Так действительно понятнее. Спасибо.
- Это еще не все. Иногда на одном компьютере запускают несколько программ – веб-серверов. Для того чтобы их отличать, им назначают номера.
Представь, что домен – это дом. Если в доме живет одна семья, то при отправке ей письма, ты бы написал что-то вроде «ул. Третьего Анти-Марсианского Восстания, дом 5 »
А теперь представь, что в доме живет много семей.
- Многоквартирный дом?
- Именно! Очень похоже. Спасибо за аналогию.
В таком доме много квартир. В некоторых квартирах никто не живет, в некоторых живут веб-сервера. И когда ты отправляешь запрос к веб-серверу, надо указывать еще и номер квартиры. Такой номер в ссылке называют портом.
Пример:
http://javarush.ru:80/alpha/api/contacts?userid=13&fileter=none&page=3 |
http://javarush.ru:8080/alpha/api/contacts?userid=13&fileter=none&page=3 |
http://javarush.ru:443/alpha/api/contacts?userid=13&fileter=none&page=3 |
На самом деле, все сервера – это многоквартирные дома. И в каждом по 65000 квартир (портов).
- А почему 65000?
- Для обозначения номер порта используются два байт данных. 65536 – это максимальное значение в целом типе длинной в два байта.
У каждого протокола (http, https, ftp,…) есть свой порт, используемый по умолчанию.
Если номер квартиры (порт) не указан, то используется порт-по-умолчанию, который определяется на основе протокола.
Если протокол http, то порт – 80. Если протокол https, то порт – 443, и т.д.
Т.е. эти записи эквиваленты:
Ссылка | Что это значит на самом деле |
---|---|
http://www.mail.ru | http://www.mail.ru:80 |
http://javarush.ru | http://javarush.ru:80 |
http://javarush.ru/alpha | http://javarush.ru:80/alpha |
https://javarush.ru/api?x | https://javarush.ru:443/api?x |
- А если порт 444, а протокол – https?
- Я же уже говорил. Если порт не указан, он определяется из протокола, а если указан – используется указанный.
- Ясно.
- Ты знаешь, что люди, кроме имен, иногда еще используют местоимения: я, ты, он,…
- Ага. Но люди странные сами по себе. Стараюсь не обращать на это внимание.
- Так вот, у компьютера тоже есть доменное имя, которое обозначает «Я». Это – localhost.
Если ты в браузере напишешь localhost, то браузер обратится к твоему же компьютеру.
И если у тебя будет установлена программа – веб-сервер, то она будет отдавать браузеру веб-страницы.
- Круто! Хочу запустить себе веб-сервер и открывать его страницы в браузере.
Расскажи мне как это сделать, Билаабо. Пожалуйста!!! Ты же мне друг?
- Для друга Билаабо сделает все что угодно.
Тогда слушай.
Шаг 1 |
---|
Надо установить JavaJDK |
Результат |
Установленная JDK |
- Билаабо, я же программист 30 уровня, у меня JDK уже давно стоит!
- Отлично, тогда пойдем дальше.
Шаг 2 |
---|
Скачать Tomcat 7 |
Подсказка 1 |
Погуглить |
Подсказка 2 |
Официальная страница Apache Tomcat |
Подсказка 3 (прямая ссылка для Windows пользователей) |
Скачать Apache Tomcat 7 |
- Есть.
- Отлично.
Шаг 3 |
---|
Установить Tomcat 7 Используй настройки установки по умолчанию. Ничего менять не надо. |
Экран 3 |
![]() |
Экран 4 |
![]() Тут можно задать имя web-сервера и его рабочий порт. По умолчанию 8080. Ничего менять не надо, оставляем все как есть. |
Экран 5 |
![]() Указываем папку, где у нас стоит JDK |
Экран 6 |
![]() |
Экран 7 |
![]() |
- Ага. Просто покликал Next и все.
- Отлично. Теперь у тебя установлен и запущен веб-сервер Tomcat 7, который слушает запросы на порту 8080. Это стандартный порт для разработки программ.
- Да, Tomcat у меня есть, а как мне написать программу для него?
Я хочу, чтобы он написал что-нибудь интересное. Какую-нибудь прикольную страницу.
- Хорошо, я расскажу тебе, как это сделать, но после небольшого перерыва.
- А вот и я. Как ты и просил, сейчас я расскажу тебе, как написать первую программу для веб-сервера.
Веб-сервер сам по себе – это как операционная система. Он ценен не сам по себе, а потому, что в нем можно запускать специальные веб-программы – сервлеты(Servlet).
Именно эти сервелаты и обрабатывают запросы, приходящие от пользователей.
- А как они обрабатывают запросы? Как вообще запустить свою программу внутри веб-сервера?
- Чтобы написать свой сервлет, надо унаследовать класс от класса HttpServlet. Затем реализовать там методы doGet() и doPost(). Когда от пользователя придет запрос, веб сервер создаст объект твоего класса-сервлета и вызовет у него метод doGet(). Или doPost(), в зависимости от типа запроса из браузера.
- А как моя программа вообще попадет в web-server?
- Тут все просто. Ты пишешь программу, компилируешь ее и кладешь в специальную папку, в директорию, куда установил Tomcat.
Сервлеты – это большая отдельная и интересная тема. Поэтому я не буду тебе сегодня ее рассказывать. Я расскажу тебе немного о другом.
Есть одна очень интересная разновидность сервлетов – это JSP. Чем-то напоминает PHP.
Давай мы напишем самую простую веб-программу с использованием JSP, и запустим ее.
- Давай! Я – готов.
- Тогда начнем.
Шаг 1 – создаем новый web-проект
- Есть.
Шаг 2 – указываем тип модуля – JavaModule, задаем имя и JDK
- Есть.
Шаг 3 – указываем тип приложения - WebApplication
- Есть.
- Ты должен видеть новый созданный пустой проект.
Почти пустой. В нем будет один файл – index.jsp. Найди его.
Шаг 4 – Находим jsp-файл
- Нашел.
- Отлично. Вот в нем можно будет написать код нашего сервлета.
Но давай сначала немного настроим Intellij IDEA.
Можно запускать сервлеты в Tomcat'е прямо из Intellij IDEA. Дебажить их, если надо. В общем, это очень удобно и круто. Ты это оценишь, когда придет время.
- Верю. Так что делать дальше?
- Мы «научим» Intellij IDEA запускать наш webmodule (наше приложение) в Tomcat.
Шаг 5 – выбираем в меню EditConfiguration
- Готово.
Шаг 6 – создаем новую конфигурацию – жми плюсик
- Есть.
Шаг 7 – указываем что запускать – TomcatServer, Local
- Задаем имя этой конфигурации – отмечено красным кружком.
Зеленым выделен порт, на котором будет запускаться сервлет с Tomcat'ом.
Надо еще указать IntellijIDEA, где находится наш Tomcat. Жми кнопку Configure…
Шаг 8 – конфигурируем запуск приложения
Теперь надо выбрать папку, где находится Tomcat:
Шаг 9 – указываем месторасположение Tomcat'а
- Готово.
- Должно получиться что-то типа такого:
Шаг 10 – результат настройки:
Теперь нужно привязать наш проект к Tomcat'у.
- Сколько всего надо сделать. Хорошо, что есть такая подробная инструкция.
- А, то! Для друга же стараюсь.
Теперь жми кнопку Fix и IDEA все сделает сама.
Шаг 11 – IDEA делает привязку проекта и Tomcat
- Готово.
- Отлично. Еще одно замечание. Порт 8080 уже скорее всего занят. Ведь Tomcat запустился сразу после установки.
Intellij IDEA умеет «подкладывать» сервлеты к уже запущенному проекту, но сейчас для простоты она будет каждый раз запускать новый Tomcat.
- Т.е. у нас будет несколько запущенных Tomcat'ов?
- Ага. И каждому нужен свой порт. Поэтому, давай-ка в настройках проекта поменяем порт 8080, на порт 8888.
- 4 восьмерки – мне нравится.
Шаг 12 – меняем порт на 8888
- Сделал.
- Отлично. С настройками мы покончили.
- Так, а что дальше?
- Теперь давай немного поменяем наш index.jsp
Напиши там что-нибудь, например «Вся власть – крабообразным».
Шаг 13 – меняем index.jsp
- Не, я лучше «Вся власть роботам!» напишу.
- Отлично. Теперь осталось совсем немного.
Шаг 14 – запускаем сервлет и Tomcat
Должен быть виден лог работающего Tomcat, без ошибок и stackTrace.
Что-то типа такого:
Шаг 15 – лог запущенного Tomcat
При этом IDEA должна открыть браузер с ссылкой на твой сервлет.
Должно получиться что-то типа такого:
Шаг 16 – меняем index.jsp
- Ага. Так и есть. Круто!
- А теперь напиши в браузере ссылку:
http://localhost:8888/index.jsp |
- Ничего не поменялось.
- Ну не скажи.
Шаг 17 – меняем index.jsp
Тут в браузере отображается тот файл index.jsp, который ты видел в IntellijIDEA.
- Который я менял?
- Да.
Но если в запросе браузера указан только домен без остальной части запроса, то будет вызван обработчик по умолчанию. В нашем случае – это index.jsp
Допустим, у тебя есть три файла: index.jsp, apple.jsp, google.jsp. Вот как будут обстоять дела:
Запрос | Ответ |
---|---|
http://localhost:8888 | index.jsp |
http://localhost:8888/ | index.jsp |
http://localhost:8888/index.jsp | index.jsp |
http://localhost:8888/apple.jsp | apple.jsp |
http://localhost:8888/samsung.jsp | Сообщение об ошибке – сервлет не найден |
http://localhost:8888/google.jsp | google.jsp |
http://localhost:8888/index | Сообщение об ошибке – сервлет не найден |
- Это я понял.
Билаабо. Ты так долго рассказывал, что JSP это круто. Но они же очень похожи на самые обычные HTML-страницы. Все то же самое.
- Ну не совсем. Попробуй написать в JSP такой текст:
JSP-код |
---|
<%@ page contentType="text/html; charset=UTF-8" language="java" %> <html> <head> <title>Привет от Амиго</title> </head> <body> <%--это еще HTML--%> <% //А тут можно писать Java-код String s = "Вся власть роботам!"; for(int i=0; i<10; i++) { out.println(s); out.println("<br>"); } %> <%--а это уже опять HTML--%> </body> </html> |
Внутри JSP-страницы можно делать вставки Java-кода и он будет работать!
Java-код в JSP-странице называется скриптлетом и обозначается двумя «скобками – « <% » и « %> »
- Ничего себе.
Ладно. Пойду напишу пару своих JSP-страниц.
Большое тебе спасибо, Билаабо.
- И тебе спасибо, друг!
- Привет, Амиго!
- Привет, Элли! У тебя новая прическа? Тебе очень идет!
- Да? Спасибо!
Сегодня я расскажу тебе про работу в Intellij IDEA.
- Так я уже работаю в ней и довольно давно.
- Да, я знаю, поэтому и хочу тебе рассказать про некоторые вещи, которые значительно упрощают жизнь.
Первое и самое главное, что должен уметь каждый разработчик – это отладка программы. Или как еще называют – дебаг. Баг по-английски – жук – сленговое название ошибок в программе.
В Intellij IDEA можно запустить приложение в двух режимах.
Кнопки | Режимы |
---|---|
![]() |
Обычный запуск программы |
![]() |
Запуск программы в режиме отладки (дебага) |
- Ага. Кнопка в виде жука – это дебаг. Прикольно придумано.
- Самое важное! При запуске в режиме отладки ты можешь выполнять приложение пошагово. По одной строчке за раз.
А самая важная часть дебага – это точки останова.
На любой строчке кода ты можешь поставить точку останова – BreakPoint. Программа, запущенная в режиме отладки, дойдёт до этой точки и остановится. Чтобы поставить BreakPoint, надо поставить курсор на нужную строку и нажать Ctrl+F8. Чтобы убрать – снова Ctrl+F8.
Чтобы продолжить исполнение программы до следующей точки останова – надо нажать F5.
Чтобы продолжить исполнение программы пошагово (построчно) надо нажать F7 или F8.
При этом, при нажатии F7 программа будет заходить в методы, когда они вызываются.
При нажатии F8 вызов метода будет считаться за 1 шаг – программа не будет заходить в методы.
- А можно этот момент, только более подробно.
- Конечно. Вот скопируй себе код, а я на его примере объясню, что надо делать:
Код |
---|
package com.javarush.test; public class MainClass { public static void main(String[] args) { int n = 100; int sum = 0; for (int i = 0; i< n; i++) { sum += i; } System.out.println(sum); } } |
В этом примере мы просто считаем сумму чисел от 0 до n. |
Как поставить точку остановки – BreakPoint
Вариант 1 – стать курсором на нужную строку и нажать Ctrl+F8
Вариант 2 – кликнуть слева от нужно строки. На картинке снизу место отмечено крестиком.
Как поставить точку остановки | Результат |
---|---|
![]() |
![]() |
Чтобы убрать BreakPoint – кликни на красный кружочек или нажмите Ctrl+F8.
Теперь запускаем программу кликом мышкой на кнопке дебаг.
Должно получиться что-то типа такого:
Код |
---|
![]() |
Весь код программы выполнился до синей строки. Строка, выделенная синим цветом, еще не выполнилась.
Нажми F8 и выполни ее. Должно получиться как на картинке ниже:
Код |
---|
![]() |
Красная – точка остановки – BreakPoint Синяя – текущая строка отладки/дебага |
Давай заменим число 100 в коде на 5 и попробуем выполнить всю программу пошагово. Вот какая будет последовательность шагов:
Код | |
---|---|
![]() |
![]() |
Первый шаг – это строчка выделенная красным.
Пустые строки пропускаются, так же как и скобки – там нет никакого кода.
Теперь давай немного усложним программу, и я покажу тебе разницу между F7 и F8.
Код | F7 | F8 |
---|---|---|
![]() |
![]() |
![]() |
Если ты нажимаешь F8, то выполняешь текущую строку за 1 шаг.
Если нажимаешь F7 и в текущей строке вызов метода, ты «заходишь» туда и выполняешь его пошагово.
- Т.е. разница в том – заходим мы в метод или нет.
- Ага.
- А я могу комбинировать F7 и F8? Т.е. какие-то методы пропускаю, которые мне не интересны, а в какие-то захожу?
- Да.
- Но это еще не все. Как ты думаешь – для чего был придуман режим отладки?
Это риторический вопрос.
Самое интересное в том, что на каждом шаге в дебаге ты можешь смотреть значения всех переменных, которые есть! Включая локальные переменные методов, аргументы, да фактически все что угодно.
Когда ты запускаешь режим отладки и делаешь остановку, снизу появляется специальная панель:
Режим отладки |
---|
![]() |
Комментарии |
Зеленым выделен раздел переменных, в нем видны все локальные переменные Красным выделено окно watch – в него можно добавить переменные самому Оранжевым – список нитей. Прямо под ним – стек-трейс текущей нити |
Сейчас я нажму F8 три раза, и в среднем окне появятся значения двух новых переменных – sum5 & sum7.
А в правом нижнем окне я нажму на плюсик и добавлю сразу выражение sum5+sum7.
Вот что у меня получилось:
Режим отладки |
---|
![]() |
Комментарии |
В центре внизу мы видим значения переменных Справа внизу мы видим текущее значение выражения sum5+sum7 |
Окно Watches удобно использовать, когда переменные имеют длинные и сложные имена, например:
this.connection.getProvider().getRights().get("super") |
- Круто! Классные штуки.
- Кроме Watches есть еще Quick Watches. Ты можешь узнать значение любой переменной, просто поднеся к ней мышку. Подержи мышку над переменной пару секунд и во всплывающем окне можно будет увидеть ее значение.
Режим отладки |
---|
![]() |
Комментарии |
Мышки на скриншоте не видно, но она была в центре красного кружка, прямо над именем переменной. |
И самое интересное. Значения переменных можно менять!
Просто кликаешь правой кнопкой мыши на переменной в Watches или Variables, выбираешь пункт SetValue и вводишь новое значение. Или просто жмешь F2.
Вот как это выглядит у меня:
Режим отладки |
---|
![]() |
Комментарии |
Можно задать переменной любое значение, ссылку можно обратить в null,… |
Затем жмем Enter и все. У переменной теперь новое значение.
- Ничего себе, а я и половины этого не знал. Какой полезный урок.
- Кроме Watches есть еще мощный инструмент – это EvaluateExpression.
Кликаешь на переменной в коде правой кнопкой и выбираешь в меню EvaluateExpression. Ну, или просто жмешь Alt+F8.
Тогда открывается волшебное окно, где можно вычислить значение любого выражения:
Вот, что мы получим:
Но я сказал, там можно написать любое выражение:
Или даже так:
Или так:
Все эти переменные можно посмотреть, как можно посмотреть и все, на что они ссылаются и т.д.
- Думаю это очень удобная штука для больших программ.
- Ага. Но и это еще не все.
А хочешь выполнить произвольный код прямо во время работы программы, работая с данными этой программы?
- А что, и так можно?
- Конечно. Для этого есть кнопка – CodeFragmentMode. Нажимай ее и переключайся в режим, где можно вводить целые «фрагменты кода», состоящие из нескольких строк.
Я тут: использовала переменную sum5, вызвала метод sum(), объявила несколько переменных, указала им значения и вычислила результат всего этого.
Как тебе?
- Как по мне – это очень круто. Особенно, что можно делать разные действия с текущими переменными, такими как sum5, sum7. Ну, а то, что можно вызывать методы и создавать переменные – так это вообще делает мои возможности практически безграничными.
- Ага. Это очень круто. Ты можешь выполнить код, вывести в нем что-то в консоль и оно выведется в консоль! Это полноценный рабочий код. Без всяких ограничений.
- Спасибо, Элли. Это были несколько очень познавательных, и я не побоюсь этого слова, одни из самых полезных уроков за все время.
- А теперь еще немного новых фич на закуску.
Это не самые важные, но одни из самых часто используемых функций.
Поиск файла в проекте.
Когда ты работаешь в реальном проекте, он обычно насчитывает тысячи файлов. Это java-файлы, файлы properties, xml, html, css, js и много чего еще.
Иногда ты помнишь, как называется файл/класс, но не помнить точное его местоположение. В Intellij IDEA есть механизм быстрой навигации по файлам и классам.
Нажми Ctrl+Shift+N и откроется поиск по файлам. В нем обычно достаточно ввести первые буквы имени файла и затем выбрать нужный файл из списка подходящих.
Пример такого окна-поиска:
Быстрый поиск файла в проекте
Я нажала Ctrl+Shift+N, и появилось окно для ввода имени файла.
Я ввела «ind», и IDEA показала мне весь список файлов с путями, которые подходят под данный шаблон.
Можно искать только среди классов, для этого надо нажать Ctrl+N. Появляется такое же окно, но поиск ведется только по классам.
Удобно тем, что можно перейти на любой класс доступный проекту. В том числе классы из jar-ов проекта и JDK.
Я вот сейчас попробую найти StringBuffer:
Быстрый поиск класса в проекте
Помнишь, я когда-то рассказывала, что если название класса состоит из нескольких слов, то их пишут с большой буквы.
- Ага. Это еще называется CamelCase, да?
- Ага. Так вот, при поиске по имени класса, поддерживается поиск в CamelCase – поиск по заглавным буквам. Т.е. не обязательно писать StringBuffer, можно просто написать StrBuff или даже SB.
- Т.е. достаточно просто написать начальные буквы каждого слова в имени класса?
- Да. Если ты ищешь BufferedInputStream, можно конечно написать все название целиком, но это долго, можно написать что-то вроде BuInStr и быстро перейти к коду класса:
Camel Style Search
- Ну, эта информация, конечно, ценная, но в ближайшее время она мне вряд ли пригодится. Количество файлов в моих проектах редко превышает десяток.
- Что тебе сказать, Амиго? Времена меняются…
- И снова здравствуйте.
- Привет!
- Сегодня я расскажу тебе про рефакторинг(re-factoring). Рефакторинг – это изменение кода проекта без изменения его функционала.
- А как такое может быть?
- Ну, в самых простых случаях – мы переименовываем переменные и/или методы. От переименования переменных программа ведь по-другому работать не станет?
- Нет, конечно.
- Вот, затем можно разбить большие методы на несколько отдельных.
Можно вынести повторяющиеся куски кода в отдельный метод.
Некоторые функции обозначить как static, а затем вынести их в утилитные классы.
Но это рефакторинг в узком смысле.
Иногда под рефакторингом понимают переписывание (улучшение) архитектуры проекта, без добавления новой функциональности. Это рефакторинг в широком смысле.
Intellij IDEA стала самой популярной IDE (среда разработки) именно потому, что первая внедрила очень мощные средства рефакторинга.
- Что же это за волшебные штуки такие-то?
Волшебство первое – изменение имени метода.
- Представь, что в твоем коде есть метод, который вызывается из 100-500 других мест. И ты решил сменить его имя на более читаемое. Скажем, было run(), а стало runDownloadTaskAsync(). Насколько быстро это сделать?
- Ну, сначала надо поменять имя этого метода, затем искать в программе все места, где этот метод вызывается, и менять его имя там.
- А как ты будешь его искать?
- Я бы просто запустил программу, и Intellij IDEA бы выдала все ошибки, где вызывается метод, которого нет.
- Хорошо, а допустим, у тебя у каждого метода есть поясняющий комментарий (JavaDoc), в котором написано что делает этот метод, и там написано его старое имя.
- Я поменяю и комментарии.
- А ведь могут еще быть переменные, название которых связано с именем метода, хорошо бы и их поменять тоже:
Было | Стало |
---|---|
Task task = manager.run(); | Task asyncTask = manager.runDownloadTaskAsync(); |
- Да, хорошо бы поменять имена и этим переменным. Не помешало бы.
- Так вот, это все можно сделать с помощью Intellij IDEA за пару секунд!
Становишься курсором на имя метода (или кликаешь по нему мышкой), затем жмешь Shift+F6 и просто начинаешь вводить нужное имя файла.
Пример: редактирование имени метода.
Начало редактирования:
Указали новое имя:
Просто вводишь новое имя, жмешь enter и все. Все вызовы данного метода в проекте переименованы.
Intellij IDEA так же обычно дополнительно спрашивает – надо ли переименовывать переменные и имена методов в комментариях. Достаточно просто нажать «да», и она все сделает.
При этом если до рефакторинга проект компилировался, то после рефакторинга он так же будет гарантированно компилироваться.
- Звучит очень многообещающе.
- Кстати, имена переменных можно поменять так же. Стал на имя, просто жмешь Shift+F6 и все – можешь вводить новое имя, и везде, где используется эта переменная, оно поменяется.
Если переменная была полем класса и у нее были getter и setter, они тоже сменят имя, чтобы соответствовать новому имени переменной.
- Попробовал с переменными. Все работает, как ты и говоришь, Элли. Рефакторинг - это круто!
- Ты думаешь – это весь рефакторинг? Да там столько всего, что мы и десятой части не коснулись.
- Ого. И что же там еще?
Волшебство второе – вынос переменной.
- Иногда в коде часто повторяются некоторые выражения, что аж хочется вынести их в отдельную переменную. Пример: Пример:
Код |
---|
public void printInfo(User user) { System.out.println(user.getProfile().getName()); System.out.println(user.getProfile().getAddress().getState()); System.out.println(user.getProfile().getAddress().getCity()); System.out.println(user.getProfile().getAddress().getStreet()); System.out.println(user.getProfile().getAddress().getHomeNumber()); } |
Как хочется сделать, глядя на него: |
public void printInfo(User user) { Address address = user.getProfile().getAddress(); System.out.println(user.getProfile().getName()); System.out.println(address. getState()); System.out.println(address.getCity()); System.out.println(address.getStreet()); System.out.println(address.getHomeNumber()); } |
- Ага.
- А ведь бывает и куда более сложный код, в котором очень много повторяющихся частей.
Программисты так не специально пишут. Но часто случается, что надо в метод что-то дописать, потом еще что-то, и со временем количество избыточных частей зашкаливает.
К тому же, создавая отдельную переменную, мы может дать ей правильное имя и улучшить читабельность кода.
Например, в примере выше, речь может идти не об адресе проживания, а об адресе, куда можно обратиться, в случае, если с человеком что-то случиться. Тогда можно назвать переменную не address, а, скажем, supportAddress. Тогда, программисту, который видит этот код в первый раз, будет понятнее, что тут происходит.
- Да, согласен, добавление таких переменных имеет смысл.
Так как это сделать?
- Вынести какое-то выражение в отдельную переменную очень просто.
Шаг 1 – выделяем мышкой выражение.
Шаг 2 – нажимаем Ctrl+Alt+V
Появляется окно, где Intellij IDEA нас спрашивает – заменить только одно выделенное выражение или заменить все выражения (4 шт.)?
Выбираем второй пункт – заменить все вхождения (Replace all 4 occurrences)
Шаг 3 – нажимаем Enter.
Intellij IDEA предлагает ввести имя переменной. И сразу предлагает свой вариант имени. Не так уже он и плох, да?
- Ага. В самую точку. Мы тоже собирались назвать переменную address. А как она догадалась?
- По имени последнего метода в выражении – он возвращает адрес, значит, скорее всего, в переменной хранится именно адрес.
- Отлично получилось. Классная штука, Элли.
Волшебство третье – вынос кода в отдельный метод.
- А ведь можно было сделать и по-другому. Можно было объявить новый метод, например, printAddress и вынести весь этот код в него.
Давай, так и попробуем сделать.
Шаг 1 – выделяем 4 строчки кода, которые используют переменную address:
Шаг 2 – нажимаем Ctrl+Alt+M
Intellij IDEA сама определила, какие переменные будут нужны этому методу, и предлагает нам, как он будет выглядеть. Осталось только ввести имя метода.
Шаг 3 – вводим имя метода - printAddress и жмем Enter.
Как тебе результат?
- Это офигенно. Intellij IDEA не только вынесла код в отдельный метод, она еще и добавила туда все нужные переменные. Так еще и имена угадала правильно.
- Хочу еще рассказать пару волшебных вещей.
- Давай! Сегодня прямо день чудес. Оказывается, я и половины возможностей Intellij IDEA не использовал.
Волшебная вещь третья – поиск.
- Представь себе ситуацию, ты открыл файл на 5 тысяч строк, и тебе надо найти в нем метод, который называется getProcessTask. Или getProcessorTask или getTaskProcessor или как-то так.
У Intellij IDEA есть очень мощный механизм поиска по текущему открытому файлу.
Просто нажми Ctrl+F и начни вводить нужное слово:
Например, мы хотим найти все вызовы метода println, тогда пишем дальше - println:
Так же можно перемещаться по найденным совпадениям использую стрелки вверх и вниз. Специально обвела их кружочком на скриншоте.
- А там справа есть еще галочки MatchCase, Regex, Words. Что они значат?
- MatchCase – учитывать регистр букв. Если галочка снята, то различий между большими и строчными буквами не делается, если выставлена, то такие буквы считаются разными. Тогда, например, слово «Print» не будет считаться совпадающим с «print».
Галочка в Regex, говорит о том, что шаблон строки, на самом деле, является регулярным выражением и надо учитывать это при поиске всех совпадений.
Галочка в Words, говорит о том, что слово должно полностью совпасть с тем, что имеем. Если совпадает только часть слова – это не подходит.
Например, у меня есть методы print и println, и я хочу найти только print, тогда я должна буду выставить эту галочку. В примере ниже, я специально заменила два метода println на print и выделила только их, нажав галочку Words.
- Т.е. Words переключает режимы «часто слова совпадает с шаблоном» и «все слово совпадает с шаблоном»?
- Ага.
Пятая волшебная вещь – замена.
Представь, что у тебя есть кусок кода, и ты хочешь заменить в нем вызов одних методов на другие. Просто заменить кусок кода на другой и все. Как это быстро сделать?
Для этого есть комбинация Ctrl+R
Давай заменим println на print.
Чтобы замена не произошла во всем классе, надо выделить нужный кусок кода и отметить галочку – In Selection – только в выделенном.
Теперь можно смело нажимать кнопку «Replace all» и все вхождения println в выделенном куске кода будет заменены на print.
- Есть такое дело. Все отлично работает. Спасибо тебе, Элли!
- Привет, Амиго!
- Я найду для тебя новые интересные задачи чуть позже. Если у тебя остались нерешенные задачи, быстрей решай их. Ты уже на финишной прямой.
- Ну и еще две маленькие вещи напоследок, как говорится.
Шестая волшебная вещь – оборачивание.
Например, мы хотим обернуть кусок кода в блок try-catch. Для этого у Intellij IDEA тоже есть своя комбинация – Ctrl+T.
Просто выделяем кусок кода – например, те же println в методе printAddress и нажимаем Ctrl+T. И вот, что мы наблюдаем:
Вот меню, со списком конструкций, которыми можно обернуть выделенный код.
Можно обернуть в цикл (пункт 3) или в try-catch (пункт 6), и еще много всего.
Мы сейчас хотим обернуть код в try-catch, поэтому выберем пункт 6.
Цифры и буквы с точкой слева - это горячие клавиши. Достаточно просто нажать 6 и выберется нужный нам пункт. Мышкой конечно тоже можно, если очень хочется.
Вот и результат:
Т.е. выделили код, нажали Ctrl+T, затем 6 и вуаля – код обернут, все красиво.
- Да, полезная вещь.
Седьмая волшебная вещь – форматирование кода.
- Иногда, когда код редактируют, то появляются лишние отступы и пробелы. Иногда их, наоборот не хватает. Тогда код выглядит не очень опрятно и практически не читаемо.
Пример:
Intellij IDEA позволяет настраивать стили форматирования кода – отступы, их размеры, надо ли переносить { на следующую строку, и т.д.
Сделать это очень просто. Выдели кусок кода, который хочешь привести к правильному стилю (ничего не выделяй, если хочешь форматировать весь текущий документ), затем нажми Ctrl+Alt+L.
По умолчанию выбран текущий файл, но ты можешь выбрать «выделенный текст» или все файлы в текущей папке. Затем жми enter и любуйся результатом.
Для приведенного примера выше, он у меня вышел таким:
Каждой строке кода добавилось правильное количество отступов, где надо расставились пробелы. Такой код красивее и читать его гораздо легче.
- О. Люблю, когда все красиво. Особенно код. У нас – роботов, любовь к красивому коду в крови.
- Привет, Амиго!
Продолжаем наши уроки – учимся гуглить.
Вот тебе несколько заданий:
Надо найти в Google | |
---|---|
1 | Что такое веб |
2 | Что такое веб-сервер |
3 | Что такое сервлет |
4 | Что такое JSP |
5 | Как работает JSP |
6 | С какими переменными может работать Java-код внутри JSP-страницы |
7 | Как настроить веб-проект в IDEA |
8 | Как написать свой сервлет |
9 | Как задеплоить(deploy) свой сервлет в Tomcat |
10 | Как посмотреть список всех точек остановки в IDEA |
- Привет, Амиго!
Вот тебе дополнительный материал по теме.
- Привет, Амиго!
- Привет, Хулио.
- Рад видеть тебя, как настроение?
- Настроение бодрое, вот решил практически все задачи этого уровня.
- Если все решил, тогда самое время просмотреть видео.
- Привет, Амиго!
Вопросы к собеседованиям | |
---|---|
1 | Что такое web-сервер? |
2 | Что такое Tomcat? |
3 | Что такое сервлеты и где они используются? |
4 | Какие режимы запуска приложений в IDEA вы знаете? |
5 | Можно ли дебажить приложение/сервлет, которое запущено внутри Tomcat’а? |
6 | Как в IDEA установить точку остановки? |
7 | Как в IDEA посмотреть список всех точек остановки? |
8 | Можно ли с помощью IDEA поменять значение переменной в процессе работы программы? |
9 | Как в IDEA настроить отступы? |
10 | Как в IDEA настроить, чтобы { отображалось на той же строке, а не на новой? |
- Привет, боец!
- Поздравляю тебя с повышением уровня квалификации. Нам нужны отчаянные парни.
- Уверен, у тебя есть еще много нерешенных задач. Самое время решить парочку из них!