Вы достигли нового уровня

Уровень 39

1. Tomcat install, configure

- Привет, Амиго!

- Здорово, Билаабо! Что у нас сегодня?

- Сегодня я расскажу тебе, как установить 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 у меня есть, а как мне написать программу для него?

Я хочу, чтобы он написал что-нибудь интересное. Какую-нибудь прикольную страницу.

- Хорошо, я расскажу тебе, как это сделать, но после небольшого перерыва.

2. run simple web application

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

Веб-сервер сам по себе – это как операционная система. Он ценен не сам по себе, а потому, что в нем можно запускать специальные веб-программы – сервлеты(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-страниц.

Большое тебе спасибо, Билаабо.

- И тебе спасибо, друг!

3. IDEA: debug,точки останова

- Привет, Амиго!

- Привет, Элли! У тебя новая прическа? Тебе очень идет!

- Да? Спасибо!

Сегодня я расскажу тебе про работу в 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.

КодF7F8

Если ты нажимаешь F8, то выполняешь текущую строку за 1 шаг.

Если нажимаешь F7 и в текущей строке вызов метода, ты «заходишь» туда и выполняешь его пошагово.

- Т.е. разница в том – заходим мы в метод или нет.

- Ага.

- А я могу комбинировать F7 и F8? Т.е. какие-то методы пропускаю, которые мне не интересны, а в какие-то захожу?

- Да.

4. IDEA: watch, quick watch

- Но это еще не все. Как ты думаешь – для чего был придуман режим отладки?

Это риторический вопрос.

Самое интересное в том, что на каждом шаге в дебаге ты можешь смотреть значения всех переменных, которые есть! Включая локальные переменные методов, аргументы, да фактически все что угодно.

Когда ты запускаешь режим отладки и делаешь остановку, снизу появляется специальная панель:

Режим отладки
Комментарии
Зеленым выделен раздел переменных, в нем видны все локальные переменные
Красным выделено окно watch – в него можно добавить переменные самому
Оранжевым – список нитей. Прямо под ним – стек-трейс текущей нити

Сейчас я нажму F8 три раза, и в среднем окне появятся значения двух новых переменных – sum5 & sum7.

А в правом нижнем окне я нажму на плюсик и добавлю сразу выражение sum5+sum7.

Вот что у меня получилось:

Режим отладки
Комментарии
В центре внизу мы видим значения переменных
Справа внизу мы видим текущее значение выражения sum5+sum7

Окно Watches удобно использовать, когда переменные имеют длинные и сложные имена, например:

 
this.connection.getProvider().getRights().get("super")

- Круто! Классные штуки.

- Кроме Watches есть еще Quick Watches. Ты можешь узнать значение любой переменной, просто поднеся к ней мышку. Подержи мышку над переменной пару секунд и во всплывающем окне можно будет увидеть ее значение.

Режим отладки
Комментарии
Мышки на скриншоте не видно, но она была в центре красного кружка, прямо над именем переменной.

И самое интересное. Значения переменных можно менять!

Просто кликаешь правой кнопкой мыши на переменной в Watches или Variables, выбираешь пункт SetValue и вводишь новое значение. Или просто жмешь F2.

Вот как это выглядит у меня:

Режим отладки
Комментарии
Можно задать переменной любое значение, ссылку можно обратить в null,…

Затем жмем Enter и все. У переменной теперь новое значение.

- Ничего себе, а я и половины этого не знал. Какой полезный урок.

5. IDEA: evaluate expression

- Кроме Watches есть еще мощный инструмент – это EvaluateExpression.

Кликаешь на переменной в коде правой кнопкой и выбираешь в меню EvaluateExpression. Ну, или просто жмешь Alt+F8.

Тогда открывается волшебное окно, где можно вычислить значение любого выражения:

Вот, что мы получим:

Но я сказал, там можно написать любое выражение:

Или даже так:

Или так:

Все эти переменные можно посмотреть, как можно посмотреть и все, на что они ссылаются и т.д.

- Думаю это очень удобная штука для больших программ.

- Ага. Но и это еще не все.

А хочешь выполнить произвольный код прямо во время работы программы, работая с данными этой программы?

- А что, и так можно?

- Конечно. Для этого есть кнопка – CodeFragmentMode. Нажимай ее и переключайся в режим, где можно вводить целые «фрагменты кода», состоящие из нескольких строк.

Я тут: использовала переменную sum5, вызвала метод sum(), объявила несколько переменных, указала им значения и вычислила результат всего этого.

Как тебе?

- Как по мне – это очень круто. Особенно, что можно делать разные действия с текущими переменными, такими как sum5, sum7. Ну, а то, что можно вызывать методы и создавать переменные – так это вообще делает мои возможности практически безграничными.

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

- Спасибо, Элли. Это были несколько очень познавательных, и я не побоюсь этого слова, одни из самых полезных уроков за все время.

6. IDEA: file/class find

- А теперь еще немного новых фич на закуску.

Это не самые важные, но одни из самых часто используемых функций.

Поиск файла в проекте.

Когда ты работаешь в реальном проекте, он обычно насчитывает тысячи файлов. Это 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

- Ну, эта информация, конечно, ценная, но в ближайшее время она мне вряд ли пригодится. Количество файлов в моих проектах редко превышает десяток.

- Что тебе сказать, Амиго? Времена меняются…

7. IDEA: refactoring

- И снова здравствуйте.

- Привет!

- Сегодня я расскажу тебе про рефакторинг(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 не только вынесла код в отдельный метод, она еще и добавила туда все нужные переменные. Так еще и имена угадала правильно.

8. IDEA: replace, find

- Хочу еще рассказать пару волшебных вещей.

- Давай! Сегодня прямо день чудес. Оказывается, я и половины возможностей 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.

- Есть такое дело. Все отлично работает. Спасибо тебе, Элли!

9. Задачи

- Привет, Амиго!

- Я найду для тебя новые интересные задачи чуть позже. Если у тебя остались нерешенные задачи, быстрей решай их. Ты уже на финишной прямой.

10. Стиль кода

- Ну и еще две маленькие вещи напоследок, как говорится.

Шестая волшебная вещь – оборачивание.

Например, мы хотим обернуть кусок кода в блок 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 и любуйся результатом.

Для приведенного примера выше, он у меня вышел таким:

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

- О. Люблю, когда все красиво. Особенно код. У нас – роботов, любовь к красивому коду в крови.

11. Учимся гуглить

- Привет, Амиго!

Продолжаем наши уроки – учимся гуглить.

Вот тебе несколько заданий:

 Надо найти в Google
1 Что такое веб
2 Что такое веб-сервер
3 Что такое сервлет
4 Что такое JSP
5 Как работает JSP
6 С какими переменными может работать Java-код внутри JSP-страницы
7 Как настроить веб-проект в IDEA
8 Как написать свой сервлет
9 Как задеплоить(deploy) свой сервлет в Tomcat
10 Как посмотреть список всех точек остановки в IDEA

12. Профессор дает доп. материал

- Привет, Амиго!

Вот тебе дополнительный материал по теме.

Ссылка на дополнительный материал

13. Хулио

- Привет, Амиго!

- Привет, Хулио.

- Рад видеть тебя, как настроение?

- Настроение бодрое, вот решил практически все задачи этого уровня.

- Если все решил, тогда самое время просмотреть видео.

Оригинал видео на YouTube

14. Вопросы к собеседованию по этой теме

- Привет, Амиго!

 Вопросы к собеседованиям
1 Что такое web-сервер?
2 Что такое Tomcat?
3 Что такое сервлеты и где они используются?
4 Какие режимы запуска приложений в IDEA вы знаете?
5 Можно ли дебажить приложение/сервлет, которое запущено внутри Tomcat’а?
6 Как в IDEA установить точку остановки?
7 Как в IDEA посмотреть список всех точек остановки?
8 Можно ли с помощью IDEA поменять значение переменной в процессе работы программы?
9 Как в IDEA настроить отступы?
10 Как в IDEA настроить, чтобы { отображалось на той же строке, а не на новой?

15. Большая задача

- Привет, боец!

- Поздравляю тебя с повышением уровня квалификации. Нам нужны отчаянные парни.

- Уверен, у тебя есть еще много нерешенных задач. Самое время решить парочку из них!