1. IP-adress,Domain, URL

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

- Привет, Билаабо!

Что нового расскажешь сегодня?

- Много всего. Но начать думаю с работы с сетью и интернетом. Интересно?

- Ага. Галактический Интернет – это крутая вещь.

- Вот, но начнем с истории. В начале 21 века дела обстояли таким образом…

У каждого компьютера подключенного к интернету есть его уникальный номер. В качестве номера используется обычное четырехбайтовое число. Такой номер принято называть IP-адресом.

Но, т.к. память у людей плохая и им сложно запомнить что-то типа 2108458776, они частенько записывают его байты отдельно.

Если разбить четырехбайтовое число 2108458776 на отдельные байты, то получится такое число «125.172.135.24». Каждый байт, как ты помнишь, состоит из 8-и битов и может содержать числа от 0 до 255.

- Т.е. это одна и та же запись числа?

- Да. Просто более легкая для запоминания (у людей) форма записи четырёхбайтового числа.

Кстати, идея выбрать всего 4 байта вскоре сыграла с ними злую шутку. Количество устройств, подключенных к интернету, выросло так быстро, что скоро свободные номера закончились.

- И как они вышли из этой ситуации?

- По-людски. Хе-хе.

Они придумали новый стандарт IP-адреса, гордо названный IP v6 – IP-address version 6.

В нем, в отличие от обычного IP-адреса (который называют IP v4), для уникального номера используются на 4 байта, а 16.

Ты только подумай, люди не могли запомнить 10 цифр в обычном номере (как 2108458776), для чего им пришлось разбить на 4 части, а тут придумали номера, состоящие из 16 байт.

- Да, иногда люди такие странные.

- Ага. Люди они и есть люди.

Хотя они выкрутились и из этой ситуации.

Им надоело запоминать цифры, и они решили заменить их словами.

- Это как это? А можно пример?

Конечно: web.mail.ru, google.com.ua, new.books.amazon.com, …

Такое имя называется доменом.

Для того чтобы такой интернет работал правильно, была придумана специальная таблица – DNS (Domain Name System), в которой для каждого доменного имени хранился его IP-адрес.

Вот как это работает.

1) Пользователь вводит в браузере адрес, например, web.mail.ru

2) Браузер обращается к DNS и по доменному имени получает IP-адрес.

3) Поэтому IP-адресу отправляется запрос, содержащий нужную ссылку(URL)

- Выглядит не очень просто.

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

1) Люди легко запоминают словесные имена

2) Доменные имена можно строить в виде дерева, добавляя в начале имени поддомены. Точь-в-точь, как package в Java.

3) Если надо сменить IP-адрес веб-сервера, то достаточно поменять запись в DNS, и все будет работать как раньше, а пользователям не придется учить новый адрес.

Выглядит эта DNS примерно так:

Domain NameIP-Address
mail.ru 128.35.36.189
web.mail.ru 145.12.17.13
new.mail.ru 192.155.15.3
google.com 92.117.151.100
google.ru 193.168.0.1
docs.google.com 217.12.222.1
...

- Понятненько.

- Ну, домен – это имя компьютера, но нам ведь нужен не компьютер, а то, что в нем лежит. Для этого используют ссылки (URL)

Вначале URL фактически представлял собой ссылку на файл на чужом компьютере. Пример:

Пример
http://info.javarush.ru/user/info/profile.html
Описание
http – это протокол – стандарт общения клиента и сервера
info.javarush.ru –доменное имя компьютера.
user/info/profile.html – это путь к файлу на компьютере

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

Затем, когда веб-сервера начали сами генерировать отдаваемые файлы, смысл урла немного поменялся, и он стал запросом к web-серверу. В него так же добавились параметры запросы.

Сегодня уже редко увидишь расширение файла в конце url. Современные 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 – параметры запроса

- Ага, помню. Недавно ты мне уже рассказывал про ссылки.

И про порты тоже. На примере многоквартирного дома.

Лучше расскажи мне, что такое http. А то везде написано – протокол, а что это такое – не ясно.

- Ок. Сейчас расскажу.

HTTP – это HyperTextTransportProtocol – протокол для передачи гипертекста.

- А что такое гипертекст?

- Это HTML.

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

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

К серверу приходит запрос (request), и на каждый запрос сервер отдает ответ (response).

Вот примеры таких запроса и ответа:

Запрос (Request)
GET alpha/api/contacts HTTP/1.1
Host: javarush.ru
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
Описание
GET – подтип запроса
alpha/api/contacts – запрос к веб-серверу
HTTP/1.1 – версия протокола – HTTP/1.1
Host: javarush.ru – доменное имя
User-Agent: Mozilla/5… – уникальное имя браузера
Accept: text/html – тип запрашиваемого документа: HTML
Connection: close – закрыть соединение сервером, после обработки запроса.

Первая строка – это фактически запрос. Затем идут дополнительные параметры запроса, так называемые «заголовки запроса» (Headers).

А вот и пример ответа:

Ответ (Response)
HTTP/1.1 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1

Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: ru
Content-Type: text/html; charset=utf-8
Content-Length: 1234

Connection: close
<html><body><a href="http://ample.com/about.html#contacts">Click here</a></body></html>
Ответ (Response)
HTTP/1.1 200 OK - Ответ «200 ОК» - все хорошо.
Date: Wed, 11 Feb 2009 - Дата обработки запроса
Server: Apache - Имя веб-сервера
X-Powered-By: PHP - Сервер работает на языке PHP
Last-Modified: Wed, 11 Feb 2009 - Время последнего обновления запрашиваемого файла
Content-Language: ru - Язык файла
Content-Type: text/html; charset=utf-8 – Ответ – это HTML-файл в UTF-8 кодировке
Content-Length: 1234 - Длинна ответа – 1234 байта
Connection: close - Соединение будет закрыто после обработки запроса
<html><body><a href="http://ample - Сам HTML-файл.

Хочу обратить твое внимание на две вещи:

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

Во-вторых, сам файл-ответ передается как часть ответа HTTP протокола. Т.е. сначала в ответе сервера мы видим какие-то дополнительные данные, а потом просто пошло тело файла, который отдает сервер.

- Как интересно. Не уверен, что все понял. Потом перечитаю еще раз.

- Ну и еще хочу рассказать тебе про одну маленькую, но интересную вещь – Cookie.

- Что это еще такое?

В соответствии с протоколом HTTP, Cookie – это маленькие кусочки информации, которые сервер отправляет клиенту, чтобы тот хранил их у себя. И при следующих запросах передавал их обратно к серверу.

- Это еще зачем?

- Например, пользователь авторизовался на главной странице сайта, тогда сервер создает объект сессии на сервере для этого пользователя, а уникальный номер этой сессии передает клиенту в виде Cookie. При следующем запросе от клиента к серверу, этот номер сессии, вместе с другими Cookie, опять будет отправлен на сервер. Таким образом, сервер узнает пользователя, который отправил ему этот новый запрос.

- Как интересно.

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

- Как скажешь.

2. HTTP, port, request, responce, REST

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

Вот они: GET, POST, PUT, DELETE, OPTIONS, HEAD, PATCH, TRACE, LINK, UNLINK, CONNECT.

Я расскажу тебе про 4 основных.

Метод GET предназначен для получения файла по запросу (URL). Запрос файла предполагает, что ничего кроме самого запроса на сервер не пересылается. При этом считается нормальным кэшировать результаты (ответы) таких запросов. Яркий пример такому кэшированию – это загрузка картинок браузерами.

Метод PUT предназначен для добавления файла на сервер. При этом ожидается, что путем файла, будет путь, указанный в URL. Тело запроса должно содержать такой файл.

Метод POST предназначен для обновления файла на сервере. И в запросе и в ответе пересылаются данные/файлы.

Метод DELETE предназначен для удаления файла по его URL.

- А можно эти данные свести в общую таблицу?

- Конечно:

Веб фактически отошел от представления URL как пути к файлу, а стал рассматривать его как запрос, то наибольшее распространение получили методы GET и POST.

Метод POST – самый универсальный, он поддерживает и полноценный запрос, и полноценный ответ.

При этом метод GET часто рассматривается как более упрощенная версия POST. Он не предполагает наличие Полноценного запроса, только URL в качестве такового.

- А какой запрос отправляется на сервер, когда я открывают ссылку в браузере?

