Java написать программу которая состоит из двух классов один из них ball
Можно ли в одном Java-файле содержать несколько классов и интерфейсов к ним ? Как лучше организовать их структуру, если нужно их все (к примеру, 4 класса и интерфейса) использовать ?
33.7k 15 15 золотых знаков 61 61 серебряный знак 91 91 бронзовый знак 432 4 4 золотых знака 16 16 серебряных знаков 38 38 бронзовых знаков Я работаю с Eclipse, и он создает новый класс в своем джава-файлике. а является ли хорошим тоном определять в одном файле несколько классов?Только имейте в виду, что классы TestClass и TestInterface будут package-private, т.е. будут видимы только в рамках пакета.
Однако, всё же не следует злоупотреблять этими возможностями. Используйте их с осторожностью и по возможностью выносите классы в отдельные файлы.
19.9k 1 1 золотой знак 29 29 серебряных знаков 37 37 бронзовых знаков To @AleXpi Плюсуйте, кликая в иконку "большой палец вверх".Да можно, но не стоит.
- Почему НЕ стоит пихать интерфейс в тот же файл - потому что интерфейс сам по себе подразумевает, что его будут использовать другие люди, иначе толку от него?!
- Почему НЕ стоит пихать классы в тот же файл - потому что люди не будут знать, как найти этот класс (это только в университетах код пишет и фиксит 1 человек).
- Почему стоит пихать классы в тот же файл - если вы посмотрите в исходный код Жава, то вы найдете много примеров, когда абстрактный класс обьявлен как public, и в этом же файле лежит его дефолтная реализация. Нет смысла выносить этот класс в отдельный файл т.к. не предусмотрено, что кто-то будет им пользоватся, он нужен только этому паблик классу.
Стоит все же заметить, что обычно эти классы являются нестед классами по отношению к классу обьявленому как public.
cy6erGn0m написал абсолютно все) Остается только добавить, что лучше в один файл несколько классов не лепить. Это снижает читабельность кода, а после компиляции в байт-код Вы все равно получите три файла MainClass.class, MainClass$TestClass.class, MainClass$TestInterface.class.
1,746 12 12 серебряных знаков 22 22 бронзовых знакаЛабораторные работы по ООП за 3 семестр 2019.
Лабораторные работы выполнены в соответствии с выданным вариантом, за исключением работы номер 8 - она выполнялась вся.
Лабораторная работа 1
Тема: "ЦИКЛЫ, УСЛОВИЯ, ПЕРЕМЕННЫЕ И МАССИВЫ В JAVA".
Задание:
Сгенерировать массив целых чисел случайным образом, вывести его на экран, отсортировать его, и снова вывести на экран.
Решение представлено в репозитории, папка "lab1".
Лабораторная работа 2
Тема: "ООП В JAVA. ПОНЯТИЕ КЛАССА".
Задание:
Создать класс, описывающий книгу (Book). В классе должны быть описаны нужные свойства книги(автор, название, год написания и т. д.)и методы для получения, изменения этих свойств. Протестировать работу класса в классе BookTest, содержащим метод статический main(String[] args).
Решение представлено в репозитории, папка "lab2".
Лабораторная работа 3
Тема: "НАСЛЕДОВАНИЕ В JAVA".
Задание:
Создать абстрактный класс, описывающий мебель. С помощью наследования реализовать различные виды мебели. Также создать класс FurnitureShop, моделирующий магазин мебели. Протестировать работу классов.
Решение представлено в репозитории, папка "lab3".
Лабораторная работа 4
Тема: "ИНТЕРФЕЙСЫ В JAVA".
Задание:
Реализовать интерфейс Priceable, имеющий метод getPrice(), возвращающий некоторую цену для объекта. Проверить работу для различных классов, сущности которых могут иметь цену.
Решение представлено в репозитории, папка "lab4".
Лабораторная работа 5
Тема: "СОЗДАНИЕ ПРОГРАМ С ГРАФИЧЕСКИМ ИНТЕРФЕЙСОМ ПОЛЬЗОВАТЕЛЯ НА JAVA".
Задание:
Создать окно, реализовать анимацию, с помощью картинки, состоящей из нескольких кадров.
Решение представлено в репозитории, папка "lab5".
Примечание: В качестве анимации используется набор из пяти картинок, образующих слайд-шоу. Эффект анимации достигается увеличением количества картинок и скорости их изменения, однако, посколько лабораторная работа ставит целью работу с графическим интерфейсом в JAVA, а не обучение работе в Adobe Photoshop, считаю такую реализацию достаточной.
Лабораторная работа 6
Тема: "ОБРАБОТКА СОБЫТИЙ В JAVA ПРОГРАММАХ С ГРАФИЧЕСКИМ ИНТЕРФЕЙСОМ ПОЛЬЗОВАТЕЛЯ".
Задание:
Реализация программу на Java с JTextArea и двумя меню:
Цвет: который имеет возможность выбора из три возможных : синий, красный и черный
Шрифт: тривида: “Times New Roman”, “MS Sans Serif”, “Courier New”.Вы должны написать прогамму, которая с помощью меню, может изменять шрифт и цвет текста, написанного в JTextArea
Решение представлено в репозитории, папка "lab6".
Лабораторная работа 7
Тема: "КОЛЛЕКЦИИ, ОЧЕРЕДИ, СПИСКИ В JAVA".
Задание:
Создать свою коллекцию, такую же как и ArrayList.
Решение представлено в репозитории, папка "lab7".
Лабораторная работа 8
Тема: "РАБОТА С ФАЙЛАМИ".
Задание:
- Реализовать запись в файл введённой с клавиатуры информации
- Реализовать вывод информации из файла на экран
- Заменить информацию в файле на информацию, введённую с клавиатуры
- Добавить в конец исходного файла текст, введённый с клавиатуры
Решение представлено в репозитории, папка "lab8".
Лабораторная работа 9
Тема: "Исключения".
Задание: Много.
Решения представлены в репозитории, папка "lab9".
Лабораторная работа 10
Тема: "РАБОТА С ДЖЕНЕРИКАМИ. СТИРАНИЕ ТИПОВ".
Задание:
- Написать метод для конвертации массива строк/чисел в список.
- Написать класс, который умеет хранить в себе массив любых типов данных (int, long etc.).
- Реализовать метод, который возвращает любой элемент массива по индексу.
- Написать функцию, которая сохранит содержимое каталога в список и выведет первые 5 элементов на экран.
- *Реализуйте вспомогательные методы в классе Solution, которые должны создавать соответствующую коллекцию и помещать туда переданные объекты. Методы newArrayList, newHashSet параметризируйте общим типом T. Метод newHashMap параметризируйте парой <K, V>, то есть типами К- ключ и V-значение. Аргументы метода newHashMap должны принимать
Решения представлены в репозитории, папка "Lab10".
Примечание: решение задания 2 аналогично лабораторной номер 7 (Описание | Код)
Лабораторная работа 12
Тема: "ОБРАБОТКА СТРОК. ИСПОЛЬЗОВАНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ В JAVA-ПРИЛОЖЕНИЯХ".
Задание:
- Необходимо реализовать консольное приложение, позволяющее манипулировать строкой, разбив ее на элементы путем использования регулярных выражений.
- Написать регулярное выражение, определяющее является ли данная строка строкой "abcdefghijklmnopqrstuv18340" или нет.
- Дан текст со списками цен. Извлечь из него цены в USD, RUВ, EU.
- Дан текст, необходимо проверить есть ли в тексте цифры, за которыми не стоит знак «+».
- Написать регулярное выражение, определяющее является ли данная строчка датой в формате dd/mm/yyyy. Начиная с 1900 года до 9999 года.
- Написать регулярное выражение, определяющее является ли данная строчка допустимым (корректным) е-mail адресом согласно RFC под номером 2822.
- Проверить, надежно ли составлен пароль. Пароль считается надежным, если он состоит из 8 или более символов. Где символом может быть цифр, английская буква, и знак подчеркивания. Пароль должен содержать хотя бы одну заглавную букву, одну маленькую букву и одну цифру.
Решения представлены в репозитории, папка "Lab12".
Практические работы выполнены полностью, за исключением работы №5. В ней требуется выполнить от трёх до пяти (выполнено - 5) заданий из представленного списка.
Если в работе требовалось выполнить более одного задания (и задания не были напрямую связаны между собой), реализация каждого задания помещена в отдельный пакет (package) в составе проекта соответствующей работы.
Практическая работа 1
Тема: "КЛАССЫ, КАК НОВЫЕ ТИПЫ ДАННЫХ. ПОЛЯ ДАННЫХ И МЕТОДЫ".
Задания:
Необходимо реализовать простейший класс на языке программирования Java. Не забудьте добавить метод toString() к вашему классу. Так-же в программе необходимо предусмотреть класс-тестер для тестирования класса и вывода информации об объекте.
Упражнение 1.
Реализуйте простейший класс «Cобака».
Упражнение 2.
Реализуйте простейший класс «Мяч».
Упражнение 3.
Реализуйте простейший класс «Книга».
Решение представлено в репозитории, папка "pract1".
Практическая работа 2
Тема: "ИСПОЛЬЗОВАНИЕ UML ДИАГРАММ В ОБЪЕКТНО- ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ".
Задания:
Упражнение 1.
По диаграмме класса UML описывающей сущность Автор. Необходимо написать программу, которая состоит из двух классов Author и TestAuthor. Класс Author должен содержать реализацию методов, представленных на диаграмме класса.
Упражнение 2.
По UML диаграмме класса написать программу, которая состоит из двух классов. Один из них Ball должен реализовывать сущность мяч, а другой с названием TestBall тестировать работу созданного класса. Класс Ball должен содержать реализацию методов, представленных на UML. Диаграмма на рисунке описывает сущность Мяч написать программу.
Решение представлено в репозитории, папка "pract2".
Практическая работа 3
Тема: "НАСЛЕДОВАНИЕ. АБСТРАКТНЫЕ СУПЕРКЛАССЫ И ИХ ПОДКЛАССЫ В JAVA".
Задания:
Упражнение 1.
Создайте абстрактный родительский суперкласс Shape и его дочерние классы (подклассы).
Упражнение 2.
Перепишите суперкласс Shape и его подклассы, так как это представлено на диаграмме Circle, Rectangle and Square.
Упражнение 3.
Вам нужно написать тестовый класс, чтобы самостоятельно это проверить, необходимо объяснить полученные результаты и связать их с понятием ООП - полиморфизм. Некоторые объявления могут вызвать ошибки компиляции. Объясните полученные ошибки, если таковые имеются.
Упражнение 4.
Напишите два класса MovablePoint и MovableCircle - которые реализуют интерфейс Movable.
Упражнение 5.
Напишите новый класс MovableRectangle (движущийся прямоугольник). Его можно представить как две движущиеся точки MovablePoints (представляющих верхняя левая и нижняя правая точки) и реализующие интерфейс Movable. Убедитесь, что две точки имеет одну и ту же скорость (нужен метод это проверяющий).
Решение представлено в репозитории, папка "pract3".
Практическая работа 4
Тема: "СОЗДАНИЕ GUI. СОБЫТИЙНОЕ ПРОГРАММИРОВАНИЕ В JAVA".
Задания:
- одна кнопка JButton labeled “AC Milan”
- другая JButton подписана “Real Madrid”
- надпись JLabel содержит текст “Result: 0 X 0”
- надпись JLabel содержит текст “Last Scorer: N/A”
- надпись Label содержит текст “Winner: DRAW”;
Решение представлено в репозитории, папка "pract4".
Практическая работа 5
Тема: "ПРОГРАММИРОВАНИЕ РЕКУРСИИ В JAVA".
Задания:
- Проверка числа на простоту
Дано натуральное число n>1. Проверьте, является ли оно простым. Программа должна вывести слово YES, если число простое и NO, если число составное. - Разложение на множители
Дано натуральное число n>1. Выведите все простые множители этого числа в порядке не убывания с учетом кратности. - Палиндром
Дано слово, состоящее только из строчных латинских букв. Проверьте, является ли это слово палиндромом. Выведите YES или NO.
При решении этой задачи нельзя пользоваться циклами, в решениях на питоне нельзя использовать срезы с шагом, отличным от 1. - Без двух нулей
Даны числа a и b. Определите, сколько существует последовательностей из a нулей и b единиц, в которых никакие два нуля не стоят рядом. - Разворот числа
Дано число n, десятичная запись которого не содержит нулей. Получите число, записанное теми же цифрами, но в противоположном порядке.
При решении этой задачи нельзя использовать циклы, строки, списки, массивы, разрешается только рекурсия и целочисленная арифметика.
Функция должна возвращать целое число, являющееся результатом работы программы, выводить число по одной цифре нельзя.\
Решение представлено в репозитории, папка "pract5".
Практическая работа 6
Тема: "ТЕХНИКИ СОРТИРОВКИ В JAVA".
Задания:
Упражнение 1.
Написать тестовый класс, который создает массив класса Student и сортирует массив iDNumber и сортирует его вставками.
Упражнение 2.
Напишите класс SortingStudentsByGPA который реализует интерфейс Comparator таким образом, чтобы сортировать список студентов по их итоговым баллам в порядке убывания с использованием алгоритма быстрой сортировки.
Упражнение 3.
Напишите программу, которая объединяет два списка данных о студентах в один отсортированный списках с использованием алгоритма сортировки слиянием.
Решение представлено в репозитории, папка "pract6".
Практическая работа 7
Тема: "ИСПОЛЬЗОВАНИЕ СТАНДАРТНЫХ КОНТЕЙНЕРНЫХ КЛАССОВ ПРИ ПРОГРАММИРОВАНИИ НА JAVA".
Задания:
Решение представлено в репозитории, папка "pract7".
Практическая работа 8
Тема: "СОЗДАНИЕ РАЗЛИЧНЫХ ВИДЫ СПИСКОВ ОЖИДАНИЯ".
Задания:
- Исследуйте UML диаграмму классов на рисунке 1 и понаблюдайте, как она выражает то, что мы говорили выше в словах. Убедитесь, что вы понимаете все аспекты диаграммы.
- Расширить и модифицировать исходный код WaitList, как необходимо, чтобы полностью реализовать всю схему UML. Включить комментарии Javadoc. Обратите внимание на переключение ролей после реализации каждого интерфейса / класса!
- Изучение работу метода main(), которая использует ваши новые классы и интерфейс.
Решение представлено в репозитории, папка "pract8".
Практическая работа 9
Тема: "_СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ИСКЛЮЧЕНИЙ _".
Задания:
Клиент совершает покупку онлайн. При оформлении заказа у пользователя запрашивается фио и номер ИНН. В программе проверяется, действителен ли номер ИНН для такого клиента. Исключение будет выдано в том случае, если введен недействительный ИНН. Предлагается модернизировать задачу из предыдущей лабораторной работы (см. методические указания по выполнению лабораторных работ №1-8) – задача сортировки студентов по среднему баллу. Необходимо разработать пользовательский интерфейс для задачи поиска и сортировки (использовать массив интерфейсных ссылок- пример в лекции 5). Дополнить ее поиском студента по фио – в случае отсутствия такого студента необходимо выдавать собственное исключение.
Решение представлено в репозитории, папка "pract9".
Практическая работа 11
Тема: "Задания на очереди".
Задания:
Найдите инвариант структуры данных «очередь»
Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия.
Реализуйте классы, представляющие циклическую очередь с применением массива.
Класс ArrayQueueModule должен реализовывать один экземпляр очереди с использованием переменных класса.
Класс ArrayQueueADT должен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди).
Класс ArrayQueue должен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди).
enqueue – добавить элемент в очередь;
element – первый элемент в очереди;
dequeue – удалить и вернуть первый элемент в очереди;
size – текущий размер очереди;
isEmpty – является ли очередь пустой;
clear – удалить все элементы из очереди.
Определите интерфейс очереди Queue и опишите его контракт.
Реализуйте класс LinkedQueue — очередь на связном списке.
Выделите общие части классов LinkedQueue и ArrayQueue в базовый класс AbstractQueue.
Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной.
Для тестирования программы должен быть создан класс Main, который вычисляет значение выражения x2−2x+1, для x, заданного в командной строке.
При выполнение задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для бинарных операций.
- Доработайте предыдущее задание, так что бы выражение строилось по записи вида x * (y - 2)*z + 1
Решение представлено в репозитории, папка "prac10".
Практическая работа 12
Тема: "ОБРАБОТКА СТРОК".
Задания:Объект внутреннего класса не может существовать без объекта «внешнего» класса.
Это логично: для того мы и сделали Seat и HandleBar внутренними классами, чтобы в нашей программе не появлялись то тут, то там бесхозные рули и сиденья.
Этот код не скомпилируется:
Из этого вытекает следующая важная особенность:
У объекта внутреннего класса есть доступ к переменным «внешнего» класса.
Для примера давай добавим в наш класс Bicycle переменную int seatPostDiameter — диаметр подседельного штыря.
Тогда во внутреннем классе Seat мы можем создать метод getSeatParam() , который сообщит нам параметр сиденья:
Вывод в консоль:
Обрати внимание: новая переменная объявлена с самым строгим модификатором — private . И все равно у внутреннего класса есть доступ!
Объект внутреннего класса нельзя создать в статическом методе «внешнего» класса.
Это объясняется особенностями устройства внутренних классов. У внутреннего класса могут быть конструкторы с параметрами или только конструктор по умолчанию. Но независимо от этого, когда мы создаем объект внутреннего класса, в него незаметно передается ссылка на объект «внешнего» класса. Ведь наличие такого объекта — обязательное условие. Иначе мы не сможем создавать объекты внутреннего класса.
Но если метод внешнего класса статический, значит, объект внешнего класса может вообще не существовать! А значит, логика работы внутреннего класса будет нарушена. В такой ситуации компилятор выбросит ошибку:
Внутренний класс не может содержать статические переменные и методы.
Логика здесь та же: статические методы и переменные могут существовать и вызваться даже при отсутствии объекта.
Но без объекта «внешнего» класса доступа к внутреннему классу у нас не будет.
Явное противоречие! Поэтому наличие статических переменных и методов во внутренних классах запрещено.
Компилятор выбросит ошибку при попытке их создать:
Мы легко получили доступ к внутреннему классу HandleBar из класса Main .
Если же мы объявим внутренний класс как private , доступ к созданию объектов у нас будет только внутри «внешнего» класса.
Создать объект Seat снаружи мы уже не сможем:
Наверное, ты уже понял логику :)
Модификаторы доступа для внутренних классов работают так же, как и для обычных переменных.
Модификатор protected предоставляет доступ к переменной класса в его классах-наследниках и в классах, которые находятся в том же пакете.
Так же protected работает и для внутренних классов. Объекты protected внутреннего класса можно создавать:
- внутри «внешнего» класса;
- в его классах-наследниках;
- в тех классах, которые находятся в том же пакете.
Если у внутреннего класса нет модификатора доступа ( package private ), объекты внутреннего класса можно создавать
Как вы уже слышали, Java проектировалась с рассчётом на совместимость со всем, чем только можно. Такое ограничение вынудило разработчиков Java сделать её такой, чтобы максимально упростить развёртывание приложений, при этом обеспечив логическую стройность языка.
Как происходит загрузка классов?
Для того, чтобы найти класс по имени когда вы его вызываете, в Java существует стандартный загрузчик классов. Он оперирует понятием classpath. Список classpath — это набор путей, где следует искать файлы классов. Каждый classpath может указывать как на директорию, так и на так называемый jar-файл (зазипованная директория со скомпилированными .class'ами и разрешением .jar, типа «йА java-archive!»). По умолчанию в classpath входят файлы стандартных библиотек и директория, из которой вы вызвали саму Java. Именно таким образом был найден класс HelloWorld — java нашла файл HelloWorld.class и запустила в нём метод main. Собственно, так и работают большинство программ, даже самых сложных. Всё начинается с одного main'а…
Пакеты классов
Что ж, теперь вы знаете как работает загрузчик классов. В реальных проектов количество classpath измеряется десятками, а то и сотнями.
Организация кода
Если вы пишете свои первые маленькие примерчики и вам лень создавать иерархию классов — пусть, это ваше право. Но помните, в серьёзном проекте вы всегда должны будете разложить свои классы по пакетам. Обычно корневые пакеты создаются такими, чтобы ясно давать понять кто автор кода, и к чему он относится.
Например:
ru.vasiapupkin.photomaker выбирается корневым пакетом
ru.vasiapupkin.photomaker.core сюда мы пишем классы отвечающие за логику
ru.vasiapupkin.photomaker.visual сюда, допустим, все наши окошки приложенияи так далее.
Чтобы создать класс
ru.vasiapupkin.photomaker.Starter
вы должны:
создать файл Starter.java в папке ru/vasiapupkin/photomaker/
прописать в нём первой строчкой (точнее говоря, до импортов)
package ru.vasiapupkin.photomaker;Коллижн
«А что будет, если у нас будет два класса с одним именем?», — спросите вы. «Смотрите», — отвечу я.
Допустим вы решили что вы умнее джавы и создали свой класс строки — String. Но вот проблема, у нас же уже есть такой!
Значит, вам придётся положить свой класс в пакет, скажем ru.vp.stuff и обращаться к нему так: ru.vp.stuff.String.
Именно поэтому не рекомендуется класть классы прямо в корень classpath — таким образом вы роете себе дорогу к несовместимости, ведь Java требует, чтобы каждый класс определялся однозначно. Именно поэтому нельзя написать так:
import ru.vp.SuperClass;
import ru.mashka.SuperClass;
За это вас накажет компилятор, потому что он не будет знать, какой из них использовать.
Мораль: правильно выбирайте и имя класс и имя пакета.Погоняем?
Давайте улучшим первое приложение. Эх, классика интернета… Создадим апплет.
Эх, может быть апплетами.
import java.applet.Applet ;
import java.awt.Graphics ;public class HelloWorld extends Applet
public void paint( Graphics g) g.drawString( "Hello World" ,15,15);
>>
* This source code was highlighted with Source Code Highlighter .Так, что у нас тут? Импортировано 2 класса, один из них — стандартный пустой апплет, который мы будем расширять. Второй — Graphics. Graphics — это понятие из библиотеки AWT. Кстати, небольшой экскурс. AWT (Abstract Window Toolkit) входил ещё в первую Java и был предназначен для многих задач, связанных в основном с отображением.
Так вот, объект типа Graphics позволяет нам рисовать на себе всякую муру типа строк, линий, кружочков и прочего. В данном примере мы написали строчку с отступом.
Метод paint здесь написан не от балды — он перекрывает аналогичный метод класса Applet, и когда java будет перерисовывать этот конкретный апплет, она вызовет этот метод.Посмотреть на наш апплет достаточно просто — пишем небольшой HTML:
< body >
< applet code ="HelloWorld.class" codebase ="file:///home/devgru/" width ="150" height ="30" ></ applet >
</ body >
* This source code was highlighted with Source Code Highlighter .… а может приложением.
Давайте попробуем сделать HelloWorld в standalone-приложении.
import java.awt.* ;
import javax.swing.* ;
public class HelloWorld extends JFramepublic static void main( String [] args) new HelloWorld();
>add( new JLabel( "Hello world" ));
setSize(200,200);
setVisible( true );
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
>
>* This source code was highlighted with Source Code Highlighter .
Здесь мы полностью импортируем основные классы пакетов Swing и AWT. Swing — более поздняя чем AWT библиотека, сейчас именно она обеспечивает отображение основной части графического интерфейса для Java-приложений.
Итак, в main мы просто создаём экземпляр класса HelloWorld.
Сейчас наш класс наследуется от класса JFrame. Это класс из Swing, он представляет собой окно, которое отображается пока не будет закрыто.
Блок <. >— это «общий конструктор». Он добавляется к любому конструктору нашего класса. Так как у нас нет ни одного — он добавляется к пустому конструктору без параметров, который создаётся на лету, если у класса нет ни одного.
Мы добавляем на окно новый объект типа JLabel (т.е. надпись), затем устанавливаем окну размеры и отображаем его. Последняя строчка нужна, чтобы выполнение приложения закончилось, когда будет закрыто окно. Таким образом, вы можете быть уверены что после закрытия окна у вас в памяти не останется висеть ваше приложение.
Запускать его нужно точно так же как и прошлое: пишем, компилируем, запускаем.А может и сервлетами? Наверное, потом.
Когда отпишетесь — станет ясно, куда копать дальше. Всем спасибо за внимание.
Читайте также: