Java Lesson API Test

1. Custom Post Type Registration

✅ Custom post type "java_lesson" is registered.
WP_Post_Type Object
(
    [name] => java_lesson
    [label] => Java Lessons
    [labels] => stdClass Object
        (
            [name] => Java Lessons
            [singular_name] => Java Lesson
            [add_new] => Add New
            [add_new_item] => Add New Java Lesson
            [edit_item] => Edit Java Lesson
            [new_item] => New Java Lesson
            [view_item] => View Java Lesson
            [view_items] => View Posts
            [search_items] => Search Java Lessons
            [not_found] => No java lessons found.
            [not_found_in_trash] => No java lessons found in Trash.
            [parent_item_colon] => Parent Java Lessons:
            [all_items] => All Java Lessons
            [archives] => Java Lesson archives
            [attributes] => Java Lesson attributes
            [insert_into_item] => Insert into java lesson
            [uploaded_to_this_item] => Uploaded to this java lesson
            [featured_image] => Java Lesson Cover Image
            [set_featured_image] => Set cover image
            [remove_featured_image] => Remove cover image
            [use_featured_image] => Use as cover image
            [filter_items_list] => Filter posts list
            [filter_by_date] => Filter by date
            [items_list_navigation] => Posts list navigation
            [items_list] => Posts list
            [item_published] => Post published.
            [item_published_privately] => Post published privately.
            [item_reverted_to_draft] => Post reverted to draft.
            [item_trashed] => Post trashed.
            [item_scheduled] => Post scheduled.
            [item_updated] => Post updated.
            [item_link] => Post Link
            [item_link_description] => A link to a post.
            [menu_name] => Java Lessons
            [name_admin_bar] => Java Lesson
            [template_name] => Single item: Java Lesson
        )

    [description] => 
    [public] => 1
    [hierarchical] => 
    [exclude_from_search] => 
    [publicly_queryable] => 1
    [embeddable] => 1
    [show_ui] => 1
    [show_in_menu] => 1
    [show_in_nav_menus] => 1
    [show_in_admin_bar] => 1
    [menu_position] => 
    [menu_icon] => dashicons-welcome-learn-more
    [capability_type] => post
    [map_meta_cap] => 1
    [register_meta_box_cb] => 
    [taxonomies] => Array
        (
        )

    [has_archive] => 1
    [query_var] => java_lesson
    [can_export] => 1
    [delete_with_user] => 
    [template] => Array
        (
        )

    [template_lock] => 
    [_builtin] => 
    [_edit_link] => post.php?post=%d
    [cap] => stdClass Object
        (
            [edit_post] => edit_post
            [read_post] => read_post
            [delete_post] => delete_post
            [edit_posts] => edit_posts
            [edit_others_posts] => edit_others_posts
            [delete_posts] => delete_posts
            [publish_posts] => publish_posts
            [read_private_posts] => read_private_posts
            [read] => read
            [delete_private_posts] => delete_private_posts
            [delete_published_posts] => delete_published_posts
            [delete_others_posts] => delete_others_posts
            [edit_private_posts] => edit_private_posts
            [edit_published_posts] => edit_published_posts
            [create_posts] => edit_posts
        )

    [rewrite] => Array
        (
            [slug] => java-lesson
            [with_front] => 1
            [pages] => 1
            [feeds] => 1
            [ep_mask] => 1
        )

    [show_in_rest] => 1
    [rest_base] => java-lessons
    [rest_namespace] => wp/v2
    [rest_controller_class] => WP_REST_Posts_Controller
    [rest_controller] => 
    [revisions_rest_controller_class] => 
    [revisions_rest_controller] => 
    [autosave_rest_controller_class] => 
    [autosave_rest_controller] => 
    [late_route_registration] => 
)

2. REST API Endpoint

Standard REST API URL: https://codorbits-api.online/wp-json/wp/v2/java-lessons

Custom REST API URL: https://codorbits-api.online/wp-json/bitbrew/v1/featured-lessons