- Каждый раз, когда ты вбиваешь в браузере очередной URL, браузер отправляет GET-запрос. Ведь никаких данных кроме URL ты же не передаешь.

Кстати, ты тут в таблице написал колонку Status, что это такое.

Любой ответ сервера по HTTP-протоколу должен начинаться со статуса обработки запроса.

Вот какие они бывают:

Коды ошибокОписаниеПример
1xx Информационные 101
2xx- Успех 200
3xx Пересылает на другую страницу 301,302,303,305
4xx Ошибка на клиенте 404
5xx Ошибка на сервере 501

Когда все хорошо, обычно возвращается код состояния – 200.

Если сервер хочет переслать пользователя на другую страницу, возвращает ее URL и код состояния - 302.

Если запрашиваемая страница не найдена, возвращается – 404.

Если на сервере возникла ошибка – возвращается ошибки 501-503.

Что-то я не очень хорошо себя чувствую, Амиго.

Пойду-ка я удалю у себя что-нибудь. А ты можешь почитать подробнее по этой ссылке

3. Download file

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

- Привет, Элли!

- Что-то ты сегодня сильно довольный.

- Ха, Билаабо заболел.

- И не смог тебе рассказать кучу интересного, полезного и нужного. Пора бы уже вырасти из детских штанишек.

- Угу. Я обещаю сам во всем разобраться. Билаабо дал мне ссылку.

- Вот и отлично. Тогда я расскажу тебе интересную тему.

Как скачать файл из интернета.

Для того, чтобы работать в интернетом в Java есть специальный класс – URL. Вот как скачать файл при помощи этого класса:

1) Для начала надо задать правильный URL нужного тебе сервера.

2) Затем нужно установить соединение с сервером, с помощью этого URL.

3) Затем передать тело запроса, если это POST-запрос. Или пропустить этот шаг, если это GET-запрос.

4) И наконец, прочитать ответ сервера.

Вот как будет выглядеть простое скачивание файла:

Пример
URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
URLConnection connection = url.openConnection(); //устанавливаем соединение

//получаем OutputStream, чтобы писать в него данные запроса
OutputStream outputStream = connection.getOutputStream();
outputStream.write(1);
outputStream.flush();

//получаем InputStream, чтобы читать из него данные ответа
InputStream inputStream = connection.getInputStream();
Files.copy(inputStream, new File("c:/google.png").toPath());

Сначала устанавливает соединение с сервером – получаем объект URLConnection.

Затем получаем OutputStream потока, куда нужно писать запрос. И что-то туда пишем.

Затем получаем объект InputStream ответа, из которого и читаем сам ответ. С помощью метода Files.copy сохраняем присланные данные в файл "c:/google.png"

- Да, это понятно. А что еще за write(1)?

- Ну, это я для примера показала, что туда можно что-то писать. На самом деле, для скачивания файла ничего в Request писать не надо. Можно просто сразу получать InputStream и начинать читать оттуда ответ. У объекта URL есть даже метод openStream(), который сразу возвращает объект InputStream. Но это годится только для GET-запросов. Пример:

Пример
URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
InputStream inputStream = url.openStream();
Files.copy(inputStream, new File("c:/google.png").toPath());

- Как интересно. Не думал, что скачать файл так просто.

- Ну, так обычно никто не делает. Т.к. файлы могут быть большими и скачиваться очень долго.

Есть достаточно много фреймворков, который значительно упрощают работу с файлами, но я не готова сейчас про них рассказать. Как-нибудь в другой раз.

4. Задачи

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

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

5. Send Email

- А вот и снова я. И снова у меня для тебя небольшой сюрприз.

Сегодня я научу тебя, как отправить email с помощью Java.

Начнем с хорошей новости – в Java есть родная библиотека для работы с почтой.

А плохая новость состоит в том, что эта библиотека входит в состав Java EE, но не в Java SE.

Java EE – это расширенная версия JavaSE, куда входят классы, которые нужны для более навороченных приложений. Как работа с почтой, например.

- Ясно и что же делать?

- Ну, предлагаю, просто скачать данную библиотеку и все.

Воспользуемся мудростью Intellij IDEA.

Создай класс и добавь в раздел импорта пакеты javax.mail.* и javax.mail.internet.*

