• С чего начать изучение Java для web?

    jaxtr
    @jaxtr
    JavaEE/Spring-разработчик
    Я бы рекомендовал начинать изучение веб-разработки на Java c изучения Spring и ознакомления с основными компонентами Java EE. Ради интереса в дальнейшем можно более подробно ознакомиться с Java EE (ибо Spring и его компоненты сопряжены с Java EE), но за последние годы пути Java EE и Spring разошлись (особенно в плане веба). Плюс сейчас есть проект Spring Boot, который упрощает процесс погружения в Spring.

    Про Java EE скажу, что изучать есть смысл только JPA, т.к. оно активно используется в Spring Data JPA; технологии, связанные с вебом - JSP и JSF, нынче не актуальны, JSP заменяется более вменяемыми библиотеками шаблонирования вроде Thymeleaf и Freemarker, а JSF заменяется самим Spring MVC.

    Насчёт контейнеров: Tomcat (а так же Jetty и Undertow) - веб-контейнер, который поддерживает только Java EE Web Profile, в то время как Glassfish (а так же Payara, Wildfly и JBoss) поддерживает весь стек Java EE, который нужен не всегда.
    uuPbl.jpg

    Мой совет - учи Spring, а Java EE оставь на досуг.
    Ответ написан
    1 комментарий
  • Из-за чего может зависать работа с сетью в приложении на java?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    1) Тут есть теги для кода.
    2) Лучше используйте конструкцию try-with-resources
    3) До конца не уверен т.к. желательно понять как именно приведенный код используется но сильно вероятно что проблема именно с ресурсами, что то закрыл или не открыл.
    3.1) Еще не менее вероятно проблема в проксях, возможно дохлая прокси и соединение по таймауту не отшибается и тупо начинает ждать когда же он придет.
    3.2) Проверяй responseCode . Сначало делаешь conn.connect(). затем conn.getResponseCode(). Смотри что бы код ответа был правильным.
    3.3) Обязательно задай вручную таймаут conn.setConnectTimeout(милисекунд) и только после уже все манипуляции в т.ч. получение responseCode;
    Ответ написан
    Комментировать
  • Правильно ли я понимаю суть программирования?

    @jacob1237
    Формат интерпретации данных и их кодирование в памяти, а также список команд, которые способен исполнить процессор, предопределены производителем CPU и описаны в Instruction Set Architecture процессора?


    Да, все верно понимаете. Производители процессоров конечно пытаются стандартизировать свои архитектуры, но все равно остаются ньюансы как у AMD, так и у Intel (если рассматривать только ПК).

    Пример документации от Интел: https://software.intel.com/en-us/articles/intel-sdm

    В целом для ПК (именно для ПК) существуют некий стандарт x86, а также его расширение x86-64. Именно он описывает набор доступных программисту инструкций, флагов и ячеек данных (регистров).
    В рамках этого стандарта каждая инструкция имеет свой опкод.

    Т.е. после компиляции программы в машинный код (двоичную последовательность), опкоды команд будут одинаковы для всех x86-совместимых процессоров (т.е. компиляция идет не под отдельный процессор, а под архитектуру, а самих архитектур много, x86, ARM и т.д.).
    Это дает возможность запускать программы с одинаковым результатом как на процессорах Intel, так и на AMD.

    Программирование — умение кодировать алгоритмы, предназначенные для исполнения процессором, на языке, синтаксис которого, в конечном счёте - после стадий трансляции символьных масок в последовательность электрических сигналов, предназначен для понимания процессором


    Если рассматривать только сам процесс кодирования, то примерно так и есть.
    Но сейчас под термином "программирование" подразумевается нечто большее чем простой набор инструкций с клавиатуры.
    Программирование - прикладная наука. Без предметной области программирование не существует в принципе.
    И именно предметная область зачастую определяет каким будет язык и инфраструктура.

    От программиста требуется не только забить алгоритм и откомпилировать исходник, но и зачастую этот алгоритм сначала придумать/скомбинировать. Без знания предметной области этого сделать опять же не получится, либо получится, но малоэффективно.

    Вам точно не в "web-dev"..
    P.s уж слишком низко полезли. У нас же всё в абстракциях :D

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

    Это может быть потребность написать свой модуль для PHP, Python, JavaScript (Node.js), либо реализовать программный интерфейс к внешним приложениям/системам.

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

    В 90% задач конечно это не нужно (особенно где надо "натягивать верстку на движок" =D), но если хотите расти как профессионал и покрывать весь спектр возможных задач в вебе, то это, как говорится, must have.
    Ответ написан
    Комментировать
  • Стоит ли учить чистый JS?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    Услышал что 95% сайтов делаются на чистом JQ и что JS сейчас учить - трата времени.

    Забудьте эту фразу и учите JS.

    И еще лучше забудьте всё, что вы знали про jQuery.

    Просто учите JS.

    original.jpg
    Ответ написан
    3 комментария
  • Как загружать фотографии пользователей?

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

    Если по существу, то тебе надо сначала почитать, как передать файл с клиента на сервер. Чтоб что-то сохранить на сервере в какой-то папке, у тебя должны быть права доступа к этой папке. Если ты используешь Tomcat, то он по-умолчанию имеет доступ к папкам, находящимся в каталоге, указанном в переменной окружения $CATALINA_HOME.

    Там можно все настраивать как надо, но у меня другое предложение:
    Я бы на твоем месте хранил тело файла прям в БД, в отдельной таблице, тогда заморачиваться с правами не нужно, ты сразу можешь слиноковать запись о пользователе с записью о файле. Если связь один к одному или один ко многим, то можно прям в юзера положить внешний ключ на таблицу с файлами. Если связь многие ко многим, то лучше сделать отдельную линковочную таблицу. Ну что-то я увлекся то же...

    Удачи тебе, юный падаван! Да прибудет с тобой сила!
    Ответ написан
    2 комментария
  • Как сделать ЧПУ на самописном PHP?

    uDenX
    @uDenX
    PHP Developer
    Учимся пользоваться гуглом: например
    Ответ написан
    Комментировать
  • Отличия абстрактного класса от интерфейса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В чем отличие абстрактного класса от интерфейса в Java?


    Все упирается в понятие "тип". В былые времена, то есть во времена языка Simula, из которого черпали вдохновение создатели C++, были только классы. И на классах базировалась система типов. Причем механизм наследования был реализован так, как реализован, исключительно для экономии памяти, которая в те времена была очень дорогой.

    Для того чтобы достичь полиморфизма, мы должны иметь возможность объявлять абстрактные типы. Мол "любая хрень которая имеет такой тип будет работать как надо". Потому в языках типа C++ появились абстрактные классы. Поскольку иногда нам хочется делать композицию абстрактных типов, в C++ реализовали множественное наследование.

    В Java, которая во многом черпала вдохновения из C++ и smalltalk, решили ввести еще одну сущность - интерфейсы. Это был своего рода упрощенный способ задать абстрактный базовый тип. По итогу чтобы не решать проблему бриллианта (или ромба) от множественного наследования было решено отказаться и дать возможность классам имплементить несколько интерфейсов.

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

    В целом абстрактные классы нужны тогда, когда вам нужно наследование. Обычно это в ситуациях, когда у вас есть несколько классов, которые должны иметь общий абстрактный тип (то есть нельзя выделить наиболее слабого по ограничениям предка). Например если мы делаем цепочку классов String <- Email, то тут нет смысла в абстрактных классах так как тип String уже включает в себе подмножество типов Email.

    В целом в java8 уже ввели возможность интерфейсам иметь базовую реализацию, так что не удивлюсь если со временем от ключевого слова extends в принципе откажутся, избавившись от лишней сущности.

    Так же рекомендую к прочтению: www.javaworld.com/article/2073649/core-java/why-ex...
    Ответ написан
    9 комментариев
  • Что такое "call back interface"?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Для чего?

    Допустим ты пришел в мед.учреждение за справкой по какому-то там специалисту и к примеру справка будет делаться 4 часа. В конечном итоге ее можно будет забрать в регистратуре.

    У тебя две стратегии:
    1. Каждые 5 мин. подходить в регистратуру "А справка на фамилию Пупкина готова?"
    2. Оставить визитную карточку с телефоном на Пупкина и попросить позвонить, как будет готова справка.

    Какая стратегия более удобная? ;)

    Это принцип "Не звоните нам, мы сами вам позвоним".

    Так и в программировании есть некий код, который вызовут при наступлении некоторых условий(сеть доступна, файл появился, кнопку нажали, программа выключается и др.)

    Код, который вызывают это callback - "Обратный вызов". Некоторые условия - это событие.

    В примере выше callback-ом является Пупкин, а событием является "справка готова".
    Ответ написан
    Комментировать
  • Почему пишут вот так?

    @nirvimel
    Так делается для того, чтобы оставить за собой возможность впоследствии поменять реализацию не меняя интерфейс. Например, в будущем может потребоваться заменить реализацию ArrayList на LinkedList, если бы в качестве типа переменной был указан конкретный класс, то к тому времени код мог бы уже обрасти различными обращениями к, специфическим для конкретного класса, методами, выходящими за границы интерфейса List. В таком случае при замене реализации на LinkedList пришлось бы выискивать в коде и выкорчевывать оттуда все обращения к специфике ArrayList. На сколько это адски сложная задача знают все, кому приходилось работать над крупными проектами. Поэтому люди, знакомые с этой проблемой, предпочитают предупреждать подобные проблемы заранее, то есть во всех местах, где возможна смена реализации в будущем (то есть почти везде), стараются пользоваться исключительно интерфейсами, вместо того, чтобы опираться на конкретные реализации. В данном примере, если в качестве типа переменной был бы использован интерфейс List, то смена реализации ArrayList на LinkedList решалась бы заменой всего одной строки не зависимо от масштабов проекта.
    Ответ написан
    Комментировать