3. Sample Java Lessons

  • Сборка Java приложения в Docker

    В этом уроке соберем простейшее Spring Boot приложение в Docker-образ (Docker image), запустим его и загрузим на Docker Hub. Его структура приведена ниже. В ней ничего особенного за исключением того, что в корне проекта добавлен файл с именем Dockerfile. В контроллере один простой обработчик, который возвращает строку Hello World!!!. package com.SpringBootApps.simpleSpringBootApp.controller; import org.springframework.web.bind.annotation.GetMapping; @RestController public […]

    Difficulty:

    Duration:

  • Docker Hub: назначение и использование

    Для начала работы с Docker необходимо его скачать и установить на компьютер по ссылке: https://www.docker.com/products/docker-desktop/ Также необходимо создать аккаунт на сайте Docker Hub по ссылке: https://hub.docker.com/signup. Там всё довольно стандартно и интуитивно, поэтому не будем заострять внимание. Что такое Docker Hub, Repository, Tag? Итак, как мы поняли, Docker image – это итоговый файл, который получается […]

    Difficulty:

    Duration:

  • Что такое Docker и зачем он нужен?

    С помощью докер можно запускать любые приложения реализованные любыми технологиями на любых языках программирования одной и той же командой. Вот такой: docker container run -d -p 8081:8080 <путь_к_docker_image> Ее содержимое разберем позже. Для того чтобы запустить приложение этой командой его нужно собрать в Docker Image. Один раз собранное докером приложение в Docker image можно запустить […]

    Difficulty:

    Duration:

  • Создание Spring Boot Data Rest CRUD-приложения

    Создадим crud приложение, только теперь с использованием Spring Data Rest. Создадим новое Spring Boot приложение с такими папками и файлами. Как видите, в этом проекте, по сравнению с предыдущими crud приложениями которые мы разрабатывали, стало крайне мало файлов. Нет дао класса, сервис класса и даже контроллера. А если вы пролистаете данный урок далее, то увидите, […]

    Difficulty:

    Duration:

  • Создание Spring Boot Data CRUD-приложения

    Создадим CRUD приложение, только теперь с использованием Spring Boot Data. Создадим новое Spring Boot приложение с такими папками и файлами. Содержимое файлов в этом crud приложении ничем не отличается от содержимого предыдущего crud приложения, которое мы создавали в прошлом уроке за исключением файла класса сервиса. Также можно заметить, что DAO интерфейс и класс исчезли, а […]

    Difficulty:

    Duration:

  • Создание Spring Boot CRUD-приложения

    Создадим Spring Boot Crud приложение. Это приложение будет предоставлять ту же функциональность, что и предыдущее CRUD приложение. То есть между клиентом и сервером будет происходить обмен JSON файлами с помощью REST. Создадим новое Spring Boot приложение с такими папками и файлами. Здесь содержимое всех файлов идентично предыдущему CRUD приложению, которое разбиралось в разделе “Spring MVC […]

    Difficulty:

    Duration:

  • Spring Boot: в чём его сила и удобство?

    Что такое Spring Boot приложение? Spring Boot приложение это почти то же самое Spring приложение, что мы изучали раньше, но с дополнительными средствами упрощающими разработку. Эти средства помогают легче конфигурировать наше приложение и взаимодействовать с ним. Отметим основные моменты: 1. Во первых, в Spring Boot приложении сокращено количество файлов (нет файла настроек бинов applicationContext, файла […]

    Difficulty:

    Duration:

  • Создание REST API CRUD приложения

    Создадим crud приложение только теперь с использованием REST. Создадим новое Maven приложение с такими папками и файлами. Содержимое файлов в этом crud приложении ничем не отличается от содержимого предыдущего crud приложения, которое мы создавали, за исключением содержимого файла контроллера и pom файла, в который просто нужно добавить зависимость для поддержки jackson. Рассмотрим содержимое файла контроллера, […]

    Difficulty:

    Duration:

  • Первое Spring REST API-приложение

    Создадим свое собственное Rest Api. То есть мы создадим набор методов, к которым можно будет обращаться http запросом по ссылке. Эти методы будут возвращать java объекты конвертированные в JSON тому кто сделал запрос. Создадим Мавен приложение с такой структурой и файлами: В файле MainController будут находиться обработчики, которые будут принимать http запрос, конвертировать java объекты […]

    Difficulty:

    Duration:

  • Что такое REST API?

    REST API – простой способ коммуникации между приложениями основанный на http методах передачи данных. Помним эти методы – GET, POST и др. Приложения могут обмениваться данными в различных форматах. То есть обмен данными между приложениями может происходить например в формате обмена XML файлами. Также обмен может происходить с помощью JSON, HTML или др. Приложения между […]

    Difficulty:

    Duration:

  • Hibernate CRUD приложение с сервисным уровнем

    В прошлом уроке мы построили Crud приложение, но это был не совсем правильный способ его построения. В этом уроке мы немного модернизируем наше CRUD приложение. В прошлом уроке у нас было всего два уровня в нашем приложении, это: Но правильно чтобы бил еще один уровень – сервисный. Давайте создадим папку service и создадим в ней сервисный […]

    Difficulty:

    Duration:

  • Создание CRUD-приложения с Hibernate и Spring

    В этом уроке создадим простое CRUD приложение с использованием hibernate. CRUD это аббревиатура: Наше приложение будет реализовывать все эти четыре операции. Эти операции будут производиться с таблицей. Пускай это будет таблица "Актеры" с аттрибутами "Имя актера" и "Самый известный фильм". Приложение будет выглядеть примерно так: Как видим, здесь есть ссылка add actor, которая ведет на […]

    Difficulty:

    Duration:

  • Настройка файла pom.xml в Maven

    Давайте заглянем внутрь pom файла и разберемся с настройкой метаданных проекта в нем. 4.0.0 com.MavenWebAps firstMavenWebAp 0.0.1-SNAPSHOT jar firstMavenWebAp Maven Webapp http://maven.apache.org UTF-8 1.8 1.8 junit junit 3.8.1 test Включение зависимостей в проект. Давайте же теперь разберемся с самым главным – как включать зависимости в наш проект. 4.0.0 com.MavenWebAp firstMavenWebAp 0.0.1-SNAPSHOT jar firstMavenWebAp Maven Webapp […]

    Difficulty:

    Duration:

  • Создание Maven веб-проекта в Eclipse IDE

    Давайте же создадим первый мавен веб-проект. Во первых, Eclipse должен находиться в режиме создания веб-проекта. Переходим по пути: Window > Perspective > Open Perspective > Other. Выбираем Java EE. Далее создаем Мавен проект. Для этого переходим по пути: File > new > Maven Project В открывшемся окне нажимаем Next. Далее необходимо найти и выбрать archetype […]

    Difficulty:

    Duration:

  • Сборщик проектов Maven

    До этого момента мы все jar файлы наших проектов скачивали и добавляли вручную в папку lib проекта. Чтобы не делать это вручную существует Maven – средство для управления сборкой проекта и добавления зависимостей. Зависимость – это какой-либо jar от которого зависит наш проект. Мы делаем запрос на добавление какого-либо jar файла в проект и он […]

    Difficulty:

    Duration:

  • Настройка связи Многие-ко-Многим в Hibernate приложении

    Теперь настроим в нашем приложении связь Многие-ко-Многим. Пусть теперь в нашем приложении будет еще одна новая таблица – "Издательство". Эта таблица будет связана с ранее созданной таблицей "Книги автора". Любая книжка может быть напечатана несколькими издательствами и любое издательство может печатать какие-угодно книги. То есть связь многие книги ко многим издательствам. Ясное дело, при удалении […]

    Difficulty:

    Duration:

  • Типы извлечения данных в Hibernate (fetch types)

    LAZY, EAGER – это типы извлечения данных. Подробнее ниже. package HibernateApps; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity //Этот класс с таблицы author @Table(name = “author”) public class Author { @Id @GeneratedValue( strategy = GenerationType.IDENTITY ) private […]

    Difficulty:

    Duration:

  • Настройка связи Один-ко-Многим в Hibernate

    Теперь настроим в нашем приложении связь 1-ко-Многим. Создадим еще одну таблицу "Книги авторов", которая будет связана с таблицей author. В одной таблице хранятся авторы, а в другой их книги. У каждого автора много книг, но у каждой книги только один автор. То есть связь – один автор ко многим книгам. При удалении автора должны удаляться […]

    Difficulty:

    Duration:

  • Двусторонняя связь между сущностями в Hibernate

    Связь между объектами таблиц была односторонняя, то есть через объект Author удалялся из БД или сохранялся в БД связанный объект AuthorInfo. Теперь сделаем наоборот. Так, чтобы через объект AuthorInfo производились какие-то действия в БД со связанным объектом Author. Теперь уже будет двухсторонняя связь. То есть мы, например, можем совершить выборку из базы с помощью метода […]

    Difficulty:

    Duration:

  • Настройка связей в Hibernate приложении

    В базе данных обычно существуют связанные таблицы. Все стандартные виды связей (1-к-1, 1-ко-Многим, Многие-Ко-Многим) можно реализовать и между java классами тех таблиц, которые связаны между собой в базе. Объекты этих связанных классов, очевидно, тоже могут быть связанными. Связанные объекты связанных классов, это связанные строки связанных таблиц. Благодаря этому, можно сделать так, чтобы при добавлении в […]

    Difficulty:

    Duration:

  • HQL запросы в Hibernate. Удаление данных (Delete)

    Если извлечь строку таблицы в объект, а потом применить метод delete на этот объект, то строка, которую мы извлекали удалиться в базе данных. Таким образом с помощью метода delete можно удалять одну строку таблицы. package HibernateApps; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateApp { public static void main(String[] args) { SessionFactory […]

    Difficulty:

    Duration:

  • HQL запросы в Hibernate. Обновление данных (Update)

    Если мы извлекли из таблицы строку в объект, а потом изменили его с помощью например сеттера, то после коммита транзакции он измениться и в базе. package HibernateApps; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateApp { public static void main(String[] args) { SessionFactory sessionfactory = new Configuration() .configure(“hibernate.cfg.xml”) .addAnnotatedClass(Book.class) .buildSessionFactory(); Session session […]

    Difficulty:

    Duration:

  • Обзор языка запросов HQL в Hibernate

    В hibernate используется HQL, а не SQL. HQL работает с таблицей через класс, который связан с ней. То есть в запросе к БД мы указываем не название таблицы, и ее аттрибутов, а название класса и его полей. Таким образом HQL является более объектно-ориентированным Работа с HQL. Давайте сделаем пару запросов на языке HQL. В принципе […]

    Difficulty:

    Duration:

  • Введение в ORM с использованием Hibernate

    Hibernate реализует ORM-модель построения приложений. Благодаря ORM можно сохранить объект в базу данных. При сохранении какого-либо объекта в базу данных, объект будет превращен в строку таблицы базы данных. Значения же полей этого объекта будут значениями аттрибутов этой строки таблицы. То есть поля объекта ассоциированы с аттрибутами таблицы, а класс объекта ассоциирован с конкретной таблицей в […]

    Difficulty:

    Duration:

  • Валидация форм в Spring MVC

    Валидация – это проверка данных формы на то подходят ли они под какие-то условия. Для начала необходимо скачать hibernate validator. Можно скачать по ссылке https://hibernate.org/validator/releases/6.2/. Потом закидываем в lib jar файлы из папки dist и required. Также давайте добавим две новые странички в проект. Так же как и в прошлом проекте, одна страница с формой, […]

    Difficulty:

    Duration:

  • Теги Spring Form: Select, Radio, Checkbox

    Помимо тега form:input, рассмотренного в прошлом уроке, есть также и другие теги с которыми мы можем связывать поля объекта в аттрибуте. В этом уроке рассмотрим теги form:select, form:radio и form:checkbox. Эти теги аналоги всем известных html тегов, которые предоставляют пользователю варианты выбора. Напомним как они выглядят: Добавим в класс объекта, который будет в аттрибуте, новые […]

    Difficulty:

    Duration:

  • Специальный тег Form в Spring

    В спринг есть специальные теги, которые упрощают нам разработку. В этом уроке рассмотрим специальный тег form:form. Тег form:form обеспечивает прямую привязку полей объекта модели вашего приложения к полям ввода HTML-формы. Давайте создадим простой класс SomeUser с одним полем, геттерами и сеттерами. package classes; import org.springframework.stereotype.Component; @Component public class SomeUser { // определим поле, которое в […]

    Difficulty:

    Duration:

  • Обработка дынных формы в Spring MVC, передача данных в Model

    Давайте создадим приложение в котором: Для начала, нужно создать страницу формы через которую пользователь будет отправлять данные в обработчик и страницу на которую этот обработчик будет перенаправлять пользователя и на которую этот обработчик будет отправлять данные. Страница формы очень простая. Она передает параметр username, содержащий введенные данные пользователем в текстовое поле, в обработчик по пути […]

    Difficulty:

    Duration:

  • Аннотация RequestMapping в Spring MVC

    Классов контроллеров в MVC-приложении может быть много. Давайте создадим еще один контроллер – MVController2. В адресной строке браузера можно указать не только обработчик, к которому должен совершиться переход, но и конкретный класс контроллер, к которому должен совершаться переход. То есть у нас в проекте сейчас два класса контроллера и в адресной строке можно указать, чтобы […]

    Difficulty:

    Duration:

  • Основы Spring MVC. Как работает DispatcherServlet

    Что же такое Spring MVC? Это набор средств для построения веб-приложений. Подобных тем приложениям, которые мы уже разрабатывали, но в отличии от разработки с помощью сервлетов разрабатывать веб-приложения с помощью Spring MVC намного удобнее и эти все удобства будут рассмотрены далее. Для понимания того, как работает Spring MVC необходимо вспомнить, что такое паттерн Front Controller. […]

    Difficulty:

    Duration:

  • Создание веб-приложения в Eclipse IDE

    До данного урока мы компилировали и запускали приложения вручную через консоль. Давайте же с началом изучения темы spring MVC переместимся в удобную среду разработки приложений. Одной из самых популярных является Eclipse IDE. Скачать эту IDE можно по ссылке: https://www.eclipse.org/downloads/packages/release/2023-09/r/eclipse-ide-enterprise-java-and-web-developers Первое, что нужно сделать, это удостовериться, что наша IDE находиться в режиме разработки веб-приложений и если […]

    Difficulty:

    Duration:

  • Конфигурация Spring бинов с помощью java класса.

    Иногда удобнее бывает конфигурировать бины не с помощью XML, а с помощью Java кода. То есть теперь вместо applicationContext.xml у нас будет Java класс. Для начала давайте поправим класс ServerPC. Вернем в него конструктор, так как он будет использован в новом конфигурационном файле. Класс ServerPC: package com.someclasses; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; […]

    Difficulty:

    Duration:

  • Аннотация @Autowired в Spring Framework

    В прошлом уроке мы внедряли бин админа в бин ПК с помощью конструктора или сеттера помеченных аннотацией @Autowired. Но аннотация @Autowired намного мощнее. Если мы просто пометим нужное поле в классе аннотацией @Autowired, нам даже не нужно будет писать конструктор или сеттер для внедрения этого поля в бин, который создается на основе этого класса. Тем […]

    Difficulty:

    Duration:

  • Конфигурация Spring бинов с помощью аннотаций

    Как уже было упомянуто в конце прошлого урока, бины можно создавать не в applicationContext.xml, а аннотациями прямо в классах бинов. Благодаря этому можно не писать огромное количество xml кода. Можно создать вот такие бины, вот таким образом с помощью xml: Идентичный бин класса ServerPC можно сконфигурировать с помощью аннотаций сразу в классе бина: package com.someclasses; […]

    Difficulty:

    Duration:

  • Жизненный цикл Spring-бина

    Жизненный цикл спринг бина таков: Что же это за init-method и destroy-method? Это что-то типа init и destroy методов в сервлете. Как мы помним, init метод нужен в сервлете для инициализации каких-то данных при создании объекта сервлета, а destroy метод нужен для освобождения каких-то ресурсов перед уничтожением объекта сервлета. init-method и destroy-method, это то же […]

    Difficulty:

    Duration:

  • Области видимости бинов (Spring Scopes)

    Бин может иметь область, в которой он действует. Их 5: singleton, prototype, request, session и global-session. По дефолту scope у бина singleton. Это значит, что если мы в коде сервлета запишем. ServerPC serverpc = context.getBean(“serverPCBean”,ServerPC.class); ServerPC serverpc1 = context.getBean(“serverPCBean”,ServerPC.class); то и serverpc и serverpc1 будут ссылаться на один и тот же объект поскольку как помним […]

    Difficulty:

    Duration:

  • Внедрение значений из внешнего файла в поля Spring бина.

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

    Difficulty:

    Duration:

  • Внедрение зависимостей в Spring с помощью сеттера.

    Помним, что в прошлом уроке внедрение админа в ПК происходило с помощью конструктора в классе ПК. Но внедрять также можно с помощью сеттера Класс ServerPC: package com.someclasses; public class ServerPC{ private Administrator admin; private String pcid; private String pcBrand; ServerPC() {} ServerPC(Administrator admin) { this.admin = admin; } //Теперь внедрение будет происходить //с помощью этого […]

    Difficulty:

    Duration:

  • Что такое Spring Framework и зачем он нужен

    В разделе по сервлетам мы уже встречались с так называемыми бинами — это обычные объекты классов с приватными полями, геттерами и сеттерами. Так вот, где-то до 2003 работать с бинами в Java EE было очень непростой, запутанной задачей. Чтобы создавать и использовать бины нужно было писать очень много кода и продуктивность очень сильно страдала, так, […]

    Difficulty:

    Duration:

  • Шаблон Template в Java: поведение по умолчанию

    Template – это просто абстрактный класс, который задает скелет для расширяющих его классов. Приведем пример из жизни. Например, наша жизнь: Рождаемся -> заканчиваем школу -> заканчиваем университет -> работаем -> умираем. Сплошная скука(((. Эта последовательность (то есть именно сама последовательность без подробностей) и есть скелет. Абстрактный класс Template просто задает этот скелет(последовательность). А класс реализующий […]

    Difficulty:

    Duration:

  • Шаблон Front Controller в Java: централизованная обработка запросов

    Вся суть паттерна Front Controller в том, что все запросы обрабатываются централизовано через одно место. То есть любой запрос сначала идет в Front Controller, далее Front Controller определяет в какой другой обработчик или View перенаправить запрос и, собственно, перенаправляет. Приведем пример сервлета, который будет играть роль Front Controller-а, который принимает запросы и форвардит через RequestDispatcher […]

    Difficulty:

    Duration:

  • Шаблон DAO в Java: работа с БД через объект

    Data Access Object. Нужен чтобы отделить низкоуровневый доступ к данным от высокоуровневых сервисов. Низкоуровневый доступ – это, например, взаимодействие с базой с помощью средств JDBC. Мы можем сокрыть прямое использование средств JDBC (то есть, например, подключение к базе, извлечение данных из базы с помощью каких-то сложных цепочек JDBC методов, или сокрыть некоторые SQL запросы) в […]

    Difficulty:

    Duration:

  • Шаблон Singleton в Java: обеспечение единственного экземпляра

    Singleton – класс, который гарантировано имеет только один экземпляр. Используется, как некий глобальный ресурс доступ к которому есть в любой точке приложения. //Создадим класс синглтона. В нем сразу же создается //и объект этого класса и никогда больше объект этого //класса не создается и не может быть создан в принципе. //В этом вся суть синглтона. class […]

    Difficulty:

    Duration:

  • Что такое шаблоны проектирования? Шаблон Factory в Java

    При проектировании того или иного программного продукта разработчик сталкивается с большим количеством проблем. И многие из этих проблем бывают ТИПИЧНЫМИ при разработке. Так вот, чтобы разработчик сам не сидел и не выдумывал как ему решить какую-то типичную при разработке многих программных продуктов проблему, существует уже готовое решение этой проблемы, которое этот разработчик может использовать. То […]

    Difficulty:

    Duration:

  • Работа с JSP Standard Tag Library (JSTL)

    JSTL — это теговая альтернатива стандартному Java-коду на JSP. То есть все стандартные конструкции типа создания переменных, циклов, условий, исключений,… можно делать тегами. Нужен за тем же, зачем используются usebean, EL – чтобы легче страницу было разрабатывать дизайнеру. Подключение JSTL Для начала нужно подключить JSTL библиотеку. Для этого нужно скачать файл jstl-1.2.jar. Его довольно легко […]

    Difficulty:

    Duration:

  • Expression Language (EL) in JSP

    В прошлом уроке мы извлекали созданный в контроллере бин с помощью actioBean. Чтобы для создания и получения бина не писать вот так: <jsp:useBean id=”someuser” class=”com.someclasses.User” scope=”application”/> <jsp:getProperty name=”someuser” property=”name”/> извлекать атрибуты скоупов можно просто используя Expression language. Изменим View из предыдущего урока вот таким образом: EL JSP ${someuser.name} Запускаем контроллер: Он, опять таки, создает атрибут […]

    Difficulty:

    Duration:

  • Паттерн MVC в веб-разработке на Java

    MVC – MODEL, VIEW, CONTROLLER. Популярная архитектура построения приложений. Нужно знать. Клиент может передавать какие либо данные в CONTROLLER через VIEW, то есть через страницу, которую клиент видит. Также клиент может получать данные на VIEW из CONTROLLER. То есть всё, что клиент видит на VIEW, получено из CONTROLLER. Откуда же CONTROLLER берет данные, которые он […]

    Difficulty:

    Duration:

  • Что такое actionBeans в JSP?

    Мы рассмотрели action теги invoke и forward. Среди часто употребляемых еще есть useBean, setProprety, getProprety. Бин – это объект обычного класса с конструктором, полями и геттерами, сеттерами для них. Для начала создадим простой класс в папке helloservlet/WEB-INF/classes/com/someclasses на основе которого будет создаваться бин: package com.someclasses; public class User{ private String name; public void setName(String name){ […]

    Difficulty:

    Duration:

  • Неявные объекты в JSP: session, request и др.

    Допустим, мы хотим как в сервлете использовать на нашей JSP странице req и resp метода doGet. Где их взять? Для этого придумали специальные неявные объекты – req и resp. Кроме req и resp есть еще 7 неявных объектов (out, request, response, config, application, session, pageContext, page, exception). Пример программы: Objects JSP Откроем страницу: Видим, что […]

    Difficulty:

    Duration:

  • Комментарии в JSP

    На JSP странице можно пользоваться двумя видами комментариев. <%----%> и <!---->. Первый это jsp комментарий, второй это html комментарий. Пример программы: Tags JSP Откроем код страницы в Chrome нажав F12 и убедимся, что JSP комментария там нет. Видим, что в коде в браузере присутствует только <!----> комментарий. Тег <%! %> Поясним на примере программы: First […]

    Difficulty:

    Duration:

  • Азы работы с Java Server Pages (JSP)

    Для начала создадим папку jsp в папке приложения helloservlet. В ней будут храниться jsp файлы. Также создадим здесь файлик с расширением .jsp. JSP – это тот же сервлет, только в формате HTML страницы с возможностью добавления на в нее Java кода. При обращении клиента к созданной jsp странице сервер формирует на ее основе сервлет и […]

    Difficulty:

    Duration:

  • Оптимизация Java-cервлетов с помощью AsyncContext

    Представим ситуацию, что сервлет ожидает завершения какого-то процесса выполняющегося в другом потоке, чтобы в последствии использовать результат его выполнения. Но пока код сервлета остановился и ожидает, можно сделать так, чтобы поток, в котором выполняется код сервлета не простаивал, то есть, чтобы он пошел выполнять другую задачу. Для этого используется AsyncContext. Пример программы: //Создадим простенький класс. […]

    Difficulty:

    Duration:

  • Слушатели (Listeners) в Java-сервлетах

    Часто бывает нужно проследить выполнение каких-то действий в сессии или контексте и т.д. Для этого используются слушатели. Например, для прослушивания событий происходящих с аттрибутами реализуется интерфейс ServletContextAttributeListener. В примере слушателя ниже определены методы, которые будут срабатывать когда в контекст добавляются, удаляются или заменяются аттрибуты. Мы будем уведомлены о событиях с аттрибутами. Можно, например, отслеживать точное […]

    Difficulty:

    Duration:

  • Что такое Filter в Java-сервлетах

    Часто бывает, что нужно чтобы перед вызовом какого-либо сервлета или после вызова выполнялся какой-либо код. Для этого нужно реализовать интерфейс Filter и реализовать его абстрактный метод doFilter, в котором и пишется код, который будет выполняться до сервлета и после него. Например: Если нужно чтобы сначала пользователь авторизировался, и только если данные авторизации правильные запустился какой-либо […]

    Difficulty:

    Duration:

  • Синхронизация в Java-сервлете

    По умолчанию все клиенты обращаются к одному созданному объекту сервлета. Каждое обращение клиента к этому объекту создает отдельный поток, в котором обрабатываться запрос клиента используя этот объект. Поэтому необходимо заботиться о потокобезопасности. Чтобы для каждого запроса клиента создавался отдельный объект, а не производилась работа с одним в отдельных потоках можно наследовать SingleThreadModel, но это не […]

    Difficulty:

    Duration:

  • encodeURL и encodeRedirectURL в Java-сервлетах

    Часто так бывает, что клиент отключил cookies в браузере, а id сессии храниться в cookies, а как-то поддерживать сессию надо. Выход есть. Для этого нужно закодировать URL-адрес с добавлением идентификатора сессии и прикрепленный к адресу id будет тем же самым, как если бы он хранился в cookies, только здесь в ссылке. То есть теперь клиент […]

    Difficulty:

    Duration:

  • Интерфейс ServletConfig

    ServletConfig – можно сказать, что то же самое, что и ServletContext, но в отличии от него хранит данные касающиеся только конкретного сервлета. Очевидно, что хранить аттрибуты в нем уже нельзя, поскольку аттрибуты нужны для обмена между разными сервлетами приложения. В основном, он нужен для извлечения параметров инициализации. Параметры инициализации (прописываются в web.xml) – это какие-то […]

    Difficulty:

    Duration:

  • Интерфейс ServletContext

    ServletContext – контекст является объектом общим для всего приложения. В объекте ServletContext можно хранить какие-либо данные общие для всех сервлетов приложения. И потом эти данные можно извлекать из этого объекта в сервлетах приложения. Например, из него получать параметры инициализации прописанные в web.xml или сохранять в него какие-то аттрибуты с помощью метода setAttribute, и потом получать […]

    Difficulty:

    Duration:

  • Работа с сессиями (Session) в Java-cервлетах

    Если выбрать все cookies нашего веб-ресурса, то там всегда будет кук с именем SESSIONID и значением идентификатором. Этот идентификатор уникален для каждого клиента и он отправляется на сервер при запросах клиента и сервер ассоциирует этот уникльный ID с сессией конкретного клиента. Благодаря этому на сервере мы можем ложить в сессию конкретного клиента различную информацию и […]

    Difficulty:

    Duration:

  • Работа с Cookies в Java-cервлетах

    Cookies это данные, которые генерируются сервером и хранятся в браузере клиента. Браузер клиента возвращает эти данные обратно на сервер когда клиент делает запрос из того же веб-ресурса. Как пример, можно привести автоматический ввод логина и пароля когда пользователь заходит на страницу для входа в учетную запись, на которой он уже вводил свои логин и пароль. […]

    Difficulty:

    Duration:

  • Redirect, forward, include в Java-сервлетах

    Рассмотрим переход на другую страницу с помощью sendRedirect() sendRedirect() – перенаправляет на любой указанный аргументом адрес. Адрес в адресной строке браузера клиента меняется на тот, что указан аргументом у метода, так как сервер указывает клиенту, что нужно перейти по этому адресу и браузер переходит по нему. Пример программы: import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import […]

    Difficulty:

    Duration:

  • Работа с HTTP-запросами в Java-cервлетах: GET и POST

    Для начала рассмотрим GET-запрос. GET-запросы позволяют клиенту передавать параметры через адресную строку браузера. Эти параметры затем можно легко извлечь из объекта HttpServletRequest в сервлете. Представьте, что клиент вводит в адресной строке следующее: localhost:8080\helloservlet\getpostservlet\?param1=Hello&param2=World Здесь param1 имеет значение “Hello”, а param2 — “World”. С помощью различных методов эти параметры можно перехватывать, например, с помощью метода getParameter […]

    Difficulty:

    Duration:

  • Использование аннотации @WebServlet

    Чтобы не конфигурировать путь, по которому будет происходить обращение к сервлету в web.xml можно использовать аннотацию WebServlet в коде сервлета. import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // Вместо xml кода путь, по которому будем обращаться к сервлету, // в строке браузера можно указать в этой аннотации. @WebServlet(“/myservlet”) public class […]

    Difficulty:

    Duration:

  • Методы Java-cервлета

    Помимо doGet у сервлета есть и другие методы. Рассмотрим вкратце зачем нужны методы init, doPost, service и destroy. import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { /* public void init() throws ServletException { // При создании объекта сервлета, который создается один раз // за все […]

    Difficulty:

    Duration:

  • Создание первого Java-сервлета

    Ниже приведен пример сервлета. Класс сервлета наследуется от класса HttpServlet и в нем реализуются методы doGet, doPost. В этих методах происходит прием информации от клиента через HttpServletRequest req и отправка информации клиенту через HttpServletResponse resp. Пример программы: import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { […]

    Difficulty:

    Duration:

  • Java Enterprise Edition (EE)

    Java EE – стандарт разработки веб-приложений используя язык Java. Предоставляет множество средств для реализации клиент-серверных приложений. В Java EE входят разные технологии – Servlets, JSP, JSTL и т.д. В данном разделе будем рассматривать Сервлеты. Что такое Сервлет? Для начала нужно узнать что такое клиент-серверное приложение. Говоря просто, механизм его работы такой: Запросы с клиентского компьютера […]

    Difficulty:

    Duration:

  • Настройка log4j логирования

    Логирование настраивается в файле log4j.properies. Логгер записывает данные через appender. Аппендер бывает разных типов – для записи логов в файл или консоль, или бд, или другое. Логирование происходит исходя из настроенного уровня логирования. Их шесть: trace < debug < info < warn < error < fatal. По стрелке слева на право сужается количество информации, которая […]

    Difficulty:

    Duration:

  • Логирование в Java с помощью log4j

    Часто бывают ситуации когда нам нужно записать куда-то данные о работе программы или об произошедших ошибках в ней чтобы потом их просмотреть. Этим занимается логгер. Приведем простейший пример программы, в которой логируется информация о произошедшей в программе ошибке в файл, чтобы программист в любое время мог открыть этот файл и посмотреть, что же произошло. Чаще […]

    Difficulty:

    Duration:

  • Тестирование с Mockito

    Mockito довольно нужная штука и к сожалению немного сложноватая для понимания, поэтому здесь подробно. Часто бывает так, что подлежащий тестированию метод имеет какие-то зависимости. Например, в нем производиться подключение к базе данных либо в тестируемом методе используются классы или методы со сложной структурой. Это делает наш тестируемый метод сложно поддерживаемым, то есть если перенести его […]

    Difficulty:

    Duration:

  • Аннотации в JUnit тестах

    Далее пройдемся по основным аннотациям junit. В скобках у аннотации Test можно указать число. Это число – это количество миллисекунд. Если метод будет выполняться больше этого количества миллисекунд, то программа сообщит об этом. Таким образом можно протестировать производительность тестируемого метода. Пример программы: import org.junit.Assert; import org.junit.Test; public class TestCalc { // проверяет, что метод исполняется […]

    Difficulty:

    Duration:

  • Тестирование в Java с помощью JUnit

    JUnit — это библиотека для тестирования отдельных частей кода, в частности — методов. Когда мы реализовали какой-то метод, нам всегда нужно его протестировать. Правильно? Потому что если мы запустим код где много непротестированных методов, то мы получим много ошибок, в которых разбираться будет очень сложно. Или если мы уже запустили такой непроверенный код, то нам […]

    Difficulty:

    Duration:

  • Cелекторы в CSS

    До этого мы использовали только селектор конкретного тега ( например h1 {…} ) и селектор класса ( например some-class-name {…} ). Селектор – это то, что мы пишем перед фигурными скобочками. Если чуть сложнее, то селектор – это шаблон по которому происходит привязка набора свойств к элементу на странице. Очень важно рассмотреть некоторые другие селекторы […]

    Difficulty:

    Duration:

  • Теги структуры страницы. Семантические теги

    Все видели классическую структуру страницы: Верхняя часть страницы на которой панель навигации по сайту, логотип и другое, часть страницы с основным контентом, секции справа и слева, где может быть какая-то доп информация, меню, реклама и т.д и нижняя часть страницы где обычно ссылки на соцсети, поддержку и т.д. Для этих частей есть специальные теги, которые […]

    Difficulty:

    Duration:

  • Что такое div блок и зачем он нужен

    Рассмотрим тег <div></div>. Это наверное один из самых часто встречающихся тегов в любом html документе. div сам по себе ничего не делает, но с ним можно вытворять различные вещи с помощью css и он может содержать в себе другие html теги. Сейчас на примере убедитесь в его полезности. Создадим новый класс, который будет применяться к […]

    Difficulty:

    Duration:

  • Что такое классы в CSS

    А что, если мы хотим применить определённый набор CSS-свойств вообще к любому элементу на странице, не указывая конкретный тег, например h1 { ... } или p { ... }? Для этого используются классы. Классы определяются в css файлике. У класса есть имя и оно может быть любым, его придумывает программист. Этому имени сопоставляется определённый набор […]

    Difficulty:

    Duration:

  • Базовые концепции CSS

    Как уже говорилось, html нужен только чтобы задать определенную структуру странице и добавлять на нее некоторые элементы. С помощью языка CSS мы можем очень гибко оформлять нашу страницу придавая ей различные элементы дизайна, то есть привести ее к такому внешнему виду, чтобы ее не стыдно было выложить в интернет. Разделение CSS и HTML – это […]

    Difficulty:

    Duration:

  • Атрибуты в HTML

    Мы уже рассмотрели некоторые аттрибуты типа src, href и border. Как уже можно было понять, они нужны, чтобы каким-либо образом настраивать элементы на странице. Помимо уже рассмотренных аттрибутов есть также много других разных аттрибутов. Рассмотрим некоторые на примерах. С помощью аттрибута width можем задать ширину элементам. С помощью аттрибута height можем задать высоту элементам. Аттрибут […]

    Difficulty:

    Duration:

  • Ключевые теги HTML

    В этом уроке приведем несколько наиболее распространенных тегов, которые встречаются почти везде. Для начала рассмотрим теги title и h. Также сверху html страницы зачастую можно увидеть тег DOCTYPE. Этот тег сообщает любому браузеру в котором html страница была открыта, как отображать html код. Если он не будет указан, то каждый браузер будет отображать страницу как […]

    Difficulty:

    Duration:

  • Что такое HTML и зачем он нужен

    HTML – это язык разметки веб-страницы. С помощью html мы задаем странице определенный каркас. То есть этот язык определяет в каком порядке будут идти друг за другом элементы на странице типа картинок, таблиц, текста и другое. Но точнее будет сказать он не только определяет порядок, но и размещает эти элементы на странице в определенном программистом […]

    Difficulty:

    Duration:

  • Использование хранимых процедур в Java

    Хранимые процедуры это по сути функции, только вместо java кода sql код и эти функции хранятся в БД. Для создания этой процедуры в БД, нужно выполнить sql запрос CREATE PROCEDURE… Давайте создадим две процедуры. Одна будет возвращать параметр, в другую будем передавать параметр. #В скобках ниже не входной параметр процедуры, #а выходной. OUT обозначает что […]

    Difficulty:

    Duration:

  • PreparedStatement в Java: защита от SQL-инъекций

    Напрямую в запрос данные пользователя передавать нельзя! Это опасно. Пользователь может туда вставить любое sql выражение какое ему вздумается. Это называется sql инъекцией. И в результате может, например, что-то изменить в базе или своровать данные. PreparedStatement – как Statement, только безопаснее. Он добавляет методы для управления входными параметрами от пользователя. Продемонстрируем пример SQL инъекции. Пример […]

    Difficulty:

    Duration:

  • Изоляция транзакций в Java. Фантомное чтение

    Фантомное чтение – по сути то же самое, что и неповторяющееся, только вместо update базы, будет insert в базу. Для того чтобы изолировать транзакции от фантомного чтения, нужно в обеих вызвать TRANSACTION_SERIALIZABLE. Пример программы: import java.sql.*; public class IsolationsPh { public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException { //здесь идет транзакция А Class.forName(“com.mysql.cj.jdbc.Driver”); […]

    Difficulty:

    Duration:

  • Изоляция транзакций в Java. Неповторяющееся чтение

    Допустим есть транзакция А и транзакция В в разных потоках. Допустим в транзакции А есть несколько select запросов подряд. Если транзакция В во время выполнения транзакции А изменит данные считываемые select-ами транзакции А, то это опять таки бывает не желательным. Иногда нужно, чтобы сначала данные считались, то есть второй поток был заблокирован пока выполняется первый […]

    Difficulty:

    Duration:

  • Изоляция транзакций в Java. Грязное чтение

    Две или более выполняющиеся параллельно транзакции часто должны быть изолированы друг от друга. Есть три случая когда необходимо изолировать транзакции друг от друга: Начнем с грязного чтения. В прошлых уроках о транзакциях мы говорили, что выполнение группы запросов, и соответственно изменение БД происходит только после вызова commit. Но транзакции могут вести себя и по другому. […]

    Difficulty:

    Duration:

  • Savepoint в JDBC транзакциях

    Класс SavePoint необходим для того, чтобы rollback был применен с определенной строки кода по определенную строку кода. Пример программы: import java.sql.*; public class TransSaveP { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName(“com.mysql.cj.jdbc.Driver”); Connection connection = DriverManager.getConnection( “jdbc:mysql://localhost/storage”, “root”, “07031998MSD”); Statement statement = connection.createStatement(); connection.setAutoCommit(false); statement.executeUpdate(“INSERT INTO books ” +”(name,author) VALUES (‘Book1’, ‘Author1’);”); […]

    Difficulty:

    Duration:

  • Транзакции в SQL и JDBC

    Представим, есть некоторая последовательность SQL запросов, которые должны последовательно выполняться. Если на определенном запросе возникнет ошибка, часто бывает, что необходимо откатить уже выполненные перед этим запросы. Такое бывает необходимо когда набор последовательных SQL запросов связаны по смыслу, то есть без выполнения одного из запросов из этого набора нет смысла вы выполнении всех остальных. Очевидно, что […]

    Difficulty:

    Duration:

  • Основы JDBC в Java

    JDBC – программный интерфейс для взаимодействия Java приложения и базы данных. То есть, грубо говоря, мы можем работать с базой данных из Java программы. В JDBC есть три основных класса для работы с базой: Пример программы: import java.sql.*; public class JDBCApp { public static void main(String[] args) throws ClassNotFoundException, SQLException { //В метод Class.forName нужно […]

    Difficulty:

    Duration:

  • Объединение таблиц в SQL с помощью JOIN

    Далее разберем слово JOIN.  У нас есть две связанные таблицы. Как видим каждый продукт связан с категорией по внешнему ключу category_id. В category_id, как мы помним, находятся ключи из таблицы с категориями и таким образом таблицы связаны. Так вот с помощью JOIN мы можем объединить эти две таблицы так чтобы в таблице с продуктами на […]

    Difficulty:

    Duration:

  • Подзапросы в SQL

    Теперь перейдем к подзапросам. Вот мы например вывели максимальное число в столбце. Оно ясное дело тоже было в какой-то строке таблицы (строка с id 7 как можно увидеть ниже). Как же нам вывести всю строку этого максимального числа (то есть мы хотим получить всю строку с id 7)? Если мы сделаем так: SELECT id,name,MAX(unit_price) FROM […]

    Difficulty:

    Duration:

  • Group By и Having в SQL

    Далее разберем ключевое слово Group by и having. С помощью Group by можно разбить значения какого-либо выбираемого из таблицы аттрибута на группы. Группы формируются так, что в каждую из них попадают строки с одинаковыми значениями указанного атрибута. То есть: На примере это будет гораздо понятнее 😉 Для примера добавим в таблицу продукты из прошлых уроков […]

    Difficulty:

    Duration:

  • Агрегатные функции в SQL

    Рассмотрим что такое агрегатные функции. Агрегатная функция может выполнить какие-либо операции над всеми значениями столбца или над группой значений этого столбца и как результат этих операций вернуть одиночное значение. Например: Можно сложить все значения числового столбца или сложить группу значений этого столбца с помощью функции SUM(), или вывести среднее арифметическое функцией AVG() или с помощью […]

    Difficulty:

    Duration:

  • DML команды в SQL

    В следующую группу команд под названием DML входят команды для манипулирования данными, а именно: Воспользуемся такими insert запросами для добавления категорий в таблицу с категориями. # INSERT INTO product_category – означает добавить # в таблицу product_category. # Далее в скобочках перечисляем аттрибуты, # в которые мы собираемся # добавить данные. В скобочках после VALUES # […]

    Difficulty:

    Duration:

  • DDL в SQL: создание и удаление таблиц

    Командой create database создадим базу данных с именем ecommerce, то есть интернет магазин. Перед прохождением раздела по SQL очень желательно пройти предыдущий раздел по базам данных чтобы всё было понятно 😉 Команды работы с БД делятся на группы. Рассмотрим группу DDL. В нее входят команды определения структуры данных в БД. Точнее говоря команды для создания […]

    Difficulty:

    Duration:

  • Основы SQL. Что такое СУБД и MySQL

    Теперь разберемся как же работать с Базой Данных. То есть как создать таблицу, добавить в нее данные, извлечь из нее данные, удалить ее и т.д. Для этого используется язык запросов к БД – SQL. Для начала нужно узнать где же хранить нашу базу данных, и через как с ней работать SQL запросами. Для этого используется […]

    Difficulty:

    Duration:

  • Связь Один-к-Одному в базах данных

    Последний вид связи – это Один-к-одному. Этот вид связи самый простой. Как понятно из названия, каждой строке одной таблицы соответствует только одна строка в другой. Почти не используется за редкими исключениями, так как очевидно, что соединение таблиц связанных таким образом в одну не приведет к дублированию данных. Но бывают случаи когда это бывает полезно. Самый […]

    Difficulty:

    Duration:

  • Связь Многие-ко-Многим в базах данных

    Далее рассмотрим тип связи Многие-ко-Многим. Например: У каждого продукта есть много покупателей и у каждого покупателя есть много купленных продуктов. Ясное дело должно быть две таблицы – Продукты и Покупатели продуктов. И как-то нужно их связать. Но для начала следует увидеть одну таблицу, в которой хранятся данные обеих только что упомянутых таблиц вместе. Очевидно, что […]

    Difficulty:

    Duration:

  • Связь Один-ко-Многим в базах данных

    Есть таблица "Продукты". У каждого продукта может быть категория, к которой он принадлежит. Например, стол и стул относятся к категории мебель, а лампа, утюг и вентилятор к категории электроприборы. Давайте же добавим в таблицу из прошлого урока аттрибут "Категория продукта". Как видим, слово Электроприбор повторяется три раза, слово мебель два раза. А что если у […]

    Difficulty:

    Duration:

  • Базы данных: основные принципы

    Что такое база данных? Думаю можно догадаться, что это хранилище, в котором хранятся данные. Наиболее удобный вариант хранения данных в БД в виде таблиц. Конкретная таблица БД хранит в себе данные какой-либо конкретной сущности. Например, есть таблица сущности 'Продукт'. В этой таблице могут храниться много разных продуктов (там например стол, стул, лампа и т.д.). Каждая […]

    Difficulty:

    Duration:

  • Управляемая сериализация в Java: Externalizable

    Externalizable – управляемая сериализация. Представим, что нужно сериализовать объект созданного нами класса расширяющий вообще сторонний класс, который не Serializable, из вообще стороннего jar, который мы скачали откуда-то из интернета. Ясное дело, поля стороннего класса не сериализуються и не десериализуються. Externalizable поможет. Благодаря нему можно силой сериализовать и десериализовать поля стороннего класса реализовав методы writeExternal (для […]

    Difficulty:

    Duration:

  • Сериализация Singleton без утраты его сути

    Cинглтон это класс, который может иметь только один экземпляр. То есть другой экземпляр этого класса невозможно создать. Если мы сериализуем этот экземпляр, а потом десериализуем, то получим уже второй экземпляр синглтона, что противоречит идее синглтона. Чтобы десериализовался тот же экземпляр нужно определить метод readResolve. Пример программы: import java.io.*; //класс синглтон class Singleton implements Serializable { […]

    Difficulty:

    Duration:

  • Контроль совместимости классов в Java с помощью SerialVersionUID

    У каждого сериализуемого класса (именно класса, не объекта класса) есть поле SerialVersionUID. Это числовой идентификатор, который меняется при каждом изменении класса. Это может быть использовано при сериализации и десериализации. Допустим у нас есть Serializable класс, объект которого мы сериализовали, а потом а потом в классе этого объекта сделали изменения, и соответственно, изменяется SerialVersionUID класса, и […]

    Difficulty:

    Duration:

  • Transient в Java

    Как уже было сказано, при сериализации все поля сериализуемого объекта должны быть тоже Serializable. Если какое-то поле сериализуемого объекта не Serializable и у нас нет доступа к нему для изменения (то есть мы не можем изменить какой-нибудь сторонний реализованный класс и добавить к нему implements Serializable), то можно просто это конкретное поле не сериализовать объявив […]

    Difficulty:

    Duration:

  • Что такое сериализация в Java

    Что такое сериализация мы уже проходили в разделе потоки ввода/вывода, но повторим, так как это основы сериализации. ObjectOutputStream – сериалиация. Для сохранения копии объекта в поток (в файл, например) для восстановления его потом (десереализации – ObjectInputStream) Пример программы: import java.io.*; import java.util.*; public class JustSerialization { public static void main(String[] args) { // сериализация try […]

    Difficulty:

    Duration:

  • Fork/Join framework в Java

    fork/join framework – для разбиения задачи на подзадачи и чтобы эти подзадачи выполнялись в отдельных потоках. Также эти подзадачи могут тоже делиться на подзадачи и опять же чтобы эти подзадачи выполнялись в отдельных потоках. Повторяться этот процесс деления может пока подзадача не станет необходимо мала. Есть пул потоков. В один из его потоков ставиться большая […]

    Difficulty:

    Duration:

  • ThreadLocal в Java: переменные потока

    ThreadLocal – переменная ПОТОКА. Это не переменная объекта потока, а именно переменная ПОТОКА. То есть она принадлежит только одному потоку и существует только в одном потоке. В примере ниже мы создаем объект потока threadDemo, который передаем на выполнение в три потока. То есть три потока будут работать с одним и тем же объектом. Если переменная […]

    Difficulty:

    Duration:

  • ReadWriteLock в Java

    ReadWriteLock – класс содержащий 2 лока: один для чтения, другой для записи. Часто бывает так, что один поток пишет в ресурс, а много других потоков читают из него. То есть один поток блокирует ресурс для записи, а другие потоки, желающие читать из ресурса, ждут пока он запишет, и после того, как записывающий закончил запись, потоки […]

    Difficulty:

    Duration:

  • ExecutorService в Java: управление пулом потоков

    Создание потока дорогостоящая операция. Поэтому можно вместо создания новых потоков переиспользовать те которые завершили свою работу. ExecutorService помогает поддерживать пул потоков, то есть поддерживает выполнение некоторого фиксированного количества потоков, которые одновременно выполняются. Также он назначает задачи этим потокам в этом пуле (в пуле всё время находятся те же самые потоки, это важно). Он также предоставляет […]

    Difficulty:

    Duration:

  • Callable в Java

    До этого мы рассматривали создание потоков с помощью Thread и Runnable. Последний вариант того как можно создать класс потока это реализовать Callable. Callable – как Runnable, только вместо run() – call(), который может возвращать значение, то есть благодаря call поток может вернуть значение. FutureTask – для взаимодействия с потоками. Он для получения результата выполнения потока […]

    Difficulty:

    Duration:

  • Корректная остановка потоков в Java с помощью Interrupt

    Чтобы резко остановить поток можно использовать метод Stop(), но резко останавливать не рекомендуется, это может быть опасно. Поэтому метод Stop предан Строжайшей Анафеме ))) и использовать его можно только в самом-самом крайнем случае, например, когда поток полностью завис и когда другого варианта его остановить нету. Используют более аккуратный способ interrupt() – этот метод не останавливает […]

    Difficulty:

    Duration:

  • CyclicBarrier в Java

    Принцып работы CyclicBarrier такой: потоки зависают друг за другом в месте вызова в них await. Когда зависло необходимое количество потоков, зависнувшие потоки развисают и запускается другой дополнительный отдельный поток в котором можно что-то сделать, например обработать данные, полученные в предыдущих потоках. В примере ниже мы создаем переменную volatile и потоки добавляют к ней 1, потом […]

    Difficulty:

    Duration:

  • Ожидание завершения потоков с помощью CountDownLatch

    CountDownLatch – нужен когда требуется чтобы какой-то поток ждал пока не выполняться какое-то количество потоков. В примере ниже мейн останавливает свою работу с помощью await и когда в потоках вызовется countDown три раза, мейн продолжает свою работу. Пример программы: import java.io.*; import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) { int sleeptime […]

    Difficulty:

    Duration:

  • ReentrantLock в Java – гибкая альтернатива synchronized

    ReentrantLock ведет себя как synchronized, но есть некоторые отличия. Мы помним, что synchronized блочит цельный кусок кода, то есть synchronized, это цельный метод, который не может быть выполняем параллельно несколькими потоками. ReentrantLock же хоть и ведет себя как synchronized, но он блочит не цельный метод как это делает synchronized, а может залочить вообще любой кусок […]

    Difficulty:

    Duration:

  • Semaphore в Java

    Обычно нужен если много потоков одновременно пытаются получить доступ к каким-то ресурсам, а нам нужно, чтобы к ним одновременно получала доступ только часть из потоков, при этом, оставшиеся потоки стояли в очереди и если какой-то поток оставил ресурс, нужно, чтобы сразу занимал его место один из стоящих в очереди. Пример программы: import java.io.*; import java.util.concurrent.Semaphore; […]

    Difficulty:

    Duration:

  • Метод yield в Java

    Когда поток вызывает метод yield он говорит: мне сейчас не обязательно заканчивать свою работу и занимать время процессора и больше времени передастся другим потокам Пример программы: class YieldExample { public static void main(String[] args) { new SomeThread().start(); new SomeThread().start(); new SomeThread().start(); } } class SomeThread extends Thread { public void run() { System.out.println(Thread.currentThread().getName() + ” […]

    Difficulty:

    Duration:

  • Синхронизация с помощью Wait/Notify в Java

    wait/notify – используется если нам нужно приостановить один поток и чтобы он ждал пока другой поток даст разрешение на продолжение выполнения остановленного потока. То есть чтобы один поток дождался формирования какой-либо информации в другом потоке чтобы потом ее использовать Пример программы: class DemoClass { synchronized void part1() { System.out.println(“Thread t1 started”); //с помощью notify даем […]

    Difficulty:

    Duration:

  • Synchronized static в Java

    synchronized static (блокировка на уровне класса), а просто synchronized (блокировка на уровне объекта). В коде ниже у нас уже будут 2 объекта ресурса одного класса. В них уже будет synchronized static блок. В отличии от synchronized, блок synchronized static распространяется на все объекты одного класса. То есть если поток дошел до synchronized static в одном […]

    Difficulty:

    Duration:

  • Синхронизация в Java с помощью Synchronized

    Если несколько параллельных потоков одновременно хотят выполнить один и тот же кусок кода одного и того же объекта, то можно сделать так чтобы они выполняли его поочереди. То есть они можно сказать выстраиваются в очередь чтобы воспользоваться куском кода в объекте. Смотри пример. Пример программы: public class SynchronizedExample { public static void main(String[] args) { […]

    Difficulty:

    Duration:

  • Метод join в Java

    Метод join останавливает поток в котором этот метод был вызван пока не закончит выполнение поток к которому этот метод был вызван. Более понятно на примере: import java.io.*; class ThreadJoining extends Thread { @Override public void run(){ for (int i = 0; i < 2; i++){ try{ Thread.sleep(500); System.out.println("Current Thread: " + Thread.currentThread().getName()); } catch(Exception e){ […]

    Difficulty:

    Duration:

  • Volatile переменная в Java

    Для создания общей глобальной переменной, которую будут использовать несколько потоков используется слово volatile. Создадим два потока. Первый будет добавлять 1 к глобальной переменной и как только он добавил 1 к глобальной переменной, во втором потоке будет происходить вывод на консоль нового значения глобальной переменной. Этот процесс будет продолжаться пока i не станет 8. Пример программы: […]

    Difficulty:

    Duration:

  • Интерфейс Runnable в Java

    Реализуя Runnable тоже реализуется метод run в котором пишется код, который будет выполняться в отдельном потоке. Пример программы: //Создадим простенький класс. //Дальше поясним зачем он. class Friend { public static void m1() { System.out.println(“Hello Friend!!!”); } } //Также можно увидеть что мы реализуем не только //Runnable но и расширяем Friend. Это преимущество //реализации Runnable перед […]

    Difficulty:

    Duration:

  • Многопоточность в Java. создание и запуск потоков с помощью Thread

    Создать нить(поток) можно тремя способами: Код класса расширяющего или реализующего что-нибудь выше перечисленное будет выполняться в отдельном потоке. Мы уже затрагивали создание потоков когда рассматривали PipedOutputStream. И мы помним, что там было два потока и код одного потока выполнялся параллельно коду другого. Поэтому суть потоков думаю понятна. Параллельное выполнение блоков кода друг другу. Расширение Thread […]

    Difficulty:

    Duration:

  • FilterStream в Java

    FilterInputStream, FilterOutputStream – абстрактные классы для создания собственных потоков или добавления функционала к существующим. В примере ниже создается класс расширяющий FilterInputStream, в котором мы реализуем свой поток байтового ввода. Этот созданный нами поток изменяет консольный байтовый ввод System.in так, чтобы он возвращал номер в таблице ASCII введенного пользователем в консоль символа, но сдвинутого на 13 […]

    Difficulty:

    Duration:

  • ObjectStream в Java

    ObjectInputStream, ObjectOutputStream – для сериалиации/десериализации. Для сохранения копии объекта в поток (в файл, например) для восстановления его потом (десереализации). Пример программы: import java.io.*; import java.util.*; class ObjectStreamLesson{ public static void main(String[] args) { // сериализация try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“person.dat”))) { Person p = new Person(“Mike”, 25, 178, false); // сериализуем объект p в […]

    Difficulty:

    Duration:

  • OutputStreamWriter в Java

    OutputStreamWriter – мост между символьными и байтовыми потоками. Пример программы: import java.io.*; import java.util.*; class OutputStreamWriterLesson { public static void main(String[] args) { try { FileOutputStream outputStream = new FileOutputStream(“person.txt”); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); // OutputStreamWriter конвертирует записываемые в него // символы в байты и эти байты записываются в файл байтовым // потоком, который […]

    Difficulty:

    Duration:

  • PushbackInputStream в Java

    PushbackInputStream – прочитав несколько байтов входного потока с помощью inpsrream.read() бывает необходимо вернуться и прочитать эти же уже прочитанные ранее байты еще раз. Делается с помощью inpsrteam.unread(). Пример программы: import java.io.*; import java.util.*; class PushbackStream { public static void main(String[] args) { try { String str = “Hello world!!!”; byte b[] = str.getBytes(); ByteArrayInputStream bin […]

    Difficulty:

    Duration:

  • PipedStream в Java: передача данных между потоками

    PipedInputStream, PipedOutputStream – применяется в многопоточной среде. Потоки в слове многопоточной, это не те потоки, которые мы сейчас изучаем (сейчас мы изучаем потоки ввода вывода). Эти же потоки понимайте как куски кода, которые выполняются параллельно. То есть в одном потоке один кусок кода, в другом другой и т.д, но главное все они выполняются параллельно друг […]

    Difficulty:

    Duration:

  • SequenceInputStream в Java

    SequenceInputStream – сливает потоки в один поток. Он считывает от первого byte до последнего byte первого InputStream, затем делает то же самое со следующим InputStream и т.д. до последнего InputStream и объединяет их всех в один InputStream. Допустим, есть два файла person1 и person2 по пути C:/HTML/somedata/: Теперь давайте объединим два файловых потока, которые читают […]

    Difficulty:

    Duration:

  • StringReader и StringWriter в Java

    StringReader, StringWriter – потоки, которые хранят строку в себе с которой мы работаем через эти потоки как с любыми другими источниками дынных (фалами например). Как раньше например мы записывали или выводили из консоли теперь будем записывать в строку или выводить из строки. ByteArrayInputStream, ByteArrayOutputStream – аналог только работаем с массивом байтов вместо строки. Пример программы: […]

    Difficulty:

    Duration:

  • BufferedStream в Java

    BufferedInputStream, BufferedOutputStream – чтение байтового потока и запись в байтовый поток с добавлением буфера для улучшения производительности. Это класс обертка для InputStream с буферизацией. Благодаря буферизации потоки, которые переданы в конструктор BufferedInputStream будут читать данные из буфера маленькими порциями, а буфер, чтобы сэкономить время и силы, читает их из потока источника большими порциями. Пример программы: […]

    Difficulty:

    Duration:

  • DataStream в Java

    DataInputStream DataOutputStream – чтение байтового потока и запись в байтовый поток в формате примитивных типов данных. Пример программы: import java.io.*; import java.util.*; class DataStreamLesson{ public static void main(String[] args) { try { FileOutputStream fileOutputStream = new FileOutputStream(“double.txt”); FileInputStream fileInputStream = new FileInputStream(“double.txt”); // В данном примере файловый ввод/вывод. // Запись в формате примитивных типов // […]

    Difficulty:

    Duration:

  • FileStream в Java: чтение и запись файлов

    FileOutputStream, FileInputStream – для чтения файла и записи в файл. В конструкторе должен быть указываем путь к файлу с которым будем совершать ввод/вывод. Пример программы: import java.io.*; import java.util.*; class FileStreamLesson { public static void main(String[] args) { try { // FileOutputStream – для записи в файл. В конструктор // FileOutputStream передаем в виде строки […]

    Difficulty:

    Duration:

  • Потоки ввода/вывода в Java. PrintWriter и PrintStream

    Часто так бывает, что нам нужно ввести куда-то информацию и откуда-то ее вывести. Например, извлечь что-нибудь из файла или записать туда что-либо. При этом логично, что разные источники (будь-то файл или консоль или что-либо еще) с которыми мы совершаем ввод/вывод различны по своему устройству, соответственно и средства для взаимодействия с этими разными источниками должны быть […]

    Difficulty:

    Duration:

  • Интерфейс Set в Java

    Благодаря классам реализующим Set можно создать массив в котором элементы не повторяются. HashSet это как hashmap, только без значений, только ключи. В hashset могут храниться только уникальные ключи, благодаря уже ранее упомянутому hashcode, который есть у каждого элемента добавляемого в hashset. Поясним на примере: import java.util.*; public class Set { public static void main(String[] args) […]

    Difficulty:

    Duration:

  • Интерфейс Map в Java

    Благодаря классам реализующим Map можно создать массив из пар ключ-значение. То есть один элемент этого массива это пара. Пример программы: import java.util.*; public class Map { public static void main(String[] args) { //создаем коллекцию HashMap< Integer, String > hMap = new HashMap< Integer, String >(); //добавление элемента //видим числовой ключ и соответствующее ему значение hMap.put(34, […]

    Difficulty:

    Duration:

  • Интерфейс Queue в Java

    Благодаря классам реализующим Queue можно создавать массивы реализующие очередь. Что такое очередь? Очередь работает по принципу FIFO – first in first out (первый пришел – первым ушел). Представьте массив в который элементы можно добавлять только по очереди в конец, то есть после самого последнего элемента массива который был туда добавлен, а удалять элементы можно только […]

    Difficulty:

    Duration:

  • Iterator в коллекциях Java

    Благодаря Iterator можно перебирать любую коллекцию не вникая в особенности какой-либо из них. Пример программы: import java.util.*; @SuppressWarnings(“unchecked”) public class IteratorExample { public static void main(String[] args) { ArrayList aList = new ArrayList(); aList.add(“Sunday”); // добавление элемента aList.add(“Monday”); aList.add(“Tuesday”); // Доступ к каждому элементу через iterator Iterator ir = aList.iterator(); while (ir.hasNext()) { System.out.println(ir.next()); } […]

    Difficulty:

    Duration:

  • Коллекции в Java. Интерфейс List

    Что же такое коллекция? Это можно сказать такой особый тип массива. Мы знаем, что у обычного Java массива есть строгая граница количества элементов, которые могут в нем быть (эту границу мы задаем при инициализации вот так – int [] a = new int[5]). Это называется статический массив. Но часто может пригодиться динамический массив, то есть […]

    Difficulty:

    Duration:

  • Метод hashCode в Java. Его переопределение

    Внимание! Перед прохождением данного урока сначала необходимо пройти следующий раздел, а потом обязательно возвращайтесь сюда, данный урок довольно важен. Если у любого объекта вызвать метод hashCode, то его реализация по умолчанию вернет нам число. Это случайное уникальное число, которое генерируется этим методом по умолчанию. Переопределять его нужно если мы собираемся запихивать в HashSet или HashMap […]

    Difficulty:

    Duration:

  • Метод Equals в Java. Его переопределение

    Следующий метод Object – это equals. Возвращает boolean значение. equals по умолчанию проверяет только то, ссылаются ли две ссылки на один и тот же объект. Если нам нужно проверить не только это, а является ли содержимое одного объекта одинаковым с другим объектом, то его нужно переопределять. Переопределение Equals Пример программы:     mport java.util.*; class […]

    Difficulty:

    Duration:

  • Метод Clone в Java. Его переопределение

    Второй метод Object это метод clone, который клонирует объект. Происходит копирование всех полей клонируемого объекта в новый объект-клон. Но по умолчанию методом clone в новый объект копируются только примитивные поля объекта, а ссылочные нет, поэтому clone тоже нужно переопределять. В Java управление объектами осуществляется с помощью ссылочных переменных, и нет оператора для фактического копирования объекта, […]

    Difficulty:

    Duration:

  • Класс Object в Java. Метод toString и его переопределение

    Все классы в Java наследуют от некого класса Object. В этом классе определены некоторые важные методы, которые необходимо знать и самое главное уметь переопределять их. Все классы как уже было сказано наследуют от Object, а значит они наследуют и все методы, которые определены в нем, а значит наследники могут ими пользоваться и переопределять их. Рассмотрим […]

    Difficulty:

    Duration:

  • Работа с элементами файловой системы в Java. Класс File

    File – класс для работы с элементами файловой системы. С помощью различных методов этого класса можно получить информацию о переданном в конструктор объекта этого класса элементе файловой системы. Например: Пример программы: import java.io.*; import java.util.*; class FileExample { public static void main(String[] args) { // Для примера выведем полный путь к файлу person.txt // в […]

    Difficulty:

    Duration:

  • Java Stream API

    Stream – для работы с коллекциями. Избавляет от необходимости вручную реализовывать операции над коллекциями. Проще говоря пишем запрос к коллекции как к базе данных без ничего лишнего. То есть например мы можем запросить из коллекции только четные числа простым запросом в формате цепочки соответствующих функций класса Stream. Также позволяет производить операции над элементами коллекции в […]

    Difficulty:

    Duration:

  • Лямбда выражения в Java

    Что же такое лямбда выражения? Всё просто. Это просто сокращенная форма реализации функц. интерфейса с помощью анонимного класса. Реализовывать абстрактный метод функционального интерфейса с помощью анонимного класса не очень лаконично. Поэтому лучше использовать лямбда выражения. Пример программы: import java.util.*; interface Adder{ public double pow(double a, double b); } class Lambda{ public static double func(Adder a){ […]

    Difficulty:

    Duration:

  • Функциональные интерфейсы в Java

    В прошлом уроке мы видели интерфейс с одним единственным абстрактным методом. Такой интерфейс называется функциональным. Функциональный интерфейс – представляет одну абстрактную функцию, которая существует для ее переопределения анонимными классами или лямбда выражениями (позже разберем что это). Открывает функциональное программирование. То есть функция используется как объект (ее можно хранить как объект, передать как объект аргументом в […]

    Difficulty:

    Duration:

  • Анонимные классы в Java

    Анонимный класс – одноразовая реализация интерфейса без создания полноценного класса. То есть нам не нужно создавать много объектов, будет только один с данной реализацией. Пример программы: import java.util.*; interface Adder{ public double pow(double a, double b); } class AnonimousClass{ public static void main(String[] args) { // Как видим, мы передаем в метод println // объект […]

    Difficulty:

    Duration:

  • Default методы в интерфейсах

    В java 8 всё же появилась возможность добавлять реализации методов в интерфейс. Нужно в основном для того чтобы у классов реализующих интерфейс не было слишком много одинаковых реализаций абстрактных методов интерфейса. До java 8 приходилось делать так: import java.util.*; interface Car { public void gas(); public void brake(); } class Sedan implements Car { @Override […]

    Difficulty:

    Duration:

  • Ключевое слово Assert в Java

    Ключевое слово assert используется для проверки какого-либо условия в ходе разработки. Программа выдает исключение, то есть происходит ошибка если выражение в условии после ключевого слова assert возвращает false. В итоговом коде не присутствует, так как используется для простого тестирования условий. Запускается с ключом -ea. Поясним на примере: import java.io.*; public class Assert { public static […]

    Difficulty:

    Duration:

  • Классы обертки в Java

    Есть специальные классы обертки – Integer, Char, Float. Они также как и простые типы значений хранят в себе одно простое значение: Integer – целое число, Char – один символ и т.д. Зачем же они нужны? Обычные типы значений не могут иметь значение null, то есть пустота. Обертки же могут. Также они нужны чтобы указывать тип […]

    Difficulty:

    Duration:

  • Типы строк в Java

    Для хранения строки мы знаем тип String. Но он не всегда бывает эффективен. Поэтому есть еще другие классы для хранения строк и взаимодействия с ними, которые нужно знать. Поясним на примере: public class StringTypes { public static void main(String[] args) { // Создадим String переменную String output = “Some text”; // и добавим в конец […]

    Difficulty:

    Duration:

  • Приведение типов в Java

    Часто бывает нужно изменить тип переменной. То есть, например, была создана переменная типа int, и нам в какой-то момент стало необходимо изменить ее тип на byte. Это можно делать с помощью приведения типов.             Правила такие: По стрелке – автоматическое преобразование. Против стрелки – используя (). Ниже приведен пример с […]

    Difficulty:

    Duration:

  • Generics в Java

    Если мы хотим сделать класс более гибким в плане типов, которые в нем используются, то можно воспользоваться обобщениями (generics). Класс в примере ниже является обобщенным, так как в нем используется универсальный параметр с именем T. Имя, кстати, не обязательно должно быть именно символом T, а может быть вообще любой символ или набор символов, какой мы […]

    Difficulty:

    Duration:

  • Обработка исключений в Java

    Если при работе Java приложения возникает ошибка(исключение) и обработка данной ошибки не предусмотрена в программе этого приложения, то приложение ОСТАНОВИТ свою работу и программисту, который запустил это приложение или пользователю, который использовал это приложение демонстрируется в виде большого и страшного StackTrace, которое поясняет что же с приложением случилось и какая ошибка произошла. Такой StackTrace мы […]

    Difficulty:

    Duration:

  • Аннотации в Java

    Что такое аннотация в Java? Представьте себе склад с коробками. На каждой из коробок есть надпись, которая говорит тому кто будет отгружать эти коробки из склада куда эту коробку отгружать. Так вот, по этой аналогии коробка это класс или переменная или метод, а аннотация это эта надпись, а тот кто отгружает коробку и смотрит на […]

    Difficulty:

    Duration:

  • Передача в метод ссылочных типов и типов значений

    Рассмотрим передачу ссылочного типа в метод и передачу типа значения в метод. Для начала передадим в метод тип значения. public class LinkValInMethodExample { // Определим метод, в который передается числовой параметр, // к которому будет прибавляться единица. static void doStuff(int y) { y = y + 1; } public static void main(String[] args) { // […]

    Difficulty:

    Duration:

  • Ссылочные типы и типы значений в Java

    В Java есть два типа данных – ссылочные типы и типы значений. int, char ,float и т.д это типы значений. Это простые типы. Это просто число либо символ, либо дробное число и т.д.  Это не классы (ссылочные типы), которые могут состоять из многих полей типов значений: public class SomeClass { int num; char letter; float […]

    Difficulty:

    Duration:

  • Статические классы в Java

    Статический класс это всегда внутренний класс. Статического не внутреннего класса не бывает. Обычный внутренний класс и статический внутренний класс часто сравнивают. Главное отличие статического от обычного внутреннего в том что не нужно создавать экземпляр внешнего класса для обращения к его элементам, но обращаться внутренний статический класс может только к статическим элементам внешнего класса. То есть […]

    Difficulty:

    Duration:

  • Внутренние классы в Java

    Внутренний класс – класс внутри другого класса. Некоторая доп. функциональность, которая относиться только к внешнему классу. Класс внутри другого класса имеет смысл создавать когда внутренний и внешний класс имеют сильную смысловую связь. Допустим, мы создаём класс Car (машина), и нам нужно описать двигатель этой машины. Логично, что двигатель тесно связан с машиной и не имеет […]

    Difficulty:

    Duration:

  • Статические поля в Java

    Допустим у нас есть класс и мы хотим чтобы какие-то поля или методы этого класса принадлежали одновременно всем объектам этого класса. Такие поля и методы можно создать и они называются статическими. Объявляются с помощью ключевого слова static. Поясним на примере: import java.io.*; public class StaticVarAndMethod { //статическая переменная static int staticVar; //обычная переменная int NotStatic; […]

    Difficulty:

    Duration:

  • Интерфейсы в Java

    Интерфейс – определяет поведение классов. В нем могут быть только поля и абстрактные методы (методы без реализаций, как мы помним). Интерфейс создается с использованием ключевого слова interface. Класс может реализовать интерфейс используя ключевое слово implements. Также класс реализующий интерфейс обязан реализовать все его абстрактные методы.         В интерфейсе не может  быть не […]

    Difficulty:

    Duration:

  • Абстрактный класс в Java

    Абстрактный класс – общий концепт чего-либо. Это класс, который содержит в себе нереализованные методы (называются абстрактными методами), которые наследники должны реализовать. Под ‘нереализованные’ имеется ввиду, что такие методы только объявляются в абстрактном классе, то есть у них нет тела, то есть кода внутри {}. Абстрактные методы помечаются ключевым словом abstract. Приведем пример абстрактного класса. Например […]

    Difficulty:

    Duration:

  • Полиморфизм в Java

    Что же такое полиморфизм? Это способность использовать одно и тоже имя для разных задач. Поясним на примере: class Animal { private String eats; private int noOfLegs; //То есть например у нас может быть //несколько конструкторов с одним и тем же именем. //конструктор без параметров //(конструктор по умолчанию называется) public Animal(){} //конструктор с одним параметром //задает […]

    Difficulty:

    Duration:

  • Наследование в Java

    Благодаря наследованию один класс может иметь доступ к полям другого класса. Но эти классы должны быть логически связаны и связанность между ними должна идти от общего к частному. Например, ниже в этом уроке создается класс Животное. После этого создаеться класс кот который может наследовать класс животное, так как кот является животным. При наследовании класса Животное, […]

    Difficulty:

    Duration:

  • Свойства в ООП (getters, setters)

    Поля любого класса не должны быть доступны напрямую, они всегда должны быть private, а доступ к ним должен обеспечиваться с помощью специальных методов – геттеров и сеттеров. геттер – это public метод через который мы получаем значение private поля. сеттер – это public метод через который мы задаем значение private полю. То есть мы работаем […]

    Difficulty:

    Duration:

  • Модификаторы доступа в Java

    В продолжение темы инкапсуляции необходимо знать о модификаторах доступа public, private и protected. С помощью этих модификаторов мы можем ограничить доступ некоторым элементам класса. Например, у кота в классе в предыдущих уроках перед String name и String color ничего написано больше не было и поэтому, по умолчанию, они на самом деле помечены модификатором public. Благодаря […]

    Difficulty:

    Duration:

  • Инкапсуляция в Java

    ООП стоит на трех столпах – Инкапсуляция, Полиморфизм, Наследование. Начнем с первого. Инкапсуляция – это сокрытие деталей реализации класса от того, кто создает объект этого класса и пользуется им. То есть тому, кто создал объект класса и пользуется им, не обязательно знать как объект реализован внутри, он может просто пользоваться полями и методами объекта даже […]

    Difficulty:

    Duration:

  • Конструктор класса в Java

    У класса может быть специальный метод без возвращаемого значения и который имеет то же самое имя, что и класс. Этот метод называется конструктором. Он нужен чтобы при создании объекта класса можно было выполнить какие-то действия, например сразу при создании объекта присвоить его полям значения. class Cat{ String name; String color; // Снизу пример конструктора. // […]

    Difficulty:

    Duration:

  • Что такое ООП? Класс, объект

    Что такое ООП (Объектно-ориентированное программирование)? Это способ построения программных продуктов. Такие программные продукты состоят из объектов и вся работа такого программного продукта построена на взаимодействии этих объектов. Что же такое объект в этом продукте? Да всё, что угодно. Например, какой-либо элемент интерфейса – то есть, например, объект панели с кнопками. Если, например, этот программный продукт […]

    Difficulty:

    Duration:

  • Область видимости в Java

    Немного об области видимости. class Test { static int averageOf3Nums(int a, int b, int c) { int sum = a + b + c; int resultAverage = sum / 3; return resultAverage; } public static void main(String[] args) { String b = “Some text info!”; String c = “Some text info!”; if (b.equals(c)) { String […]

    Difficulty:

    Duration:

  • Функции в Java

    Рассмотрим функции (также называют методами). До этого мы уже употребляли некоторые функции например println() для вывода строки в консоль, replace для замены символов в строке и т.д. Очевидно, что функция это что-то, что выполняет какое-то действие с чем-то. Также очевидно, что все процессы, которые выполняют это действие (то есть код, который реализует эти процессы, которые […]

    Difficulty:

    Duration:

  • Строки в Java

    Мы уже видели строку когда передавали что-либо внутри кавычек "" в функцию вывода на консоль – System.out.println(“строка”). До этого строки мы называли текстом. Но правильно называть это строкой. Строка это набор любых одиночных символов, например 'g', '2', '-', обьединенных вместе. Мы проходили тип данных Char, который хранит в себе символ. Строка состоит из элементов типа […]

    Difficulty:

    Duration:

  • Массивы в Java

    Рассмотрим массивы. В прошлых уроках у нас была переменная int a=31; хранящая одно число 31. А что если мы хотим иметь переменную в которой будет храниться 100 разных числовых значений? Такая переменная называется массивом. Объявляется массив так: int[] a; [] значат, что это массив и в нем будет храниться много значений (значений типа int в […]

    Difficulty:

    Duration:

  • Ключевые слова break, continue

    Далее рассмотрим ключевые слова break и continue. Если нужно раньше времени остановить цикл по какому-то условию, то используется ключевое слово break. Поясним на примере. class Test { public static void main(String []args) { int a=31; for(int i=0;i

    Difficulty:

    Duration:

  • Циклы в Java

    Рассмотрим циклы. Цикл нужен чтобы повторять какое-о действие или набор действий какое-то количество раз. Есть три вида циклов for, while и do..while. Начнем с while. Поясним на примере. class Test { public static void main(String []args) { int A=31, B=15; //while с английского это ПОКА. //ПОКА содержимое А не равно содержимому В будет перевыполняться //код […]

    Difficulty:

    Duration:

  • Условные операторы в Java

    Итак, как же эти выражения с операторами, которые мы изучили можно использовать? Например, в операторе сравнения if...else. Им можно проверить возвращает ли какое-либо выражение true и если возвращает, то выполнить какие-то операции. Поясним на примере. class Test { public static void main(String []args) { int a=31, b=15; //if это на русском ЕСЛИ. //Если проговорить код […]

    Difficulty:

    Duration:

  • Логические операторы в Java

    Рассмотрим логические операторы. Их три – “И”, “ИЛИ” и “НЕ”. В Java воспользоваться оператором “И” можно используя символы "&&", оператором “ИЛИ” используя "||" и оператором “НЕ” используя "!". Обычно они вставляются между двумя выражениями с оператором сравнения. Например, 6<3 && 2<4. Опять проговорим это выражение у себя в голове – “6 меньше чем 3 И […]

    Difficulty:

    Duration:

  • Операторы сравнения в Java

    Рассмотрим операторы сравнения. Если кто-то гадал зачем нужен тип boolean, то сейчас узнает. Операторы сравнения нужны, как можно догадаться, чтобы сравнивать. Сравнивать одно значение с другим. Например, 6 < 3. Это оператор “меньше чем”. То есть если проговорить это выражение, то будет “шесть меньше чем три”. Вы скажете – это же не правда, шесть же больше […]

    Difficulty:

    Duration:

  • Арифметические операторы и операторы присвоения в Java

    Рассмотрим операторы. Есть пять типов операторов: операторы присвоения, арифметические операторы, операторы сравнения, логические операторы и условные операторы. С одним оператором присвоения мы уже познакомились – это знак равенства. int А = 5; Как можно догадаться, операторы присвоения нужны для присвоения чего-то чему-то. Присвоение пятерки переменной А в данном случае. Остальные операторы присвоения рассмотрим после арифметических. […]

    Difficulty:

    Duration:

  • Комментарии в Java

    Рассмотрим комментарии. Комментарии никак не влияют на ход выполнения программы, они лишь нужны чтобы, как можно догадаться, комментировать код. Однострочный комментарий пишется используя двойной слеш – //. Как можно догадаться из названия, это комментарий в одну строчку кода. В примере ниже у нас два однострочных комментария. import java.util.Scanner; class Test { public static void main(String []args) { […]

    Difficulty:

    Duration:

  • Ввод в консоль в Java

    Выводить значения на консоль мы уже научились, теперь рассмотрим ввод значения в программу через консоль с клавиатуры. Введенное в программу значение может быть использовано в этой программе. Для ввода значения в программу используется класс Scanner. Класс этот находиться в java библиотеке util и чтобы его использовать в программе, его нужно импортировать в программу вот так: import java.util.Scanner […]

    Difficulty:

    Duration:

  • Переменные в Java

    Что такое переменная? Переменная — это как коробка с этикеткой. Этикетка — это имя переменной, а внутри коробки — то, что ты положил: число, текст, любой другой тип данных. Ты можешь заглянуть внутрь коробки, заменить содержимое или использовать его в расчётах. Если более технически то переменная — это именованная область памяти, где хранятся данные определённого […]

    Difficulty:

    Duration:

  • Первая Java программа

    Давайте создадим и запустим первую Java программу. В результате выполнения действий приведенных в прошлом уроке все библиотеки Java доступны на нашем компьютере и мы можем использовать их чтобы писать Java код и компилировать его. Код на Java размещается в файлах с расширением .java. Например, создадим файл HelloWorld.java Зайдем в этот файл и добавим в него нашу […]

    Difficulty:

    Duration:

  • Установка Java

    Для начала немного о разных Java пакетах, их два: JRE – для запуска java программ. Состоит из Java машины и библиотеки java классов. Компилятора нет. То есть этот пакет только для запуска java программ JDK – для разработки java программ. Состоит из Java машины, библиотек java классов, компилятора(javac) и других утилит разработчика. Ясное дело, нам нужен второй […]

    Difficulty:

    Duration:

  • Чем Java так особенна? Java машина.

    Девиз Java таков “Написано однажды работает везде” Начнем из далека. Раньше программы для выполнения компьютером писались в формате машинных кодов. Писать эти программы было очень сложно, так как эти программы были скорее больше понятны для машины, а не для человека. И тогда люди придумали высокоуровневые языки программирования типа Java, которые существенно упрощали программисту написание программы […]

    Difficulty:

    Duration:

  • О языке Java

    Что такое Java, где она используется и стоит ли её изучать? Java — это строго типизированный язык программирования общего назначения. Почему он строго типизированный мы узнаем позже, а то, что он общего назначения означает, что в принципе на нем можно писать всё что угодно. Но ясное дело всегда есть сферы в которых тот или иной […]

    Difficulty:

    Duration:

4. Lesson Taxonomy

✅ Taxonomy "lesson_category" is registered.
WP_Taxonomy Object
(
    [name] => lesson_category
    [label] => Lesson Categories
    [labels] => stdClass Object
        (
            [name] => Lesson Categories
            [singular_name] => Lesson Category
            [search_items] => Search Lesson Categories
            [popular_items] => 
            [all_items] => All Lesson Categories
            [parent_item] => Parent Lesson Category
            [parent_item_colon] => Parent Lesson Category:
            [name_field_description] => The name is how it appears on your site.
            [slug_field_description] => The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.
            [parent_field_description] => Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.
            [desc_field_description] => The description is not prominent by default; however, some themes may show it.
            [edit_item] => Edit Lesson Category
            [view_item] => View Category
            [update_item] => Update Lesson Category
            [add_new_item] => Add New Lesson Category
            [new_item_name] => New Lesson Category Name
            [separate_items_with_commas] => 
            [add_or_remove_items] => 
            [choose_from_most_used] => 
            [not_found] => No categories found.
            [no_terms] => No categories
            [filter_by_item] => Filter by category
            [items_list_navigation] => Categories list navigation
            [items_list] => Categories list
            [most_used] => Most Used
            [back_to_items] => ← Go to Categories
            [item_link] => Category Link
            [item_link_description] => A link to a category.
            [menu_name] => Lesson Categories
            [name_admin_bar] => Lesson Category
            [archives] => All Lesson Categories
            [template_name] => Lesson Category Archives
        )

    [description] => 
    [public] => 1
    [publicly_queryable] => 1
    [hierarchical] => 1
    [show_ui] => 1
    [show_in_menu] => 1
    [show_in_nav_menus] => 1
    [show_tagcloud] => 1
    [show_in_quick_edit] => 1
    [show_admin_column] => 1
    [meta_box_cb] => post_categories_meta_box
    [meta_box_sanitize_cb] => taxonomy_meta_box_sanitize_cb_checkboxes
    [object_type] => Array
        (
            [0] => java_lesson
        )

    [cap] => stdClass Object
        (
            [manage_terms] => manage_categories
            [edit_terms] => manage_categories
            [delete_terms] => manage_categories
            [assign_terms] => edit_posts
        )

    [rewrite] => Array
        (
            [with_front] => 1
            [hierarchical] => 
            [ep_mask] => 0
            [slug] => lesson-category
        )

    [query_var] => lesson_category
    [update_count_callback] => 
    [show_in_rest] => 1
    [rest_base] => 
    [rest_namespace] => wp/v2
    [rest_controller_class] => 
    [rest_controller] => 
    [default_term] => 
    [sort] => 
    [args] => 
    [_builtin] => 
)