Затем жми Alt+Enter и пусть IDEA все сделает за тебя:

Так выглядит предложение скачать недостающие библиотеки

Так выглядит окно закачки.

Ну, или его можно скачать по этой ссылке.

- Скачал. Что дальше?

- Тебе надо зайти в настройки проекта (Open Module Settings) в раздел Libraries и добавить туда jar-файлы из скачанного архива.

- Готово.

- Строки перестали светиться красным?

 
import javax.mail.internet.MimeMessage;
import javax.mail.internet.*;

- Ага.

- Отлично, тогда продолжим.

Отправка письма состоит из трех частей.

1) Установить соединение с почтовым сервером, через который будет отправлено письмо

2) Создать письмо, добавить вложения если надо

3) Отправить письмо.

Начнём сначала.

Чтобы отравить email в Java, для начала нужно установить соединение с почтовым сервером.

Лучше всего, чтобы там у тебя уже был почтовый аккаунт. Современные почтовые серверы не хотят рассылать сообщения анонимных пользователей, опасаясь спама.

Создать соединение с сервером можно одним вызовом метода javax.mail.Session.getDefaultInstance:

Создаем соединение с почтовым сервером
Properties props = new Properties();

//тут надо загрузить данные в объект props

Session session = Session.getDefaultInstance(props);

Но этому методу нужно передать настройки почтового сервера.

Например, можно создать файл Mail.properties и заполнить его нужными настройками, например, как-то так:

Mail.properties
mail.transport.protocol=smtp
mail.host=smtp.gmail.com
mail.smtp.auth=true
mail.user=arnold@gmail.com
mail.password=strong

Главное – это задать protocol и host, но возможно понадобятся дополнительные настройки, в зависимости от режима работы почтового сервера.

А можно просто добавить эти данные в объект типа Properties прямо в Java-коде.

Пример:

Создаем соединение с почтовым сервером
Properties props = new Properties();
props.put("mail.transport.protocol", "smtps");
props.put("mail.smtps.host", “smtp.gmail.com”);
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.sendpartial", "true");

Session session = Session.getDefaultInstance(props);

Отлично, сессия у нас есть, теперь давай созданием почтовое сообщение.

Сделать это легче, чем кажется на первый взгляд. Пример:

Создание почтового сообщения
//создаем сообщение
MimeMessage message = new MimeMessage(session);

//устанавливаем тему письма
message.setSubject("тестовое письмо!");

//добавляем текст письма
message.setText("Asta la vista, baby!");

//указываем получателя
message.addRecipient(Message.RecipientType.TO, new InternetAddress("stalone@gmail.com"));

//указываем дату отправления
message.setSentDate(new Date());

- В качестве получателя можно указать любой email?

- Ага. Более того. Можно указать и отправителя. Любой email-адрес.

- Круто! Я это учту.

- Теперь осталось отправить это сообщение.

Сначала мы авторизуемся на сервере, а затем отправим свое сообщение. Всего две строчки кода:

Отправка сообщения
//логин и пароль gmail пользователя
String userLogin = “arnold@gmail.com”;
String userPassword = “strong”;

//авторизуемся на сервере:
Transport transport = session.getTransport();
transport.connect("smtp.gmail.com", 465, userLogin, userPassword);

//отправляем сообщение:
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));

- Как интересно. Надо пробовать.

- Если тебе интересно, как отправить письмо с вложениями, то можешь почитать про это тут.

Если хочешь разобраться, как еще и получать почту, милости прошу сюда.

- Ух ты, какие полезные ссылки.

Да, я теперь свой почтовый клиент сделаю. Круто!

Спасибо, Элли!

6. Задачи

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

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

7. Socket

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

- Здорово, Риша!

- Тема сегодняшней лекции – Сокеты. Socket в переводе с английского – Розетка

Ты уже знаешь, что у каждого компьютера в сети есть его уникальный IP-адрес.

- Ага.

- И вот представь, что у тебя есть несколько компьютеров и на каждом компьютере запущено с десяток программ, которые работают с интернетом: Skype, ICQ, и т.д.

И эти программы хотят общаться между собой.

Надо сделать так, чтобы они друг другу «не мешали». Чтобы Skype связывался со Skype’ом, ICQ с ICQ и т.д.

Помнишь, как это проблему решили с URL и веб-серверами?

- Ага, добавили порты.

- Именно.

Это все равно, что в доме сделать много маленьких комнат и объявить его многоквартирным. Каждый порт – это как отдельная квартира.

Так вот IP-адрес – это уникальный номер компьютера, а IP-адрес+порт – это уникальный номер некой «квартиры» (ячейки) в компьютере, которую может занять программа.

Вот такая уникальная ячейка и называется сокет.

У сокета есть его уникальный номер, и состоит он из IP-адреса и номера порта.

- Ага. Т.е. сокет – это номер некой виртуальной ячейки в компьютере, которую может занимать программа? А другая программа будет слать ей в эту ячейку сообщения, и таким образом они будут общаться?

- Не знаю, как ты это понял, но именно так и есть.

- Это моя робоинтуиция подсказала.

- Отлично. Тогда давай немного подробностей.

Сокеты – это фактически самый базовый и самый примитивный способ межсетевого взаимодействия программ.

В Java для работы с сокетами есть два класса. Это классы Socket и ServerSocket.

ServerSocket – это специальный класс, объекты которого выполняют роль сервера – т.е. могу обслуживать запросы, пришедшие на определенный сокет.

Класс Socket – это фактически Socket-клиент, с помощью него мы можем послать сообщение некоторому сокету и получить ответ.

Как послать сообщение какому-то сокету:

Пример
//создаем сокет
Socket clientSocket = new Socket("localhost", 4444);

//получаем OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

//читаем ответ
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

- Все очень напоминает скачивание файла из интернета.

- Это потому, детка, что там тоже используются сокеты.

Сокеты используются в основе всего связанного с сетью, ну или почти всего.

Вот тут можешь почитать дополнительную информацию.

- Спасибо за лекцию, Риша.

- Это еще не все. Размечтался.

Теперь мы разберемся, как работает серверный сокет.

Он работает чуток посложнее.

Пример
//создаем объект сервер-сокет
ServerSocket serverSocket = new ServerSocket(4444); //порт

//в цикле обрабатываем входящие соединения.
while (true)
{
 //метод accept ждет, пока кто-то не подключится.
 Socket socket = serverSocket.accept();

 //читаем сообщение
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 //придумываем ответ – просто разворачиваем строку задом наперед
 String reverseMessage = new StringBuilder(message).reverse().toString();

 //отправляем ответ
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

Хочу обратить твое внимание на несколько моментов.

Момент 1: Для создания сокета нужно указывать IP-адрес (или домен) и порт. Для создания серверного сокета – только порт. Серверный сокет появляется только на том компьютере, где его создали.

Момент 2: У класса ServerSocket есть метод accept(), который, если его вызвать, будет ждать входящее соединение. Т.е. метод будет выполняться бесконечно долго, пока какой-то клиентский сокет не попробует обратиться к нему. Тогда метод accept() примерт соединение, создаст объект сокет для коммуникации и после этого вернет этот объект.

С точки зрения Java-программиста, сокет – это два потока – InputStream из которого можно читать сообщения/данные и OutputStream, куда можно писать сообщения/данные.

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

Вот тебе интересный пример, можешь попробовать разобрать его и выполнить:

http://habrahabr.ru/post/69136/

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

- Ого! Веб-сервер? Круто! Я изучу его очень внимательно.

Спасибо, Риша.

- Все, Амиго, иди отдыхать!

8. Задачи

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

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

9. Date, SQL date, timestamp

- Я вспомнил, что хотел рассказать тебе немного про работу с датами.

- Так вы мне уже рассказывали, что в Java существует класс Date, с помощью которого можно работать с датой.

- Гм. Ну, с некоторого времени класс Date устарел.

Сейчас вместо него советуют использовать класс Calendar, у которого есть метод getTime(), который и возвращает текущую дату.

Вот как обычно создается объект типа Календарь:

Создание объекта календарь
Calendar cal = Calendar.getInstance();

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

- Нужный? Их что – несколько?

- Ага. Более того, правильно было бы сказать – актуальный. Дело в том, что на Земле не один, а много календарей. И почти каждый из них связан с какой-нибудь религией или страной.

В зависимости от того, в какой стране ты находишься, год может быть другим.

Вот примеры самых распространённых календарей.

Класс календаряНазвание календаря
GregorianCalendar Христианский Грегорианский календарь
BuddhistCalendar Буддистский календарь
JapaneseImperialCalendar Японский Императорский календарь

Есть еще Китайский календарь, Исламский календарь и много других.

- Ясно.

- Чтобы узнать текущую дату, надо написать такой код:

Как узнать текущее время
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();

У класса календарь есть много методов, которые позволяют быстро получить любую информацию о дате и времени.

КодКомментарии
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


эра
год
месяц
день месяца

день недели (пн, вт, ср,…)
час
минута
секунда

Иногда действительно нужно получить только часть информации. Например, какой сегодня год, или какой день недели.

Но иногда бывает нужно просто вывести дату в нужном формате.

Например, в лог-файл или еще куда-нибудь.

Или сделать формат, который бы настраивал пользователь. Как тогда быть?

Для этого тоже есть специальные классы. И класс SimpleDateFormat отлично справляется с описанной тобой задачей:

Как привести дату к нужному формату
Calendar calendar = Calendar.getInstance();

DateFormat formatter = new SimpleDateFormat("MM-DD-YY");

String message = formatter.format(calendar.getTime());

- Ага. Я помню. Вы мне уже что-то такое объясняли про SimpleDateFormat, но я честно говоря, не очень запомнил.

Тут все очень просто. Создаешь объект типа SimpleDateFormat и передаешь в него шаблон даты, которую хочешь получить. Затем вызываешь метод format, и он приводит тебе переданную дату к нужному виду.

- Звучит интересно. Мне бы побольше подробностей.

- Будут тебе подробности. Вот какие ключевые слова в шаблоне бывают:

Ключевое словоОписание
G будет заменено на эру даты (н.э. или до н.э.)
y вместо этого символа будет подставлен год
M заменяется на месяц
w номер недели в году
W порядковый номер недели в месяце
D номер дня в году
d день месяца
F номер дня недели в месяце
E день недели
a AM/PM (до обеда или после)
H час в 24-часовом формате (0-23)
k час в 24-часовом формате (1-24)
K час в 12-часовом формате (0-11)
h час в 12-часовом формате (1-12)
m минуты
s секунды
S миллисекунды
z часовая зона в формате Pacific Standard Time, PST
Z часовая зона в формате -0800

- Круто! Почти все, что нужно.

- Тут еще есть дополнительные нюансы с удвоением этих символов.

Если ты напишешь YY, то получишь две последние цифры года, если YYYY – то полный год из четырех цифр.

С месяцем тоже не все просто. MM – это число месяца. MMM – это трехбуквенное сокращение месяца (Jan, Deb, Mar, Apr, May,…). Если MMMM – полное название месяца.

Дни недели можно тоже вывести полностью – EEEE или только первые две буквы EE.

- Спасибо, Риша, действительно полезная штука этот SimpleDateFormat, буду знать.

- Пользуйся на здоровье. И, удачи!

10. Задачи

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

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

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

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

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

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

 Загугли
1 Java file download
2 Java send email
3 Java Mail API настойки для gMail
4 Java Mail API настойки для Mail.RU
5 Intellij IDEA how to add jar to project
6 Что такое сокет?
7 Как работает серверный сокет?
8 java сокеты, примеры
9 Что такое IP-address?
10 Что такое host?

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

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

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

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

13. Хулио

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

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

- Очередные десять уровней позади. Жму руку, ты прогрессируешь на глазах.

- Столько новых тем, и еще так много вопросов, на которые надо найти ответы.

- Ничего, со временем все станет на свои места. А сейчас время отдыха.

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

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

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

 Вопросы к собеседованиям
1 Что такое IP-адрес?
2 В чем отличие host и domain?
3 Какие методы в HTTP вы знаете
4 Чем отличаются методы GET, POST и HEAD?
5 Что такое REST?
6 Зачем нужен класс Calendar в Java?
7 Как преобразовать дату в Java к нужному формату?
8 В чем отличие URI и URL?
9 Что такое сокеты?
10 Отличие классов Socket и URL?

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

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

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

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